]> jspc29.x-matter.uni-frankfurt.de Git - daqdata.git/commitdiff
*** empty log message ***
authorhadaq <hadaq>
Mon, 20 May 2002 14:35:03 +0000 (14:35 +0000)
committerhadaq <hadaq>
Mon, 20 May 2002 14:35:03 +0000 (14:35 +0000)
allParam/ca/client/caParam.c

index f615d8486dfa8514a1d38d2359ddc32ec48ab894..8d33c8526a9f0217d4bc66e0304db5659e42156f 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <ctype.h>
 #include <errno.h>
+#include <pthread.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -28,6 +29,7 @@ static int Param_storeStringCache(const Param *, const char *, const char *, con
 
 typedef struct CaParamS {
        Tcl_Interp *cache;
+       pthread_mutex_t *cacheLock;
 } CaParam;
 
 typedef struct ParamStringResultS {
@@ -55,6 +57,18 @@ typedef struct ParamBlobResultS {
 
 int conSetupParam(Param *my, const char *setup)
 {
+#if ( _POSIX_VERSION < 199506L )
+       pthread_mutexattr_t *attr;
+       ((CaParam *) (my->specParam))->cacheLock = malloc(sizeof(pthread_mutex_t));
+       pthread_mutexattr_create(attr);
+       pthread_mutex_init(((CaParam *) (my->specParam))->cacheLock, *attr);
+       pthread_mutexattr_delete(attr);
+#else
+       ((CaParam *) (my->specParam))->cacheLock = malloc(sizeof(pthread_mutex_t));
+       pthread_mutex_init(((CaParam *) (my->specParam))->cacheLock, NULL);
+#endif
+       ((CaParam *) (my->specParam))->cache = Tcl_CreateInterp();
+
        my->strerror = NULL;
        my->specParam = malloc(sizeof(CaParam));
 
@@ -64,7 +78,6 @@ int conSetupParam(Param *my, const char *setup)
        } else {
                my->setup = NULL;
        }
-       ((CaParam *) (my->specParam))->cache = Tcl_CreateInterp();
 
        return 0;
 }
@@ -77,6 +90,8 @@ int conParam(Param *my)
 void desParam(Param *my)
 {
        Tcl_DeleteInterp(((CaParam *) (my->specParam))->cache);
+       pthread_mutex_destroy(((CaParam *) (my->specParam))->cacheLock);
+       free(((CaParam *) (my->specParam))->cacheLock);
        if(my->setup != NULL) {
                free(my->setup);
        }
@@ -489,8 +504,11 @@ int Param_storeString(const Param *my, const char *name, const char *idx, const
 
 void Param_clearCache(const Param *my)
 {
-       Tcl_DeleteInterp(((CaParam *) (my->specParam))->cache);
-       ((CaParam *) (my->specParam))->cache = Tcl_CreateInterp();
+       if (0 == pthread_mutex_lock(((CaParam *) (my->specParam))->cacheLock)) {
+               Tcl_DeleteInterp(((CaParam *) (my->specParam))->cache);
+               ((CaParam *) (my->specParam))->cache = Tcl_CreateInterp();
+                pthread_mutex_unlock(((CaParam *) (my->specParam))->cacheLock);
+       }
 }
 
 const char *Param_getErrStr(const Param *my)
@@ -616,28 +634,33 @@ static int Param_getStringArrayCache(const Param *my, const char *name, const ch
        char lname[PARAM_MAX_NAME_LEN];
        char lidx[PARAM_MAX_NAME_LEN];
 
-       for(i = 0 ; i <=strlen(name) ; i++) {
-               lname[i] = tolower(name[i]);
-       }
-       for(i = 0 ; i <=strlen(idx) ; i++) {
-               lidx[i] = tolower(idx[i]);
-       }
+       if (0 == pthread_mutex_lock(((CaParam *) (my->specParam))->cacheLock)) {
+               for(i = 0 ; i <=strlen(name) ; i++) {
+                       lname[i] = tolower(name[i]);
+               }
+               for(i = 0 ; i <=strlen(idx) ; i++) {
+                       lidx[i] = tolower(idx[i]);
+               }
 
-       *rows = 0;
-       if(Tcl_GetVar2(((CaParam *) (my->specParam))->cache, lname, lidx, 0) != 0) {
-               strcpy(val[0], Tcl_GetVar2(((CaParam *) (my->specParam))->cache, lname, lidx, 0));
-               *rows = 1;
-       } else {
-               char index[PARAM_MAX_NAME_LEN];
-               for (i = 0 ; i < maxrows ; i++) {
-                       sprintf(index,"%s%d", lidx, i);
-                       if(Tcl_GetVar2(((CaParam *) (my->specParam))->cache, lname, index, 0) != 0) {
-                               strcpy(val[i], Tcl_GetVar2(((CaParam *) (my->specParam))->cache, lname, index, 0));
-                               (*rows)++;
-                       } else {
-                               i = maxrows;
+               *rows = 0;
+               if(Tcl_GetVar2(((CaParam *) (my->specParam))->cache, lname, lidx, 0) != 0) {
+                       strcpy(val[0], Tcl_GetVar2(((CaParam *) (my->specParam))->cache, lname, lidx, 0));
+                       *rows = 1;
+               } else {
+                       char index[PARAM_MAX_NAME_LEN];
+                       for (i = 0 ; i < maxrows ; i++) {
+                               sprintf(index,"%s%d", lidx, i);
+                               if(Tcl_GetVar2(((CaParam *) (my->specParam))->cache, lname, index, 0) != 0) {
+                                       strcpy(val[i], Tcl_GetVar2(((CaParam *) (my->specParam))->cache, lname, index, 0));
+                                       (*rows)++;
+                               } else {
+                                       i = maxrows;
+                               }
                        }
                }
+               pthread_mutex_unlock(((CaParam *) (my->specParam))->cacheLock);
+       } else {
+               retVal = -1;
        }
        return retVal;
 }
@@ -684,7 +707,10 @@ static int Param_storeIntCache(const Param *my, const char *name, const char *id
 {
        char buf[7 + 2 * PARAM_MAX_NAME_LEN + PARAM_MAX_VALUE_LEN];
        sprintf(buf, "set %s(%s)\t%lu\n", name, idx, value);
-       Tcl_Eval(((CaParam *) (my->specParam))->cache, buf);
+       if (0 == pthread_mutex_lock(((CaParam *) (my->specParam))->cacheLock)) {
+               Tcl_Eval(((CaParam *) (my->specParam))->cache, buf);
+               pthread_mutex_unlock(((CaParam *) (my->specParam))->cacheLock);
+       }
        return 0;
 }
 
@@ -692,7 +718,10 @@ static int Param_storeStringCache(const Param *my, const char *name, const char
 {
        char buf[7 + 2 * PARAM_MAX_NAME_LEN + PARAM_MAX_VALUE_LEN];
        sprintf(buf, "set %s(%s)\t\"%s\"\n", name, idx, value);
-       Tcl_Eval(((CaParam *) (my->specParam))->cache, buf);
+       if (0 == pthread_mutex_lock(((CaParam *) (my->specParam))->cacheLock)) {
+               Tcl_Eval(((CaParam *) (my->specParam))->cache, buf);
+               pthread_mutex_unlock(((CaParam *) (my->specParam))->cacheLock);
+       }
        return 0;
 }