#include <ctype.h>
#include <errno.h>
+#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct CaParamS {
Tcl_Interp *cache;
+ pthread_mutex_t *cacheLock;
} CaParam;
typedef struct ParamStringResultS {
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));
} else {
my->setup = NULL;
}
- ((CaParam *) (my->specParam))->cache = Tcl_CreateInterp();
return 0;
}
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);
}
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)
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;
}
{
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;
}
{
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;
}