From 8c2278784cfea23e3be93e1b5c91290841647049 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Fri, 21 Aug 2009 00:53:55 +0000 Subject: [PATCH] fixed mantis 361 --- src/ca/ca_client_context.cpp | 30 ++++++++++++++++++++---------- src/ca/oldAccess.h | 1 + 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/ca/ca_client_context.cpp b/src/ca/ca_client_context.cpp index 515d77efb..d77fd13ea 100644 --- a/src/ca/ca_client_context.cpp +++ b/src/ca/ca_client_context.cpp @@ -253,6 +253,11 @@ void ca_client_context::registerForFileDescriptorCallBack ( this->fdRegFunc = pFunc; this->fdRegArg = pArg; this->fdRegFuncNeedsToBeCalled = true; + if ( pFunc ) { + // the receive thread might already be blocking + // w/o having sent the wakeup message + this->_sendWakeupMsg (); + } // should block here until releated callback in progress completes } @@ -557,11 +562,11 @@ int ca_client_context::pendEvent ( const double & timeout ) 0, & tmpAddr.sa, & addrSize ); } while ( status > 0 ); } - this->noWakeupSincePend = true; while ( this->callbackThreadsPending > 0 ) { epicsGuardRelease < epicsMutex > unguard ( guard ); this->callbackThreadActivityComplete.wait ( 30.0 ); } + this->noWakeupSincePend = true; } double elapsed = epicsTime::getCurrent() - current; @@ -613,19 +618,24 @@ void ca_client_context::callbackProcessingInitiateNotify () } } if ( sendNeeded ) { - // send short udp message to wake up a file descriptor manager - // when a message arrives - osiSockAddr tmpAddr; - tmpAddr.ia.sin_family = AF_INET; - tmpAddr.ia.sin_addr.s_addr = htonl ( INADDR_LOOPBACK ); - tmpAddr.ia.sin_port = htons ( this->localPort ); - char buf = 0; - sendto ( this->sock, & buf, sizeof ( buf ), - 0, & tmpAddr.sa, sizeof ( tmpAddr.sa ) ); + _sendWakeupMsg (); } } } +void ca_client_context :: _sendWakeupMsg () +{ + // send short udp message to wake up a file descriptor manager + // when a message arrives + osiSockAddr tmpAddr; + tmpAddr.ia.sin_family = AF_INET; + tmpAddr.ia.sin_addr.s_addr = htonl ( INADDR_LOOPBACK ); + tmpAddr.ia.sin_port = htons ( this->localPort ); + char buf = 0; + sendto ( this->sock, & buf, sizeof ( buf ), + 0, & tmpAddr.sa, sizeof ( tmpAddr.sa ) ); +} + void ca_client_context::callbackProcessingCompleteNotify () { // if preemptive callback is enabled then this is a noop diff --git a/src/ca/oldAccess.h b/src/ca/oldAccess.h index e8d721dba..d18a4fe1b 100644 --- a/src/ca/oldAccess.h +++ b/src/ca/oldAccess.h @@ -404,6 +404,7 @@ private: void callbackProcessingCompleteNotify (); cacContext & createNetworkContext ( epicsMutex & mutualExclusion, epicsMutex & callbackControl ); + void _sendWakeupMsg (); ca_client_context ( const ca_client_context & ); ca_client_context & operator = ( const ca_client_context & );