This is Unofficial EPICS BASE Doxygen Site
ca_client_context.cpp File Reference
#include <stdexcept>
#include <string>
#include <stdio.h>
#include "epicsExit.h"
#include "errlog.h"
#include "locationException.h"
#include "iocinf.h"
#include "oldAccess.h"
#include "cac.h"
+ Include dependency graph for ca_client_context.cpp:

Go to the source code of this file.

Functions

void cacOnceFunc (void *)
 
void epicsStdCall caInstallDefaultService (cacService &service)
 
LIBCA_API int epicsStdCall ca_clear_subscription (evid pMon)
 

Variables

epicsThreadPrivateId caClientCallbackThreadId
 
epicsThreadPrivateId caClientContextId
 

Function Documentation

LIBCA_API int epicsStdCall ca_clear_subscription ( evid  pMon)

Definition at line 743 of file ca_client_context.cpp.

744 {
745  oldChannelNotify & chan = pMon->channel ();
746  ca_client_context & cac = chan.getClientCtx ();
747  // !!!! the order in which we take the mutex here prevents deadlocks
748  {
749  epicsGuard < epicsMutex > guard ( cac.mutex );
750  try {
751  // if this stalls out on a live circuit then an exception
752  // can be forthcoming which we must ignore as the clear
753  // request must always be successful
754  chan.eliminateExcessiveSendBacklog ( guard );
755  }
756  catch ( cacChannel::notConnected & ) {
757  // intentionally ignored
758  }
759  }
760  if ( cac.pCallbackGuard.get() &&
761  cac.createdByThread == epicsThreadGetIdSelf () ) {
762  epicsGuard < epicsMutex > guard ( cac.mutex );
763  pMon->cancel ( *cac.pCallbackGuard.get(), guard );
764  }
765  else {
766  //
767  // we will definately stall out here if all of the
768  // following are true
769  //
770  // o user creates non-preemtive mode client library context
771  // o user doesnt periodically call a ca function
772  // o user calls this function from an auxiillary thread
773  //
774  CallbackGuard cbGuard ( cac.cbMutex );
775  epicsGuard < epicsMutex > guard ( cac.mutex );
776  pMon->cancel ( cbGuard, guard );
777  }
778  return ECA_NORMAL;
779 }
Definition: cac.h:97
ca_client_context & getClientCtx()
Definition: oldAccess.h:428
#define ECA_NORMAL
Definition: caerr.h:77
void cancel(CallbackGuard &callbackGuard, epicsGuard< epicsMutex > &mutualExclusionGuard)
Definition: oldAccess.h:502
oldChannelNotify & channel() const
Definition: oldAccess.h:509
void eliminateExcessiveSendBacklog(epicsGuard< epicsMutex > &)
Definition: oldAccess.h:468
LIBCOM_API epicsThreadId epicsStdCall epicsThreadGetIdSelf(void)
Definition: osdThread.c:810
void cacOnceFunc ( void *  )

Definition at line 48 of file ca_client_context.cpp.

49 {
52  ca_client_context::pDefaultServiceInstallMutex = newEpicsMutex;
53 }
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
epicsThreadPrivateId caClientCallbackThreadId
LIBCOM_API epicsThreadPrivateId epicsStdCall epicsThreadPrivateCreate(void)
Definition: osdThread.c:934
void epicsStdCall caInstallDefaultService ( cacService service)

Definition at line 738 of file ca_client_context.cpp.

739 {
741 }
static void installDefaultService(cacService &)

Variable Documentation

epicsThreadPrivateId caClientCallbackThreadId

Definition at line 41 of file ca_client_context.cpp.

epicsThreadPrivateId caClientContextId

Definition at line 46 of file access.cpp.