/*------------------------------------------------------------------------ A busy flag module for SICS. Mark Koennecke, July 2002 -------------------------------------------------------------------------*/ #include #include #include "fortify.h" #include "sics.h" /*----------------------------------------------------------------------*/ typedef struct BUSY__ { pObjectDescriptor pDes; int iBusy; } Busy; /*---------------------------------------------------------------------*/ busyPtr makeBusy(void) { busyPtr result = NULL; result = (busyPtr) malloc(sizeof(Busy)); if (!result) { return NULL; } result->pDes = CreateDescriptor("BusyFlag"); if (!result->pDes) { free(result); return NULL; } result->iBusy = 0; return result; } /*---------------------------------------------------------------------*/ void killBusy(void *self) { busyPtr busy; if (self != NULL) { busy = (busyPtr) self; if (busy->pDes != NULL) { DeleteDescriptor(busy->pDes); } free(busy); } } /*---------------------------------------------------------------------*/ void incrementBusy(busyPtr self) { assert(self != NULL); self->iBusy++; } /*--------------------------------------------------------------------*/ void decrementBusy(busyPtr self) { assert(self != NULL); self->iBusy--; if (self->iBusy < 0) { self->iBusy = 0; } } /*--------------------------------------------------------------------*/ void clearBusy(busyPtr self) { assert(self != NULL); self->iBusy = 0; } /*--------------------------------------------------------------------*/ void setBusy(busyPtr self, int val) { assert(self != NULL); self->iBusy = val; } /*--------------------------------------------------------------------*/ int isBusy(busyPtr self) { assert(self != NULL); return self->iBusy; } /*--------------------------------------------------------------------*/ int BusyAction(SConnection * pCon, SicsInterp * pSics, void *pData, int argc, char *argv[]) { busyPtr self = NULL; char pBuffer[80]; self = (busyPtr) pData; assert(self != NULL); if (argc > 1) { strtolower(argv[1]); if (usUser < SCGetRights(pCon)) { SCWrite(pCon, "ERROR: no privilege to manipulate busy flag", eError); return 0; } if (strcmp(argv[1], "incr") == 0) { incrementBusy(self); SCSendOK(pCon); return 1; } else if (strcmp(argv[1], "decr") == 0) { decrementBusy(self); SCSendOK(pCon); return 1; } else if (strcmp(argv[1], "clear") == 0) { clearBusy(self); SCSendOK(pCon); return 1; } } sprintf(pBuffer, "Busy = %d", isBusy(self)); SCWrite(pCon, pBuffer, eValue); return 1; } /*---------------------------------------------------------------------*/ busyPtr findBusy(SicsInterp * pInter) { CommandList *pCom = NULL; pCom = FindCommand(pInter, "busy"); if (pCom != NULL) { return (busyPtr) pCom->pData; } }