From 4844fbbd8271e513d2baf7cd3726a10619c3fa9c Mon Sep 17 00:00:00 2001 From: Bryan Robert Tester Date: Wed, 12 Feb 2020 15:11:38 +0000 Subject: [PATCH] moved listen into rsrv_grab_tcp to allow retry if failed Fixes race condition with multiple IOCs starting simultaneously. --- src/ioc/rsrv/caservertask.c | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/ioc/rsrv/caservertask.c b/src/ioc/rsrv/caservertask.c index 80310a422..24fa5859f 100644 --- a/src/ioc/rsrv/caservertask.c +++ b/src/ioc/rsrv/caservertask.c @@ -66,17 +66,6 @@ static void req_server (void *pParm) IOC_sock = conf->tcp; - /* listen and accept new connections */ - if ( listen ( IOC_sock, 20 ) < 0 ) { - char sockErrBuf[64]; - epicsSocketConvertErrnoToString ( - sockErrBuf, sizeof ( sockErrBuf ) ); - errlogPrintf ( "CAS: Listen error: %s\n", - sockErrBuf ); - epicsSocketDestroy (IOC_sock); - epicsThreadSuspendSelf (); - } - epicsEventSignal(castcp_startStopEvent); while (TRUE) { @@ -194,7 +183,7 @@ SOCKET* rsrv_grab_tcp(unsigned short *port) epicsSocketEnableAddressReuseDuringTimeWaitState ( tcpsock ); - if(bind(tcpsock, &scratch.sa, sizeof(scratch))==0) { + if(bind(tcpsock, &scratch.sa, sizeof(scratch))==0 && listen(tcpsock, 20)==0) { if(scratch.ia.sin_port==0) { /* use first socket to pick a random port */ osiSocklen_t alen = sizeof(ifaceAddr);