-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 $";
+static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/client/caParam.c,v 1.17 2002-05-27 13:29:52 hadaq Exp $";
#define _POSIX_C_SOURCE 199509L
#include <unistd.h>
#include <allParam.h>
-#define TIMEOUTEVT 0.002
+#define TIMEOUTEVT 0.0002
+#define TIMEOUTSG 10.0
#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_copyBlobToAllocMem(struct event_handler_args args);
+static void Param_confirmStore(struct event_handler_args args);
static void Param_returnPVName(const Param *my, const char *, const char *, const char *, char *);
static void Param_strerror(Param *, const char *);
static int Param_getIntArrayCache(const Param *, const char *, const char *, int, int *, unsigned long int *);
int *isReady;
} ParamBlobResult;
+typedef struct ParamConfirmStoreStructS {
+ int *isReady;
+} ParamConfirmStoreStruct;
+
int conSetupParam(Param *my, const char *setup)
{
struct utsname bufferS, *buffer = &bufferS;
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 isReady;
int retVal = 0;
int status;
int found = 1;
*rows = 0;
if(Param_getIntArrayCache(my, name, idx, maxrows, rows, val) || (*rows != maxrows)) {
+#ifdef SYNCHRONOUS_GROUP
+ CA_SYNC_GID pgid;
+#endif
pPVName = malloc((strlen("HAD:PI:") + (my->setup == NULL ? 0 : strlen(my->setup) + 1) + strlen(name) + 1 + strlen(idx) + 1) * sizeof(char));
Param_returnPVName(my, "PI", name, idx, pPVName);
Param_strerror((Param *) my, ca_message(status));
retVal = -1;
} else {
-
- if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
+#ifdef SYNCHRONOUS_GROUP
+ ca_sg_create(&pgid);
+#endif
+ do {
+ status = ca_pend_io(TIMEOUTIO);
+ } while ((ca_state(chan) != cs_conn) && (status != ECA_TIMEOUT));
+ if(status != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
found = 0;
retVal = 0;
}
if(found == 1) {
+#ifndef SYNCHRONOUS_GROUP
ParamIntResult resultS, *result = &resultS;
result->val = val;
result->rows = rows;
result->maxrows = maxrows;
result->my = my;
result->retVal = &retVal;
- result->isReady = isReady;
- *isReady = 1;
+ result->isReady = &isReady;
+ isReady = 1;
status = ca_array_get_callback(ca_field_type(chan), ca_element_count(chan), chan, Param_copyIntsToAllocMem, result);
+#else
+ status = ca_sg_array_get(pgid, ca_field_type(chan), ca_element_count(chan), chan, val);
+#endif
Param_strerror((Param *) my, ca_message(status));
+#ifndef SYNCHRONOUS_GROUP
do {
- status = ca_pend_event(TIMEOUTEVT);
- } while(*isReady == 1);
+ ca_pend_event(TIMEOUTEVT);
+ } while(isReady == 1);
+#else
+ if((status = ca_sg_block(pgid, TIMEOUTSG)) == ECA_TIMEOUT) {
+ retVal = 0;
+ *rows = 0;
+ } else if (status == ECA_NORMAL) {
+ retVal = 0;
+ *rows = maxrows > ca_element_count(chan) ? ca_element_count(chan) : maxrows;
+ } else {
+ retVal = -1;
+ *rows = 0;
+ }
+ ca_sg_delete(pgid);
+#endif
+ }
+ if((status = ca_clear_channel(chan)) != ECA_NORMAL) {
+ Param_strerror((Param *) my, ca_message(status));
}
- }
-
- if((status = ca_clear_channel(chan)) != ECA_NORMAL) {
- Param_strerror((Param *) my, ca_message(status));
}
free(pPVName);
int Param_getStringArray(const Param *my, const char *name, const char *idx, int maxrows, int *rows, char **val)
{
- int isReadyS, *isReady = &isReadyS;
+ int isReady;
int retVal = 0;
int status;
int found = 1;
*rows = 0;
if(Param_getStringArrayCache(my, name, idx, maxrows, rows, val) || (*rows != maxrows)) {
+#ifdef SYNCHRONOUS_GROUP
+ CA_SYNC_GID pgid;
+#endif
pPVName = malloc((strlen("HAD:PS:") + (my->setup == NULL ? 0 : strlen(my->setup) + 1) + strlen(name) + 1 + strlen(idx) + 1) * sizeof(char));
Param_returnPVName(my, "PS", name, idx, pPVName);
Param_strerror((Param *) my, ca_message(status));
retVal = -1;
} else {
-
- if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
+#ifdef SYNCHRONOUS_GROUP
+ ca_sg_create(&pgid);
+#endif
+ do {
+ status = ca_pend_io(TIMEOUTIO);
+ } while ((ca_state(chan) != cs_conn) && (status != ECA_TIMEOUT));
+ if(status != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
found = 0;
retVal = 0;
}
if(found == 1) {
+#ifndef SYNCHRONOUS_GROUP
ParamStringResult resultS, *result = &resultS;
result->val = val;
result->rows = rows;
result->maxrows = maxrows;
result->my = my;
result->retVal = &retVal;
- result->isReady = isReady;
- *isReady = 1;
+ result->isReady = &isReady;
+ isReady = 1;
status = ca_array_get_callback(ca_field_type(chan), ca_element_count(chan), chan, Param_copyStringsToAllocMem, result);
+#else
+ status = ca_sg_array_get(pgid, ca_field_type(chan), ca_element_count(chan), chan, val);
+#endif
Param_strerror((Param *) my, ca_message(status));
-
+#ifndef SYNCHRONOUS_GROUP
do {
- status = ca_pend_event(TIMEOUTEVT);
- } while(*isReady == 1);
+ ca_pend_event(TIMEOUTEVT);
+ } while(isReady == 1);
+#else
+ if((status = ca_sg_block(pgid, TIMEOUTSG)) == ECA_TIMEOUT) {
+ retVal = 0;
+ *rows = 0;
+ } else if (status == ECA_NORMAL) {
+ retVal = 0;
+ *rows = maxrows > ca_element_count(chan) ? ca_element_count(chan) : maxrows;
+ } else {
+ retVal = -1;
+ *rows = 0;
+ }
+ ca_sg_delete(pgid);
+#endif
}
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 isReady;
int retVal = 0;
int status;
int found = 1;
*rows = 0;
if(Param_getStringArrayCache(my, name, idx, maxrows, rows, val) || (*rows != maxrows)) {
+#ifdef SYNCHRONOUS_GROUP
+ CA_SYNC_GID pgid;
+#endif
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);
Param_strerror((Param *) my, ca_message(status));
retVal = -1;
} else {
-
- if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
+#ifdef SYNCHRONOUS_GROUP
+ ca_sg_create(&pgid);
+#endif
+ do {
+ status = ca_pend_io(TIMEOUTIO);
+ } while ((ca_state(chan) != cs_conn) && (status != ECA_TIMEOUT));
+ if(status != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
found = 0;
retVal = 0;
}
if(found == 1) {
+#ifndef SYNCHRONOUS_GROUP
ParamStringResult resultS, *result = &resultS;
- result->val = val;
+ result->val = prefixVal;
result->rows = rows;
result->maxrows = maxrows;
result->my = my;
result->retVal = &retVal;
- result->isReady = isReady;
- *isReady = 1;
+ 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);
+#else
+ status = ca_sg_array_get(pgid, ca_field_type(chan), ca_element_count(chan), chan, prefixVal);
+#endif
Param_strerror((Param *) my, ca_message(status));
-
+#ifndef SYNCHRONOUS_GROUP
do {
- status = ca_pend_event(TIMEOUTEVT);
- } while(*isReady == 1);
+ ca_pend_event(TIMEOUTEVT);
+ } while(isReady == 1);
+#else
+ if((status = ca_sg_block(pgid, TIMEOUTSG)) == ECA_TIMEOUT) {
+ retVal = 0;
+ *rows = 0;
+ } else if (status == ECA_NORMAL) {
+ retVal = 0;
+ *rows = maxrows > ca_element_count(chan) ? ca_element_count(chan) : maxrows;
+ } else {
+ retVal = -1;
+ *rows = 0;
+ }
+ ca_sg_delete(pgid);
+#endif
for (i = 0 ; i < *rows ; i++) {
if (*prefixVal[i] == '/') {
free(prefixVal[i]);
}
}
- }
-
- if((status = ca_clear_channel(chan)) != ECA_NORMAL) {
- Param_strerror((Param *) my, ca_message(status));
+ if((status = ca_clear_channel(chan)) != ECA_NORMAL) {
+ Param_strerror((Param *) my, ca_message(status));
+ }
}
free(pPVName);
int Param_getBlob(const Param *my, const char *name, const char *idx, size_t *size, FILE **val)
{
- int isReadyS, *isReady = &isReadyS;
+#ifdef SYNCHRONOUS_GROUP
+ CA_SYNC_GID pgid;
+#endif
+ int isReady;
int retVal = 0;
int status;
int found = 1;
Param_strerror((Param *) my, ca_message(status));
retVal = -1;
} else {
-
- if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
+#ifdef SYNCHRONOUS_GROUP
+ ca_sg_create(&pgid);
+#endif
+ do {
+ status = ca_pend_io(TIMEOUTIO);
+ } while ((ca_state(chan) != cs_conn) && (status != ECA_TIMEOUT));
+ if(status != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
found = 0;
retVal = 0;
}
if(found == 1) {
+#ifndef SYNCHRONOUS_GROUP
ParamBlobResult resultS, *result = &resultS;
result->val = val;
result->size = size;
result->my = my;
result->retVal = &retVal;
- result->isReady = isReady;
- *isReady = 1;
+ result->isReady = &isReady;
+ isReady = 1;
status = ca_array_get_callback(ca_field_type(chan), ca_element_count(chan), chan, Param_copyBlobToAllocMem, result);
+#else
+ status = ca_sg_array_get(pgid, ca_field_type(chan), ca_element_count(chan), chan, val);
+#endif
+ Param_strerror((Param *) my, ca_message(status));
+#ifndef SYNCHRONOUS_GROUP
+ do {
+ ca_pend_event(TIMEOUTEVT);
+ } while(isReady == 1);
+#else
+ if((status = ca_sg_block(pgid, TIMEOUTSG)) == ECA_TIMEOUT) {
+ retVal = 0;
+ *size = 0;
+ } else if (status == ECA_NORMAL) {
+ retVal = 0;
+ *size = ca_element_count(chan) * sizeof(DBR_LONG);
+ } else {
+ retVal = -1;
+ *size = 0;
+ }
+ ca_sg_delete(pgid);
+#endif
+ }
+ if((status = ca_clear_channel(chan)) != 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) {
- Param_strerror((Param *) my, ca_message(status));
}
free(pPVName);
int Param_storeInt(const Param *my, const char *name, const char *idx, unsigned long int value)
{
+#ifdef SYNCHRONOUS_GROUP
+ CA_SYNC_GID pgid;
+#endif
int retVal = 0;
int status;
int found = 1;
Param_strerror((Param *) my, ca_message(status));
retVal = -1;
} else {
-
- if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
+#ifdef SYNCHRONOUS_GROUP
+ ca_sg_create(&pgid);
+#endif
+ do {
+ status = ca_pend_io(TIMEOUTIO);
+ } while ((ca_state(chan) != cs_conn) && (status != ECA_TIMEOUT));
+ if(status != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
found = 0;
retVal = 0;
}
if(found == 1) {
- status = ca_put(DBR_LONG, chan, &value);
+#ifndef SYNCHRONOUS_GROUP
+ ParamConfirmStoreStruct confirmS, *confirm = &confirmS;
+ int isReady = 1;
+ confirm->isReady = &isReady;
+
+ status = ca_array_put_callback(DBR_LONG, 1, chan, &value, Param_confirmStore, confirm);
+#else
+ status = ca_sg_array_put(pgid, DBR_LONG, 1, chan, &value);
+#endif
Param_strerror((Param *) my, ca_message(status));
-
- if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
- Param_strerror((Param *) my, ca_message(status));
+#ifndef SYNCHRONOUS_GROUP
+ do {
+ ca_pend_event(TIMEOUTEVT);
+ } while(isReady == 1);
+#else
+ if((status = ca_sg_block(pgid, TIMEOUTSG)) == ECA_NORMAL) {
+ retVal = 0;
+ } else {
+ retVal = -1;
}
+ ca_sg_delete(pgid);
+#endif
}
if((status = ca_clear_channel(chan)) != ECA_NORMAL) {
int Param_storeString(const Param *my, const char *name, const char *idx, const char *value)
{
+#ifdef SYNCHRONOUS_GROUP
+ CA_SYNC_GID pgid;
+#endif
int retVal = 0;
int status;
int found = 1;
Param_strerror((Param *) my, ca_message(status));
retVal = -1;
} else {
-
- if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
+#ifdef SYNCHRONOUS_GROUP
+ ca_sg_create(&pgid);
+#endif
+ do {
+ status = ca_pend_io(TIMEOUTIO);
+ } while ((ca_state(chan) != cs_conn) && (status != ECA_TIMEOUT));
+ if(status != ECA_NORMAL) {
Param_strerror((Param *) my, ca_message(status));
found = 0;
retVal = 0;
}
if(found == 1) {
- status = ca_put(DBR_STRING, chan, value);
- Param_strerror((Param *) my, ca_message(status));
+#ifndef SYNCHRONOUS_GROUP
+ ParamConfirmStoreStruct confirmS, *confirm = &confirmS;
+ int isReady = 1;
+ confirm->isReady = &isReady;
- if((status = ca_pend_io(TIMEOUTIO)) != ECA_NORMAL) {
- Param_strerror((Param *) my, ca_message(status));
+ status = ca_array_put_callback(DBR_STRING, 1, chan, value, Param_confirmStore, confirm);
+#else
+ status = ca_sg_array_put(pgid, DBR_STRING, 1, chan, &value);
+#endif
+ Param_strerror((Param *) my, ca_message(status));
+#ifndef SYNCHRONOUS_GROUP
+ do {
+ ca_pend_event(TIMEOUTEVT);
+ } while(isReady == 1);
+#else
+ if((status = ca_sg_block(pgid, TIMEOUTSG)) == ECA_NORMAL) {
+ retVal = 0;
+ } else {
+ retVal = -1;
}
+ ca_sg_delete(pgid);
+#endif
}
if((status = ca_clear_channel(chan)) != ECA_NORMAL) {
*(result->isReady) = 0;
}
+static void Param_confirmStore(struct event_handler_args args)
+{
+ ParamConfirmStoreStruct *result = args.usr;
+ *(result->isReady) = 0;
+}
+
static void Param_returnPVName(const Param *my, const char *type, const char *name, const char *idx, char *pPVName)
{
int i;
+static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/tcl/tclParam.c,v 1.21 2002-05-27 13:29:52 hadaq Exp $";
#define _POSIX_C_SOURCE 199509L
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
+#include <sys/utsname.h>
#include <tcl.h>
char *paramFile;
char *storageFile;
int code;
+ int row = 0;
+ struct utsname bufferS, *buffer = &bufferS;
my->strerror = NULL;
my->specParam = malloc(sizeof(TclParam));
} else {
my->setup = NULL;
}
-
paramFile = malloc(((my->setup == NULL) ? strlen("default") : strlen(setup)) + strlen("_p.tcl") + 1);
storageFile = malloc(((my->setup == NULL) ? strlen("default") : strlen(setup)) + strlen("_s.tcl") + 1);
sprintf(paramFile, "%s_p.tcl", (my->setup == NULL) ? "default" : setup);
retVal = -1;
}
+ if(retVal == 0) {
+ 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, "/");
+ }
+ }
+
free(paramFile);
free(storageFile);
char *paramFile;
char *storageFile;
int code;
+ int row = 0;
+ struct utsname bufferS, *buffer = &bufferS;
my->strerror = NULL;
my->setup = NULL;
return -1;
}
+ if(retVal == 0) {
+ 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;
}
fclose(((TclParam *) (my->specParam))->store);
free((TclParam *) (my->specParam));
+ free(my->basedir);
if(my->setup != NULL) {
free(my->setup);
}
if (((retVal = Param_getString(my, name, idx, &rows, value)) == 0) && (rows == 1)) {
if (value[0] == '/') {
strcpy(val, value);
- *row = 1;
} else {
- if ((Param_getString(my, "glob", "basedir", &rows, val) == 0) && (rows == 1)) {
- strcat(val, "/");
- strcat(val, value);
- *row = 1;
- } else {
- strcpy(val, value);
- *row = 1;
- }
+ strcpy(val, my->basedir);
+ strcat(val, value);
}
+ *row = 1;
} else {
*row = 0;
}
int Param_getFilenameArray(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];
}
if (((retVal = Param_getStringArray(my, name, idx, maxrows, rows, value)) == 0) && (*rows > 0)) {
- char basedir[PARAM_MAX_VALUE_LEN];
-
- if ((Param_getString(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);
+ strcpy(val[i], my->basedir);
+ strcat(val[i], value[i]);
} else {
- strcpy(val[i], "");
+ strcpy(val[i], value[i]);
}
- strcat(val[i], value[i]);
}
} else {
*rows = 0;