- 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:
164
sicshdbadapter.c
164
sicshdbadapter.c
@ -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]);
|
||||
|
Reference in New Issue
Block a user