From b98d92429817da9d1a8e96864045620a3cee29f0 Mon Sep 17 00:00:00 2001 From: hadaq Date: Mon, 20 May 2002 14:35:03 +0000 Subject: [PATCH] *** empty log message *** --- allParam/ca/client/caParam.c | 77 +++++++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 24 deletions(-) diff --git a/allParam/ca/client/caParam.c b/allParam/ca/client/caParam.c index f615d84..8d33c85 100644 --- a/allParam/ca/client/caParam.c +++ b/allParam/ca/client/caParam.c @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -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; } -- 2.43.0