--- libaitrpc/src/srv.c 2013/07/15 14:54:40 1.16.2.3 +++ libaitrpc/src/srv.c 2013/07/16 12:35:25 1.16.2.6 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.16.2.3 2013/07/15 14:54:40 misho Exp $ +* $Id: srv.c,v 1.16.2.6 2013/07/16 12:35:25 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -629,7 +629,7 @@ rxBLOB(sched_task_t *task) break; case set: if ((b = rpc_srv_registerBLOB(s, ntohl(blob.hdr_len), - ntohl(blob.hdr_ret), task))) { + ntohl(blob.hdr_ret)))) { /* set new BLOB variable for reply :) */ blob.hdr_var = htonl(b->blob_var); @@ -646,9 +646,6 @@ rxBLOB(sched_task_t *task) blob.hdr_cmd = error; blob.hdr_ret = RPC_ERROR(-1); } - - schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_DATA, - (void*) (intptr_t) ntohl(blob.hdr_var), NULL); break; default: rpc_SetErr(EPROCUNAVAIL, "Unsupported BLOB command %d", blob.hdr_cmd); @@ -664,6 +661,25 @@ end: } static void * +flushBLOB(sched_task_t *task) +{ + rpc_srv_t *srv = TASK_ARG(task); + rpc_blob_t *b, *tmp; + + printf("!signal 99\n"); + + TAILQ_FOREACH_SAFE(b, &srv->srv_blob.blobs, blob_node, tmp) { + TAILQ_REMOVE(&srv->srv_blob.blobs, b, blob_node); + + rpc_srv_blobFree(srv, b); + e_free(b); + } + + schedSignalSelf(task); + return NULL; +} + +static void * acceptBLOBClients(sched_task_t *task) { rpc_srv_t *srv = TASK_ARG(task); @@ -837,6 +853,8 @@ rpc_srv_endBLOBServer(rpc_srv_t * __restrict srv) return; srv->srv_blob.kill = 1; + + schedEnd(&srv->srv_blob.root); } /* @@ -863,6 +881,7 @@ rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv) return -1; } + schedSignal(srv->srv_blob.root, flushBLOB, srv, SIGFBLOB, NULL, 0); if (!schedRead(srv->srv_blob.root, acceptBLOBClients, srv, srv->srv_blob.server.cli_sock, NULL, 0)) { rpc_SetErr(sched_GetErrno(), "%s", sched_GetError()); @@ -873,6 +892,14 @@ rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv) /* main rpc loop */ schedRun(srv->srv_blob.root, &srv->srv_blob.kill); + /* detach blobs */ + TAILQ_FOREACH_SAFE(b, &srv->srv_blob.blobs, blob_node, tmp) { + TAILQ_REMOVE(&srv->srv_blob.blobs, b, blob_node); + + rpc_srv_blobFree(srv, b); + e_free(b); + } + /* close all clients connections & server socket */ for (i = 0; i < array_Size(srv->srv_blob.clients); i++) { c = array(srv->srv_blob.clients, i, rpc_cli_t*); @@ -889,15 +916,6 @@ rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv) close(srv->srv_blob.server.cli_sock); - /* detach blobs */ - TAILQ_FOREACH_SAFE(b, &srv->srv_blob.blobs, blob_node, tmp) { - TAILQ_REMOVE(&srv->srv_blob.blobs, b, blob_node); - - rpc_srv_blobFree(srv, b); - e_free(b); - } - - schedEnd(&srv->srv_blob.root); AIT_FREE_VAL(&srv->srv_blob.dir); return 0; } @@ -1040,12 +1058,13 @@ rpc_srv_endServer(rpc_srv_t ** __restrict psrv) return; /* if send kill to blob server */ - if (!(*psrv)->srv_blob.kill) - rpc_srv_endBLOBServer(*psrv); + rpc_srv_endBLOBServer(*psrv); (*psrv)->srv_kill = 1; sleep(RPC_SCHED_POLLING); + schedEnd(&(*psrv)->srv_root); + pthread_mutex_destroy(&(*psrv)->srv_funcs.mtx); e_free(*psrv); *psrv = NULL; @@ -1114,7 +1133,6 @@ rpc_srv_loopServer(rpc_srv_t * __restrict srv) srv->srv_funcs.avlh_root = NULL; RPC_FUNCS_UNLOCK(&srv->srv_funcs); - schedEnd(&srv->srv_root); return 0; }