-static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/paramRecordSet.cc,v 1.11 2003-05-19 16:05:41 sailer Exp $";
+static const char rcsId[] = "$Header: /misc/hadesprojects/daq/cvsroot/eventbuilder/allParam/ca/server/paramRecordSet.cc,v 1.12 2003-07-23 15:37:04 sailer Exp $";
#define _POSIX_C_SOURCE 199509L
#if HAVE_CONFIG_H
{
numParamSrc = 0;
numPv = 0;
+ pv = NULL;
}
ParamRecordSet::~ParamRecordSet()
{
+ Record *current;
+ Record *next;
+ for (current = pv; current != NULL; current = next) {
+ next = current->getNext();
+ delete current;
+ }
+
for (int i = 0 ; i < numParamSrc ; i++) {
desParam(param[i]);
delete param[i];
}
- for (int i = 0 ; i < numPv ; i++) {
- delete pvs[i];
- }
}
Param *ParamRecordSet::pParam(const char *setup)
if (strcmp(param[i]->setup, setup) == 0) {
return param[i];
}
- } else {
- if (setup == NULL) {
- return param[i];
- }
}
}
} else {
pvExistReturn ParamRecordSet::pvExistTest(const casCtx &ctx, const char *pPVName)
{
+ Record *current;
char *setup;
char buf1[PARAM_MAX_NAME_LEN];
char buf2[PARAM_MAX_NAME_LEN];
strcpy(buf2, "");
strcpy(buf3, "");
- for (int i = 0 ; i < numPv ; i++) {
- if(strcmp(pPVName, pvs[i]->getPVName()) == 0) {
+ for (current = pv; current != NULL; current = current->getNext()) {
+ if(strcmp(pPVName, current->getPVName()) == 0) {
return pverExistsHere;
}
}
return pverDoesNotExistHere;
}
+int ParamRecordSet::expireParams(int sec)
+{
+ int now;
+ int retVal = 0;
+ Record *previous = NULL;
+ Record *current = pv;
+ Record *next;
+
+ now = (int) time(NULL);
+
+ while (current != NULL) {
+ next = current->getNext();
+ if (now - sec > current->getLastAccessTime()) {
+ syslog(LOG_DEBUG, "Removing param %s", current->getPVName());
+ if (previous != NULL) {
+ previous->setNext(current->getNext());
+ } else {
+ pv = current->getNext();
+ }
+ delete current;
+ retVal++;
+ numPv--;
+ } else {
+ previous = current;
+ }
+ current = next;
+ }
+
+ if (retVal) {
+ syslog(LOG_INFO, "%d parameter removed, %d parameter left", retVal, numPv);
+ }
+ return retVal;
+}
+
#if EPICS_RELEASE >= 314
pvAttachReturn ParamRecordSet::pvAttach(const casCtx &ctx, const char *pPVName)
#else
pvCreateReturn ParamRecordSet::createPV(const casCtx &ctx, const char *pPVName)
#endif
{
+ Record *previous;
+ Record *current;
char *setup;
char type;
char buf1[PARAM_MAX_NAME_LEN];
pvCreateReturn retVal(S_casApp_pvNotFound);
#endif
- for (int i = 0 ; i < numPv ; i++) {
- if(strcmp(pPVName, pvs[i]->getPVName()) == 0) {
- retVal = pvs[i];
- return retVal;
- }
+ for (current = pv, previous = NULL;
+ current != NULL && (strcmp(pPVName, current->getPVName()) != 0);
+ previous = current, current = current->getNext()) {
}
- if(strncmp(pPVName, "HAD:P", strlen("HAD:P")) == 0) {
- if(sscanf(pPVName, "HAD:P%c:%[^:]:%[^:]:%[^:]", &type, buf1, buf2, buf3) != 4) {
- setup = NULL;
- } else {
- setup = buf1;
- for (unsigned int i = 0 ; i < strlen(setup) ; i++) {
- setup[i] = tolower(setup[i]);
+ if (current != NULL) {
+ retVal = current;
+ current->access();
+ } else {
+ if(strncmp(pPVName, "HAD:P", strlen("HAD:P")) == 0) {
+ if(sscanf(pPVName, "HAD:P%c:%[^:]:%[^:]:%[^:]", &type, buf1, buf2, buf3) != 4) {
+ setup = NULL;
+ } else {
+ setup = buf1;
+ for (unsigned int i = 0 ; i < strlen(setup) ; i++) {
+ setup[i] = tolower(setup[i]);
+ }
}
- }
- if(pParam(setup) != NULL) {
- switch (type) {
- case('I'):
- retVal = (pvs[numPv++] = new ParamIntRecord(*this, pParam(setup), pPVName, "Integer"));
- syslog(LOG_DEBUG, "Created Integer Record %s", pPVName);
- break;
- case('S'):
- retVal = (pvs[numPv++] = new ParamStringRecord(*this, pParam(setup), pPVName, "String"));
- syslog(LOG_DEBUG, "Created String Record %s", pPVName);
- break;
- case('F'):
- retVal = (pvs[numPv++] = new ParamFilenameRecord(*this, pParam(setup), pPVName, "Filename"));
- syslog(LOG_DEBUG, "Created Filename Record %s", pPVName);
- break;
- case('B'):
- retVal = (pvs[numPv++] = new ParamBlobRecord(*this, pParam(setup), pPVName, "Binary Large OBject"));
- syslog(LOG_DEBUG, "Created Blob Record %s", pPVName);
- break;
+ if(pParam(setup) != NULL) {
+ switch (type) {
+ case('I'):
+ current = new ParamIntRecord(*this, pParam(setup), pPVName, "Integer");
+ syslog(LOG_DEBUG, "Created Integer Record %s", pPVName);
+ break;
+ case('S'):
+ current = new ParamStringRecord(*this, pParam(setup), pPVName, "String");
+ syslog(LOG_DEBUG, "Created String Record %s", pPVName);
+ break;
+ case('F'):
+ current = new ParamFilenameRecord(*this, pParam(setup), pPVName, "Filename");
+ syslog(LOG_DEBUG, "Created Filename Record %s", pPVName);
+ break;
+ case('B'):
+ current = new ParamBlobRecord(*this, pParam(setup), pPVName, "Binary Large OBject");
+ syslog(LOG_DEBUG, "Created Blob Record %s", pPVName);
+ break;
+ default:
+ return S_casApp_pvNotFound;
+ break;
+ }
+ numPv++;
+ if (previous != NULL) {
+ previous->setNext(current);
+ } else {
+ pv = current;
+ }
+ current->access();
+ retVal = current;
+ } else {
+ retVal = S_casApp_pvNotFound;
}
- return retVal;
- } else {
- return S_casApp_pvNotFound;
}
}
- return S_casApp_pvNotFound;
+ return retVal;
}