From: Adrian S. <a3s...@us...> - 2005-04-28 00:18:52
|
Update of /cvsroot/sblim/sfcb In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv575 Modified Files: msgqueue.c providerDrv.c sfcBroker.c Log Message: Fix for hang problem reported by Viktor Index: sfcBroker.c =================================================================== RCS file: /cvsroot/sblim/sfcb/sfcBroker.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- sfcBroker.c 26 Apr 2005 21:58:47 -0000 1.9 +++ sfcBroker.c 28 Apr 2005 00:18:43 -0000 1.10 @@ -235,7 +235,7 @@ } else { // mlogf(M_INFO,M_SHOW,"sigchild %d\n",pid); - if (testStartedAdapter(pid,&left)) { + if (testStartedAdapter(pid,&left)) { if (left==0) { mlogf(M_INFO,M_SHOW,"--- Adapters stopped\n"); adaptersStopped=1; Index: providerDrv.c =================================================================== RCS file: /cvsroot/sblim/sfcb/providerDrv.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- providerDrv.c 27 Apr 2005 11:10:42 -0000 1.10 +++ providerDrv.c 28 Apr 2005 00:18:43 -0000 1.11 @@ -123,6 +123,7 @@ int testStartedProc(int pid, int *left) { ProviderProcess *pp=provProc; + ProviderInfo *info; int i,stopped=0; *left=0; @@ -130,6 +131,11 @@ if ((pp+i)->pid==pid) { stopped=1; (pp+i)->pid=0; + info=(pp+i)->firstProv; + while (info) { + info->pid=0; + info=info->next; + } } if ((pp+i)->pid!=0) (*left)++; } @@ -421,6 +427,7 @@ getInode(providerSockets.receive))); processName=info->providerName; providerProcess=1; + info->proc=*proc; semSetValue(sfcbSem,((*proc)->id*3)+provProcGuardId+provProcBaseId,0); semSetValue(sfcbSem,((*proc)->id*3)+provProcInuseId+provProcBaseId,0); @@ -451,11 +458,12 @@ _SFCB_ENTER(TRACE_PROVIDERDRV, "forkProvider"); ProviderProcess *proc; ProviderInfo * pInfo; + int val; if (info->pid ) { proc=info->proc; semAcquire(sfcbSem,(proc->id*3)+provProcGuardId+provProcBaseId); - if (semGetValue(sfcbSem,(proc->id*3)+provProcAliveId+provProcBaseId)) { + if ((val=semGetValue(sfcbSem,(proc->id*3)+provProcAliveId+provProcBaseId))) { semRelease(sfcbSem,(proc->id*3)+provProcInuseId+provProcBaseId); semRelease(sfcbSem,(proc->id*3)+provProcGuardId+provProcBaseId); _SFCB_TRACE(1, ("--- Provider %s still loaded",info->providerName)); @@ -1823,7 +1831,7 @@ mlogf(M_INFO,M_SHOW,"--- Reloading provider\n"); doLoadProvider(pInfo,dlName); } - + if (pInfo->initialized==0) { pthread_mutex_lock(&pInfo->initMtx); if (pInfo->initialized==0) { Index: msgqueue.c =================================================================== RCS file: /cvsroot/sblim/sfcb/msgqueue.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- msgqueue.c 26 Apr 2005 21:58:47 -0000 1.5 +++ msgqueue.c 28 Apr 2005 00:18:43 -0000 1.6 @@ -181,7 +181,7 @@ ol = length; for (;;) { if (mqg) mqg->teintr=0; - if ((n = recv(*s, data+r, length-r, 0)) < 0) { + if ((n = recv(*s, data+r, length-r, MSG_WAITALL)) < 0) { if (errno == EINTR) { _SFCB_TRACE(1, (" Receive interrupted %d",currentProc)); if (mqg) { |