+static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/client/caParam.c,v 1.16 2002-05-23 01:50:27 hadaq Exp $";
#define _POSIX_C_SOURCE 199509L
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/utsname.h>
#include <cadef.h>
#include <tcl.h>
#include <allParam.h>
-#define TIMEOUT 0.2
+#define TIMEOUTEVT 0.002
+#define TIMEOUTIO 10.0
static void Param_copyStringsToAllocMem(struct event_handler_args args);
static void Param_copyIntsToAllocMem(struct event_handler_args args);
static void Param_strerror(Param *, const char *);
static int Param_getIntArrayCache(const Param *, const char *, const char *, int, int *, unsigned long int *);
static int Param_getStringArrayCache(const Param *, const char *, const char *, int, int *, char **);
-static int Param_getFilenameArrayCache(const Param *, const char *, const char *, int, int *, char **);
static int Param_storeIntCache(const Param *, const char *, const char *, unsigned long int);
static int Param_storeStringCache(const Param *, const char *, const char *, const char *);
int maxrows;
const Param *my;
int *retVal;
+ int *isReady;
} ParamStringResult;
typedef struct ParamIntResultS {
int maxrows;
const Param *my;
int *retVal;
+ int *isReady;
} ParamIntResult;
typedef struct ParamBlobResultS {
size_t *size;
const Param *my;
int *retVal;
+ int *isReady;
} ParamBlobResult;
int conSetupParam(Param *my, const char *setup)
{
+ struct utsname bufferS, *buffer = &bufferS;
int retVal = 0;
+ int row = 0;
int status = ECA_NORMAL;
#if ( _POSIX_VERSION < 199506L )
- pthread_mutexattr_t *attr;
+ int *attr;
#endif
my->strerror = NULL;
my->specParam = malloc(sizeof(CaParam));
- if(setup != NULL) {
- my->setup = malloc(strlen(setup) + 1);
- strcpy(my->setup, setup);
- } else {
- my->setup = NULL;
- }
-
#if ( _POSIX_VERSION < 199506L )
((CaParam *) (my->specParam))->cacheLock = malloc(sizeof(pthread_mutex_t));
pthread_mutexattr_create(attr);
if((status = ca_task_initialize()) != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
+ free(((CaParam *) (my->specParam))->cacheLock);
retVal = -1;
+ } else {
+ if(setup != NULL) {
+ my->setup = malloc(strlen(setup) + 1);
+ strcpy(my->setup, setup);
+ } else {
+ my->setup = NULL;
+ }
+ my->basedir = malloc(PARAM_MAX_VALUE_LEN);
+ uname(buffer);
+ if(Param_getString(my, buffer->nodename, "basedir", &row, my->basedir) || (row != 1)) {
+ strcpy(my->basedir, "");
+ } else if (strlen(my->basedir)) {
+ strcat(my->basedir, "/");
+ }
}
return retVal;
Tcl_DeleteInterp(((CaParam *) (my->specParam))->cache);
pthread_mutex_destroy(((CaParam *) (my->specParam))->cacheLock);
free(((CaParam *) (my->specParam))->cacheLock);
+ free(my->basedir);
if(my->setup != NULL) {
free(my->setup);
}
int Param_getIntArray(const Param *my, const char *name, const char *idx, int maxrows, int *rows, unsigned long int *val)
{
+ int isReadyS, *isReady = &isReadyS;
int retVal = 0;
int status;
int found = 1;
retVal = -1;
} else {
- if((status = ca_pend_io(TIMEOUT)) != ECA_NORMAL) {
+ if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
found = 0;
retVal = 0;
result->maxrows = maxrows;
result->my = my;
result->retVal = &retVal;
+ result->isReady = isReady;
+ *isReady = 1;
status = ca_array_get_callback(ca_field_type(chan), ca_element_count(chan), chan, Param_copyIntsToAllocMem, result);
Param_strerror((Param *) my, ca_message(status));
-
- if((status = ca_pend_event(TIMEOUT)) != ECA_NORMAL) {
- Param_strerror((Param *) my, ca_message(status));
- }
+ do {
+ status = ca_pend_event(TIMEOUTEVT);
+ } while(*isReady == 1);
}
}
int Param_getStringArray(const Param *my, const char *name, const char *idx, int maxrows, int *rows, char **val)
{
+ int isReadyS, *isReady = &isReadyS;
int retVal = 0;
int status;
int found = 1;
retVal = -1;
} else {
- if((status = ca_pend_io(TIMEOUT)) != ECA_NORMAL) {
+ if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
found = 0;
retVal = 0;
result->maxrows = maxrows;
result->my = my;
result->retVal = &retVal;
+ result->isReady = isReady;
+ *isReady = 1;
status = ca_array_get_callback(ca_field_type(chan), ca_element_count(chan), chan, Param_copyStringsToAllocMem, result);
Param_strerror((Param *) my, ca_message(status));
- if((status = ca_pend_event(TIMEOUT)) != ECA_NORMAL) {
- Param_strerror((Param *) my, ca_message(status));
- }
+ do {
+ status = ca_pend_event(TIMEOUTEVT);
+ } while(*isReady == 1);
}
if((status = ca_clear_channel(chan)) != ECA_NORMAL) {
int Param_getFilenameArray(const Param *my, const char *name, const char *idx, int maxrows, int *rows, char **val)
{
+ int isReadyS, *isReady = &isReadyS;
int retVal = 0;
int status;
int found = 1;
chid chan;
char *pPVName;
int i;
+ char *prefixVal[PARAM_MAX_ARRAY_LEN];
char buf[PARAM_MAX_NAME_LEN];
-
*rows = 0;
- if(Param_getFilenameArrayCache(my, name, idx, maxrows, rows, val) || (*rows != maxrows)) {
+
+ if(Param_getStringArrayCache(my, name, idx, maxrows, rows, val) || (*rows != maxrows)) {
pPVName = malloc((strlen("HAD:PF:") + (my->setup == NULL ? 0 : strlen(my->setup) + 1) + strlen(name) + 1 + strlen(idx) + 1) * sizeof(char));
Param_returnPVName(my, "PF", name, idx, pPVName);
retVal = -1;
} else {
- if((status = ca_pend_io(TIMEOUT)) != ECA_NORMAL) {
+ if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
found = 0;
retVal = 0;
result->maxrows = maxrows;
result->my = my;
result->retVal = &retVal;
+ result->isReady = isReady;
+ *isReady = 1;
+
+ for (i = 0 ; i < maxrows ; i++) {
+ prefixVal[i] = malloc(PARAM_MAX_VALUE_LEN);
+ }
+ result->val = prefixVal;
status = ca_array_get_callback(ca_field_type(chan), ca_element_count(chan), chan, Param_copyStringsToAllocMem, result);
Param_strerror((Param *) my, ca_message(status));
- if((status = ca_pend_event(TIMEOUT)) != ECA_NORMAL) {
- Param_strerror((Param *) my, ca_message(status));
+ do {
+ status = ca_pend_event(TIMEOUTEVT);
+ } while(*isReady == 1);
+
+ for (i = 0 ; i < *rows ; i++) {
+ if (*prefixVal[i] == '/') {
+ strcpy(val[i], prefixVal[i]);
+ } else {
+ strcpy(val[i], my->basedir);
+ strcat(val[i], prefixVal[i]);
+ }
+ }
+ for (i = 0 ; i < maxrows ; i++) {
+ free(prefixVal[i]);
}
}
}
int Param_getBlob(const Param *my, const char *name, const char *idx, size_t *size, FILE **val)
{
+ int isReadyS, *isReady = &isReadyS;
int retVal = 0;
int status;
int found = 1;
retVal = -1;
} else {
- if((status = ca_pend_io(TIMEOUT)) != ECA_NORMAL) {
+ if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
found = 0;
retVal = 0;
result->size = size;
result->my = my;
result->retVal = &retVal;
+ result->isReady = isReady;
+ *isReady = 1;
status = ca_array_get_callback(ca_field_type(chan), ca_element_count(chan), chan, Param_copyBlobToAllocMem, result);
Param_strerror((Param *) my, ca_message(status));
- if((status = ca_pend_event(TIMEOUT)) != ECA_NORMAL) {
- Param_strerror((Param *) my, ca_message(status));
- }
+ do {
+ status = ca_pend_event(TIMEOUTEVT);
+ } while(*isReady == 1);
}
}
retVal = -1;
} else {
- if((status = ca_pend_io(TIMEOUT)) != ECA_NORMAL) {
+ if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
found = 0;
retVal = 0;
status = ca_put(DBR_LONG, chan, &value);
Param_strerror((Param *) my, ca_message(status));
- if((status = ca_pend_event(TIMEOUT)) != ECA_NORMAL) {
+ if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
}
}
retVal = -1;
} else {
- if((status = ca_pend_io(TIMEOUT)) != ECA_NORMAL) {
+ if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
found = 0;
retVal = 0;
status = ca_put(DBR_STRING, chan, value);
Param_strerror((Param *) my, ca_message(status));
- if((status = ca_pend_event(TIMEOUT)) != ECA_NORMAL) {
+ if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
}
}
Param_strerror((Param *) result->my, ca_message(args.status));
*(result->rows) = 0;
}
+ *(result->isReady) = 0;
}
static void Param_copyIntsToAllocMem(struct event_handler_args args)
*(result->rows) = 0;
}
}
+ *(result->isReady) = 0;
}
static void Param_copyBlobToAllocMem(struct event_handler_args args)
Param_strerror((Param *) result->my, ca_message(args.status));
*(result->size) = 0;
}
+ *(result->isReady) = 0;
}
static void Param_returnPVName(const Param *my, const char *type, const char *name, const char *idx, char *pPVName)
return retVal;
}
-static int Param_getFilenameArrayCache(const Param *my, const char *name, const char *idx, int maxrows, int *rows, char **val)
-{
- int retVal = 0;
- int row = 0;
- int i;
- char *value[PARAM_MAX_ARRAY_LEN];
-
- for (i = 0 ; i < maxrows ; i++) {
- value[i] = malloc(PARAM_MAX_VALUE_LEN);
- }
-
- if (((retVal = Param_getStringArrayCache(my, name, idx, maxrows, rows, value)) == 0) && (*rows > 0)) {
- char basedir[PARAM_MAX_VALUE_LEN];
-
- if ((Param_getStringCache(my, "glob", "basedir", &row, basedir) == 0) && (row == 1)) {
- strcat(basedir, "/");
- } else {
- strcpy(basedir, "");
- }
- for (i = 0 ; i < *rows ; i++) {
- if (value[i][0] != '/') {
- strcpy(val[i], basedir);
- } else {
- strcpy(val[i], "");
- }
- strcat(val[i], value[i]);
- }
- } else {
- *rows = 0;
- }
-
- for (i = 0 ; i < maxrows ; i++) {
- free(value[i]);
- }
-
- return retVal;
-}
-
static int Param_storeIntCache(const Param *my, const char *name, const char *idx, unsigned long int value)
{
char buf[7 + 2 * PARAM_MAX_NAME_LEN + PARAM_MAX_VALUE_LEN];