From 606e73b221050d6082ce966bc143bd9a11edefdd Mon Sep 17 00:00:00 2001 From: Douglas Clowes Date: Fri, 26 Jul 2013 09:39:46 +1000 Subject: [PATCH] Run ghttp_process in async mode, call TaskYield and add an abort action --- site_ansto/anstohttp.c | 58 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/site_ansto/anstohttp.c b/site_ansto/anstohttp.c index 6a9c8018..7b8b914b 100644 --- a/site_ansto/anstohttp.c +++ b/site_ansto/anstohttp.c @@ -79,12 +79,48 @@ typedef struct { pICallBack pCall; }anstoHttp, *pAnstoHttp; /*------------------------------------------------------------------*/ +static ghttp_status anstoLocalProcess(pAnstoHttp self) { + ghttp_status httpStatus; + pTaskMan pTasker = GetTasker(); + if(self->asyncRunning) { + httpStatus = ghttp_process(self->syncRequest); + /* + * Service other SICS tasks while we wait, + * but do not run the taskloop during initialisation + */ + if (pTasker == NULL) + pTasker = GetTasker(); + if (pTasker && (pServ->dummyCon != NULL)) + TaskYield(pTasker); + return httpStatus; + } else { + ghttp_set_sync(self->syncRequest, ghttp_async); + do { + httpStatus = ghttp_process(self->syncRequest); + + if (httpStatus != ghttp_not_done) + break; + /* + * Service other SICS tasks while we wait, + * but do not run the taskloop during initialisation + */ + if (pTasker == NULL) + pTasker = GetTasker(); + if (pTasker && (pServ->dummyCon != NULL)) + TaskYield(pTasker); + } while(1); + + ghttp_set_sync(self->syncRequest, ghttp_sync); + return httpStatus; + } +} +/*------------------------------------------------------------------*/ static int anstoHttpGetPrepare(pAnstoHttp self, char *request){ char url[512]; ghttp_status httpStatus; if(self->asyncRunning){ - while((httpStatus = ghttp_process(self->syncRequest)) + while((httpStatus = anstoLocalProcess(self)) == ghttp_not_done){ } self->asyncRunning = 0; @@ -147,13 +183,13 @@ static int anstoHttpGet(pAnstoHttp self, char *request){ * try two times: a reconnect is no error */ ghttp_prepare(self->syncRequest); - httpStatus = ghttp_process(self->syncRequest); + httpStatus = anstoLocalProcess(self); if(httpStatus != ghttp_done){ ghttp_close(self->syncRequest); if (!anstoHttpGetPrepare(self,request)) return 0; // MJL return here if failed ghttp_prepare(self->syncRequest); // MJL be sure to call ghttp_prepare before each ghttp_process - httpStatus = ghttp_process(self->syncRequest); + httpStatus = anstoLocalProcess(self); } if(httpStatus != ghttp_done){ strncpy(self->hmError,"Reconnect", 511); @@ -254,7 +290,7 @@ static int AnstoHttpConfigure(pHistDriver self, SConnection *pCon, pPriv->passWord); ghttp_set_sync(pPriv->syncRequest,ghttp_sync); status = ghttp_prepare(pPriv->syncRequest); - httpStatus = ghttp_process(pPriv->syncRequest); + httpStatus = anstoLocalProcess(pPriv); confData = (char *)ghttp_get_body(pPriv->syncRequest); if(httpStatus != ghttp_done){ /* we may need to reconnect..... @@ -409,14 +445,14 @@ static int AnstoHttpStatus_Base(pHistDriver self,SConnection *pCon,int *pextrast } pPriv->asyncRunning = 1; } - httpStatus = ghttp_process(pPriv->syncRequest); + httpStatus = anstoLocalProcess(pPriv); switch(httpStatus){ case ghttp_error: ghttp_close(pPriv->syncRequest); pPriv->asyncRunning = 0; // MJL bug fix 9/03/07 moved by DFC anstoHttpGetPrepare(pPriv,statusdaq); ghttp_prepare(pPriv->syncRequest); - httpStatus = ghttp_process(pPriv->syncRequest); + httpStatus = anstoLocalProcess(pPriv); if(httpStatus != ghttp_done){ strncpy(pPriv->hmError,"Reconnect", 511); pPriv->errorCode = SERVERERROR; @@ -991,6 +1027,16 @@ pHistDriver CreateAnstoHttpDriver(pStringDict pOption){ SCSendOK(pCon); return 1; } + if(strcmp(argv[1],"abort") == 0) { + pAnstoHttp pPriv = NULL; + if(!SCMatchRights(pCon,usUser)) { + return 0; + } + pPriv = (pAnstoHttp)self->pDriv->pPriv; + ghttp_close(pPriv->syncRequest); + SCSendOK(pCon); + return 1; + } return HistAction(pCon, pSics, pData, argc, argv); }