--- libaitrpc/src/srv.c 2015/07/02 23:06:09 1.27.2.1 +++ libaitrpc/src/srv.c 2015/07/19 23:40:40 1.27.2.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: srv.c,v 1.27.2.1 2015/07/02 23:06:09 misho Exp $ +* $Id: srv.c,v 1.27.2.4 2015/07/19 23:40:40 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -1167,7 +1167,11 @@ end: static void * flushBLOB(sched_task_t *task) { +#ifdef atomic_load_acq_ptr uintptr_t sigArg = atomic_load_acq_ptr(&_glSigArg); +#else + uintptr_t sigArg = *((volatile uintptr_t*) &_glSigArg); +#endif rpc_srv_t *srv = sigArg ? (void*) sigArg : TASK_ARG(task); rpc_blob_t *b, *tmp; @@ -1409,7 +1413,11 @@ rpc_srv_loopBLOBServer(rpc_srv_t * __restrict srv) /* disabled kqueue support in libaitsched */ struct sigaction sa; +#ifdef atomic_store_rel_ptr atomic_store_rel_ptr(&_glSigArg, (uintptr_t) srv); +#else + *((volatile uintptr_t*) &_glSigArg) = (uintptr_t) srv; +#endif memset(&sa, 0, sizeof sa); sigemptyset(&sa.sa_mask); @@ -1598,6 +1606,9 @@ rpc_srv_endServer(rpc_srv_t ** __restrict psrv) /* if send kill to blob server */ rpc_srv_endBLOBServer(*psrv); + /* wait for BLOB server done */ + while ((*psrv)->srv_blob.root) + usleep(1000); (*psrv)->srv_kill = 1; sleep(RPC_SCHED_POLLING);