- Fixed a massive memory leak in Hipadaba

- Extended the Hdb adapter to support SICSdata
- Made the simulated histogram memory driver work properly when
  data has been set.
- Implemented the hfactory command
- Removed hdbcommand which was never finsihed
This commit is contained in:
koennecke
2008-05-08 09:27:48 +00:00
parent 7d2b0c5104
commit e46334eddf
20 changed files with 1167 additions and 901 deletions

View File

@ -25,6 +25,7 @@
#include "lld.h"
#include "sicshipadaba.h"
#include "sicshdbadapter.h"
#include "sicsdata.h"
#define PRIVNAM "priv"
/*==================== support code ====================================*/
@ -309,27 +310,32 @@ static long totalSum(int *data, int length){
return result;
}
/*----------------------------------------------------------------------*/
typedef struct {
pHistMem pHM;
long oldSum;
} HMAdapter, *pHMAdapter;
/*-------------------------------------------------------------------------*/
static hdbCallbackReturn HMDataGetCallback(pHdb currentNode, void *userData,
pHdbMessage message){
pHistMem pHM = (pHistMem)userData;
pHMAdapter pHMA = (pHMAdapter)userData;
SConnection *pCon = NULL;
long sum1, sum2;
long sum1;
pHdbDataMessage mm = NULL;
if((mm = GetHdbGetMessage(message)) == NULL){
return hdbContinue;
}
pCon = mm->callData;
assert(pHM != NULL);
assert(pHMA != NULL && pHMA->pHM != NULL);
if(pCon == NULL){
return hdbAbort;
}
currentNode->value.arrayLength = GetHistLength(pHMA->pHM);
currentNode->value.v.intArray = (int *)GetHistogramPointer(pHMA->pHM,pCon);
sum1 = totalSum(currentNode->value.v.intArray, currentNode->value.arrayLength);
currentNode->value.arrayLength = GetHistLength(pHM);
currentNode->value.v.intArray = (int *)GetHistogramPointer(pHM,pCon);
sum2 = totalSum(currentNode->value.v.intArray, currentNode->value.arrayLength);
if(sum1 != sum2){
if(sum1 != pHMA->oldSum){
UpdateHipadabaPar(currentNode,currentNode->value,NULL);
pHMA->oldSum = sum1;
}
return hdbContinue;
}
@ -337,14 +343,17 @@ static hdbCallbackReturn HMDataGetCallback(pHdb currentNode, void *userData,
static pHdb MakeHMDataNode(pHistMem pHM, char *name){
pHdb node = NULL;
pHdbCallback pCall = NULL;
pHMAdapter pHMA = NULL;
node = MakeHipadabaNode(name,HIPINTVARAR,2);
if(node == NULL){
pHMA = malloc(sizeof(HMAdapter));
if(node == NULL || pHMA == NULL){
return NULL;
}
pHMA->pHM = pHM;
pHMA->oldSum = 0;
node->value.doNotFree = 1;
pCall = MakeHipadabaCallback(HMDataGetCallback,pHM,NULL);
pCall = MakeHipadabaCallback(HMDataGetCallback,pHMA,free);
if(pCall == NULL){
return NULL;
}
@ -498,6 +507,105 @@ static int CounterCallback(int iEvent, void *eventData, void *userData,
updateCountList();
}
return 1;
}/*=================== SICSData ========================================*/
static void copyIntSicsData(pHdb node, pSICSData data){
if(node->value.arrayLength != data->dataUsed){
if(node->value.v.intArray != NULL){
free(node->value.v.intArray);
node->value.arrayLength = data->dataUsed;
node->value.v.intArray = malloc(data->dataUsed*sizeof(int));
if(node->value.v.intArray == NULL){
node->value.arrayLength = 0;
return;
}
memcpy(node->value.v.intArray, data->data,
data->dataUsed*sizeof(int));
}
}
}
/*-----------------------------------------------------------------------*/
static void copyFloatSicsData(pHdb node, pSICSData data){
int i;
float val;
if(node->value.arrayLength != data->dataUsed){
if(node->value.v.floatArray != NULL){
free(node->value.v.floatArray);
node->value.arrayLength = data->dataUsed;
node->value.v.floatArray = malloc(data->dataUsed*sizeof(double));
if(node->value.v.floatArray == NULL){
node->value.arrayLength = 0;
return;
}
for(i = 0; i < data->dataUsed; i++){
getSICSDataFloat(data,i,&val);
node->value.v.floatArray[i] = val;
}
}
}
}
/*----------------------------------------------------------------------*/
static hdbCallbackReturn SICSDataCallback(pHdb node, void *userData,
pHdbMessage message){
pSICSData self = (pSICSData)userData;
pHdbDataMessage mm = NULL;
int i, status;
char script[256], error[1024];
assert(self != NULL);
/*
* I have to make copies because the floats in SICSData
* are floats but doubles in Hipdaba. Siiiigggghhhh!
* But it is cleaner in some way anyway.
*/
if((mm = GetHdbGetMessage(message)) != NULL){
memset(script,0,256);
if(GetHdbProperty(node,"readscript", script,256) == 1){
status = Tcl_Eval(InterpGetTcl(pServ->pSics),script);
if(status != TCL_OK){
snprintf(error,1023,"ERROR: Tcl returned error: %s",
Tcl_GetStringResult(InterpGetTcl(pServ->pSics)));
if(mm->callData != NULL){
SCWrite((SConnection *)mm->callData, error, eError);
return hdbAbort;
}
}
}
if(node->value.dataType == HIPINTVARAR){
copyIntSicsData(node, self);
} else if(node->value.dataType == HIPFLOATVARAR){
copyFloatSicsData(node, self);
}
return hdbContinue;
}
if((mm = GetHdbSetMessage(message)) != NULL){
if(node->value.dataType == HIPINTVARAR){
for(i = 0; i < mm->v->arrayLength; i++){
setSICSDataInt(self,i,mm->v->v.intArray[i]);
}
} else if(node->value.dataType == HIPFLOATVARAR){
for(i = 0; i < mm->v->arrayLength; i++){
setSICSDataFloat(self,i,(float)mm->v->v.floatArray[i]);
}
}
memset(script,0,256);
if(GetHdbProperty(node,"writescript", script,256) == 1){
status = Tcl_Eval(InterpGetTcl(pServ->pSics),script);
if(status != TCL_OK){
snprintf(error,1023,"ERROR: Tcl returned error: %s",
Tcl_GetStringResult(InterpGetTcl(pServ->pSics)));
if(mm->callData != NULL){
SCWrite((SConnection *)mm->callData, error, eError);
return hdbAbort;
}
}
}
return hdbContinue;
}
return hdbContinue;
}
/*============== interpreter function ==================================*/
int SICSHdbAdapter(SConnection *pCon, SicsInterp *pSics, void *pData,
@ -513,6 +621,9 @@ int SICSHdbAdapter(SConnection *pCon, SicsInterp *pSics, void *pData,
char buffer[512];
pCounter pCount = NULL;
CountEntry hugo;
pSICSData data = NULL;
int type;
pHdbCallback pCall = NULL;
root = GetHipadabaRoot();
assert(root != NULL);
@ -620,6 +731,39 @@ int SICSHdbAdapter(SConnection *pCon, SicsInterp *pSics, void *pData,
return 1;
}
/**
* look for SICSData
*/
data = (pSICSData)FindCommandData(pSics,argv[2],"SICSData");
if(data != NULL){
if(argc < 5){
SCWrite(pCon,"ERROR: need type and name to create SICSData adapter",
eError);
return 0;
}
type = convertHdbType(argv[3]);
if(type != HIPINTVARAR && type != HIPFLOATVARAR ){
SCWrite(pCon,
"ERROR: need intvarar or floatvarar type for SICSData adapter",
eError);
return 0;
}
node = MakeHipadabaNode(argv[4],type,0);
if(node == NULL){
SCWrite(pCon,"ERROR: out of memory in SICSHdbAdapter", eError);
return 0;
}
pCall = MakeHipadabaCallback(SICSDataCallback,data,NULL);
if(pCall == NULL){
SCWrite(pCon,"ERROR: out of memory in SICSHdbAdapter", eError);
return 0;
}
AppendHipadabaCallback(node,pCall);
AddHipadabaChild(path,node,pCon);
SCSendOK(pCon);
return 1;
}
snprintf(buffer,511,
"ERROR: attaching this type of object: %s at %s not implemented",
argv[2], argv[1]);