# Objects
-OBJS = record.o paramRecord.o paramIntRecord.o paramStringRecord.o \
+OBJS = record.o paramRecord.o arrayDest.o paramIntRecord.o paramStringRecord.o \
paramFilenameRecord.o paramBlobRecord.o paramRecordSet.o paramServer.o
###########
paramRecord.h record.h
record.o : record.cc record.h
+arrayDest.o : arrayDest.cc arrayDest.h
paramRecord.o: paramRecord.cc paramRecord.h record.h
paramIntRecord.o: paramIntRecord.cc paramIntRecord.h paramRecord.h record.h
paramStringRecord.o: paramStringRecord.cc paramStringRecord.h paramRecord.h \
--- /dev/null
+#define _POSIX_C_SOURCE 199509L
+
+#include <aitTypes.h>
+
+#include "arrayDest.h"
+
+void ArrayDestructor::run(void *todelete) {
+ aitUint32 *pd = (aitUint32 *) todelete;
+ delete [] pd;
+}
+
+void ArrayIntDestructor::run(void *todelete) {
+ aitUint32 *pd = (aitUint32 *) todelete;
+ delete [] pd;
+}
+
+void ArrayStringDestructor::run(void *todelete) {
+ aitString *pd = (aitString *) todelete;
+ delete [] pd;
+}
+
--- /dev/null
+#ifndef ARRAYDEST_H
+#define ARRAYDEST_H
+
+#include <gdd.h>
+
+class ArrayDestructor : public gddDestructor {
+ virtual void run(void *);
+};
+
+class ArrayIntDestructor : public ArrayDestructor {
+ virtual void run(void *);
+};
+
+class ArrayStringDestructor : public ArrayDestructor {
+ virtual void run(void *);
+};
+
+#endif
+
{
size_t size;
FILE *tmp;
+
+ pDest = new ArrayIntDestructor;
+
if(Param_getBlob(param, name, idx, &size, &tmp) == 0) {
index = (unsigned int) ((size - 1) / sizeof(aitUint32)) + 2;
if (index > EPICS_MAX_INDEX) {
FILE *blob;
size_t size;
int retVal;
- ArrayDestructor *pDest = new ArrayDestructor;
caServer *pCAS = this->getCAS();
this->postEvent (select, *val);
}
- delete pDest;
-
return S_cas_success;
}
int rows;
char *tmp[PARAM_MAX_ARRAY_LEN];
+ pDest = new ArrayStringDestructor;
+
for (int i = 0 ; i < PARAM_MAX_ARRAY_LEN ; i++) {
tmp[i] = new char[PARAM_MAX_VALUE_LEN];
}
caServer *pCAS = this->getCAS();
int pretVal;
int rows;
- ArrayDestructor *pDest = new ArrayDestructor;
for (int i = 0 ; i < PARAM_MAX_ARRAY_LEN ; i++) {
ourValue[i] = new char[PARAM_MAX_VALUE_LEN];
this->postEvent (select, *val);
}
- delete pDest;
-
return retVal;
}
int rows;
unsigned long int tmp[PARAM_MAX_ARRAY_LEN];
+ pDest = new ArrayIntDestructor;
+
if(Param_getIntArray(param, name, idx, PARAM_MAX_ARRAY_LEN, &rows, tmp) == 0) {
if ((rows == 0) || (rows == 1)) {
index = 1;
caServer *pCAS = this->getCAS();
int rows;
int retVal;
- ArrayDestructor *pDest = new ArrayDestructor;
retVal = Param_getIntArray(param, name, idx, PARAM_MAX_ARRAY_LEN, &rows, ourValue);
if((retVal != 0) || (rows == 0)) {
this->postEvent (select, *val);
}
- delete pDest;
-
return S_cas_success;
}
#define PARAMINTRECORD_H
#include "paramRecord.h"
+#include "arrayDest.h"
class ParamIntRecord : public ParamRecord {
private:
#include "paramRecord.h"
-void ArrayDestructor::run(void *todelete) {
- aitString *pd = (aitString *) todelete;
- delete [] pd;
-}
-
ParamRecord::ParamRecord(caServer& cas, const Param *p, const char *rn, const char *u) :
Record(cas, rn, u, aitEnumString), param(p)
{
strcpy(buf1, "");
strcpy(buf2, "");
strcpy(buf3, "");
- sscanf(pPVName, "HAD:P%c:%[^:]:%[^:]:%[^:]", &tmp, buf1, buf2, buf3);
- if(strcmp(buf3, "") == 0) {
+ if(sscanf(pPVName, "HAD:P%c:%[^:]:%[^:]:%[^:]", &tmp, buf1, buf2, buf3) != 4) {
strcpy(name, buf1);
strcpy(idx, buf2);
} else {
ParamRecord::~ParamRecord()
{
+ delete pDest;
}
const char *ParamRecord::getPVName()
}
#include "record.h"
-
-class ArrayDestructor : public gddDestructor {
- virtual void run(void *);
-};
+#include "arrayDest.h"
class ParamRecord : public Record {
protected:
+ ArrayDestructor *pDest;
const Param *param;
char pPVName[PARAM_MAX_VALUE_LEN];
char name[PARAM_MAX_VALUE_LEN];
if(strncmp(pPVName, "HAD:P", strlen("HAD:P")) == 0) {
if (sscanf(pPVName, "HAD:P%*c:%[^:]:%[^:]:%[^:]", buf1, buf2, buf3) != 3) {
-#if 0
- sscanf(pPVName, "HAD:P%*c:%[^:]:%[^:]:%[^:]", buf1, buf2, buf3);
- if (strcmp(buf3, "") == 0) {
-#endif
setup = NULL;
} else {
setup = buf1;
if(strncmp(pPVName, "HAD:P", strlen("HAD:P")) == 0) {
if(sscanf(pPVName, "HAD:P%c:%[^:]:%[^:]:%[^:]", &type, buf1, buf2, buf3) != 4) {
-#if 0
- sscanf(pPVName, "HAD:P%c:%[^:]:%[^:]:%[^:]", &type, buf1, buf2, buf3);
- if (strcmp(buf3, "") == 0) {
-#endif
setup = NULL;
} else {
setup = buf1;
#include "paramRecord.h"
-#define MAX_PARAM_SRC 16
+#define MAX_PARAM_SRC 128
#define MAX_NUM_PV 1024
class ParamRecordSet : public caServer {
int rows;
char *tmp[PARAM_MAX_ARRAY_LEN];
+ pDest = new ArrayStringDestructor;
+
for (int i = 0 ; i < PARAM_MAX_ARRAY_LEN ; i++) {
tmp[i] = new char[PARAM_MAX_VALUE_LEN];
}
caServer *pCAS = this->getCAS();
int pretVal;
int rows;
- ArrayDestructor *pDest = new ArrayDestructor;
for (int i = 0 ; i < PARAM_MAX_ARRAY_LEN ; i++) {
ourValue[i] = new char[PARAM_MAX_VALUE_LEN];
val = new gddAtomic(gddAppType_value, aitEnumString, 1, index);
- val->putRef(stringValue);
+ val->putRef(stringValue, pDest);
retVal = S_casApp_success;
}
delete [] ourValue[i];
}
-#if 0
val->setStat(epicsAlarmNone);
val->setSevr(epicsSevNone);
-#endif
if (this->interest == aitTrue && pCAS != NULL) {
casEventMask select(pCAS->valueEventMask|pCAS->logEventMask|pCAS->alarmEventMask);
this->postEvent (select, *val);
}
- delete pDest;
-
return retVal;
}