Assorted bug fixes
- If SctProcessNode ran into a timeout, its action data wa sdeleted. If data came later, this caused SICS to crash. This is now fixed - sget leaked connections under certain circumstances - Cosmetic fix to hipadaba.c - yet another chnage to the TRICS file format in fourmess.c, now it prints magnetic field instead of the proton count
This commit is contained in:
27
fourmess.c
27
fourmess.c
@ -393,7 +393,7 @@ static int FourMessStoreIntern(pSICSOBJ self, SConnection * pCon,
|
|||||||
double fHkl[3], double fPosition[4], char *extra)
|
double fHkl[3], double fPosition[4], char *extra)
|
||||||
{
|
{
|
||||||
pFourMess priv = self->pPrivate;
|
pFourMess priv = self->pPrivate;
|
||||||
float fSum, fSigma, fTemp, fStep, fPreset;
|
float fSum, fSigma, fTemp, fMF, fStep, fPreset;
|
||||||
int i, iLF, iRet, iNP, ii;
|
int i, iLF, iRet, iNP, ii;
|
||||||
long *lCounts = NULL;
|
long *lCounts = NULL;
|
||||||
pEVControl pEva = NULL;
|
pEVControl pEva = NULL;
|
||||||
@ -486,6 +486,23 @@ static int FourMessStoreIntern(pSICSOBJ self, SConnection * pCon,
|
|||||||
iRet = EVCGetPos(pEva, pCon, &fTemp);
|
iRet = EVCGetPos(pEva, pCon, &fTemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get mf */
|
||||||
|
fMF = -777.77;
|
||||||
|
pEva = (pEVControl) FindCommandData(pServ->pSics, "mf",
|
||||||
|
"Environment Controller");
|
||||||
|
if (pEva == NULL) {
|
||||||
|
pPtr = (pDummy) FindCommandData(pServ->pSics, "mf",
|
||||||
|
"RemObject");
|
||||||
|
if (pPtr != NULL) {
|
||||||
|
pDriv = pPtr->pDescriptor->GetInterface(pPtr, DRIVEID);
|
||||||
|
if (pDriv != NULL) {
|
||||||
|
fMF = pDriv->GetValue(pPtr, pCon);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
iRet = EVCGetPos(pEva, pCon, &fMF);
|
||||||
|
}
|
||||||
|
|
||||||
/* write profile */
|
/* write profile */
|
||||||
if (priv->profFile) {
|
if (priv->profFile) {
|
||||||
/* collect data */
|
/* collect data */
|
||||||
@ -493,12 +510,16 @@ static int FourMessStoreIntern(pSICSOBJ self, SConnection * pCon,
|
|||||||
GetScanVarStep(priv->pScanner, 0, &fStep);
|
GetScanVarStep(priv->pScanner, 0, &fStep);
|
||||||
fPreset = GetScanPreset(priv->pScanner);
|
fPreset = GetScanPreset(priv->pScanner);
|
||||||
prot = getProtonAverage(priv);
|
prot = getProtonAverage(priv);
|
||||||
|
/*
|
||||||
|
They rather wanted fMF in place of the proton average which fell victim to the
|
||||||
|
monitor assignement chaos anyway.
|
||||||
|
*/
|
||||||
if(extra == NULL){
|
if(extra == NULL){
|
||||||
fprintf(priv->profFile, "%3d %7.4f %9.0f %7.3f %12f %s\n", iNP, fStep,
|
fprintf(priv->profFile, "%3d %7.4f %9.0f %7.3f %12f %s\n", iNP, fStep,
|
||||||
fPreset, fTemp, prot, pBueffel);
|
fPreset, fTemp, fMF, pBueffel);
|
||||||
} else {
|
} else {
|
||||||
fprintf(priv->profFile, "%3d %7.4f %9.0f %7.3f %12f %s %s\n", iNP, fStep,
|
fprintf(priv->profFile, "%3d %7.4f %9.0f %7.3f %12f %s %s\n", iNP, fStep,
|
||||||
fPreset, fTemp, prot, pBueffel,extra);
|
fPreset, fTemp, fMF, pBueffel,extra);
|
||||||
}
|
}
|
||||||
for (i = 0; i < iNP; i++) {
|
for (i = 0; i < iNP; i++) {
|
||||||
for (ii = 0; ii < 10 && i < iNP; ii++) {
|
for (ii = 0; ii < 10 && i < iNP; ii++) {
|
||||||
|
@ -1194,7 +1194,7 @@ int GetHdbProperty(pHdb node, char *key, char *value, int len)
|
|||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
char *GetHdbProp(pHdb node, char *key)
|
char *GetHdbProp(pHdb node, char *key)
|
||||||
{
|
{
|
||||||
if (node != NULL && node->properties != NULL) {
|
if (node != NULL && isHdbNodeValid(node) && node->properties != NULL) {
|
||||||
return StringDictGetShort(node->properties, key);
|
return StringDictGetShort(node->properties, key);
|
||||||
} else {
|
} else {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1620,8 +1620,19 @@ static int SctProcessCmd(pSICSOBJ ccmd, SConnection * con,
|
|||||||
startTime = time(NULL);
|
startTime = time(NULL);
|
||||||
DevQueue(c->devser, data, WritePRIO,
|
DevQueue(c->devser, data, WritePRIO,
|
||||||
SctWriteHandler, SctTransactMatch, NULL, SctDataInfo);
|
SctWriteHandler, SctTransactMatch, NULL, SctDataInfo);
|
||||||
while (data->busy == 1 && time(NULL) < startTime + 20) {
|
|
||||||
|
while (data->busy == 1){
|
||||||
TaskYield(pServ->pTasker);
|
TaskYield(pServ->pTasker);
|
||||||
|
if(time(NULL) >= startTime + 20) {
|
||||||
|
/*
|
||||||
|
if data would still come after such a long timeout, it
|
||||||
|
might end up in the next action: see comment in devser.c
|
||||||
|
*/
|
||||||
|
SCPrintf(con,eError,"ERROR: timeout processing node %s", par[0]->value.v.text);
|
||||||
|
DevRemoveAction(c->devser,data);
|
||||||
|
SctKillData(data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
SctKillData(data);
|
SctKillData(data);
|
||||||
|
|
||||||
|
@ -153,6 +153,7 @@ static int InvokeSICSFunc(void *ms, void *userData)
|
|||||||
SCsetMacro(pCon,0);
|
SCsetMacro(pCon,0);
|
||||||
if(!status){
|
if(!status){
|
||||||
self->success = 0;
|
self->success = 0;
|
||||||
|
SCDeleteConnection(pCon);
|
||||||
return MPSTOP;
|
return MPSTOP;
|
||||||
}
|
}
|
||||||
self->response = strdup(Tcl_GetStringResult(InterpGetTcl(pServ->pSics)));
|
self->response = strdup(Tcl_GetStringResult(InterpGetTcl(pServ->pSics)));
|
||||||
|
Reference in New Issue
Block a user