This is Unofficial EPICS BASE Doxygen Site
access.cpp File Reference
#include <new>
#include <float.h>
#include "dbDefs.h"
#include "epicsExit.h"
#include "iocinf.h"
#include "oldAccess.h"
#include "cac.h"
+ Include dependency graph for access.cpp:

Go to the source code of this file.

Macros

#define epicsAssertAuthor   "Jeff Hill johill@lanl.gov"
 
#define CA_ERROR_GLBLSOURCE
 
#define CAC_VERSION_GLOBAL
 

Functions

void ca_init_client_context (void *)
 
int fetchClientContext (ca_client_context **ppcac)
 
int epicsStdCall ca_task_initialize (void)
 
int epicsStdCall ca_context_create (ca_preemptive_callback_select premptiveCallbackSelect)
 
int epicsStdCall ca_modify_host_name (const char *)
 
int epicsStdCall ca_modify_user_name (const char *)
 
void epicsStdCall ca_context_destroy ()
 
int epicsStdCall ca_task_exit ()
 
int epicsStdCall ca_build_and_connect (const char *name_str, chtype get_type, arrayElementCount get_count, chid *chan, void *pvalue, caCh *conn_func, void *puser)
 
int epicsStdCall ca_search_and_connect (const char *name_str, chid *chanptr, caCh *conn_func, void *puser)
 
int epicsStdCall ca_create_channel (const char *name_str, caCh *conn_func, void *puser, capri priority, chid *chanptr)
 
int epicsStdCall ca_clear_channel (chid pChan)
 
int epicsStdCall ca_add_exception_event (caExceptionHandler *pfunc, void *arg)
 
int epicsStdCall ca_add_masked_array_event (chtype type, arrayElementCount count, chid pChan, caEventCallBackFunc *pCallBack, void *pCallBackArg, ca_real, ca_real, ca_real, evid *monixptr, long mask)
 
int epicsStdCall ca_clear_event (evid pMon)
 
chid epicsStdCall ca_evid_to_chid (evid pMon)
 
int epicsStdCall ca_pend (ca_real timeout, int early)
 
int epicsStdCall ca_pend_event (ca_real timeout)
 
int epicsStdCall ca_pend_io (ca_real timeout)
 
int epicsStdCall ca_flush_io ()
 
int epicsStdCall ca_test_io ()
 
void epicsStdCall ca_signal (long ca_status, const char *message)
 
const char *epicsStdCall ca_message (long ca_status)
 
void epicsStdCall ca_signal_with_file_and_lineno (long ca_status, const char *message, const char *pfilenm, int lineno)
 
void epicsStdCall ca_signal_formated (long ca_status, const char *pfilenm, int lineno, const char *pFormat,...)
 
int epicsStdCall ca_add_fd_registration (CAFDHANDLER *func, void *arg)
 
const char *epicsStdCall ca_version ()
 
int epicsStdCall ca_replace_printf_handler (caPrintfFunc *ca_printf_func)
 
unsigned epicsStdCall ca_get_ioc_connection_count ()
 
unsigned epicsStdCall ca_beacon_anomaly_count ()
 
int epicsStdCall ca_channel_status (epicsThreadId)
 
int epicsStdCall ca_client_status (unsigned level)
 
int epicsStdCall ca_context_status (ca_client_context *pcac, unsigned level)
 
struct ca_client_context *epicsStdCall ca_current_context ()
 
int epicsStdCall ca_attach_context (struct ca_client_context *pCtx)
 
void epicsStdCall ca_detach_context ()
 
int epicsStdCall ca_preemtive_callback_is_enabled ()
 
void epicsStdCall ca_self_test ()
 

Variables

epicsThreadPrivateId caClientContextId
 
const char * ca_message_text []
 
const int epicsTypeToDBR_XXXX [lastEpicsType+1]
 
const epicsType DBR_XXXXToEpicsType [LAST_BUFFER_TYPE+1]
 
const unsigned short dbr_size [LAST_BUFFER_TYPE+1]
 
const unsigned short dbr_value_size [LAST_BUFFER_TYPE+1]
 
enum dbr_value_class dbr_value_class [LAST_BUFFER_TYPE+1]
 
const unsigned short dbr_value_offset [LAST_BUFFER_TYPE+1]
 
const char * dbf_text [LAST_TYPE+3]
 
const char * dbf_text_invalid = "DBF_invalid"
 
const short dbf_text_dim = (sizeof dbf_text)/(sizeof (char *))
 
const char * dbr_text [LAST_BUFFER_TYPE+1]
 
const char * dbr_text_invalid = "DBR_invalid"
 
const short dbr_text_dim = (sizeof dbr_text) / (sizeof (char *)) + 1
 

Macro Definition Documentation

#define CA_ERROR_GLBLSOURCE

Definition at line 35 of file access.cpp.

#define CAC_VERSION_GLOBAL

Definition at line 40 of file access.cpp.

#define epicsAssertAuthor   "Jeff Hill johill@lanl.gov"

Definition at line 28 of file access.cpp.

Function Documentation

int epicsStdCall ca_add_exception_event ( caExceptionHandler pfunc,
void *  arg 
)

Definition at line 402 of file access.cpp.

403 {
404  ca_client_context *pcac;
405  int caStatus = fetchClientContext ( &pcac );
406  if ( caStatus != ECA_NORMAL ) {
407  return caStatus;
408  }
409 
410  pcac->changeExceptionEvent ( pfunc, arg );
411 
412  return ECA_NORMAL;
413 }
#define ECA_NORMAL
Definition: caerr.h:77
int fetchClientContext(ca_client_context **ppcac)
Definition: access.cpp:137
void changeExceptionEvent(caExceptionHandler *pfunc, void *arg)
int epicsStdCall ca_add_fd_registration ( CAFDHANDLER func,
void *  arg 
)

Definition at line 623 of file access.cpp.

624 {
625  ca_client_context *pcac;
626  int caStatus = fetchClientContext ( &pcac );
627  if ( caStatus != ECA_NORMAL ) {
628  return caStatus;
629  }
630 
631  pcac->registerForFileDescriptorCallBack ( func, arg );
632 
633  return ECA_NORMAL;
634 }
#define ECA_NORMAL
Definition: caerr.h:77
int fetchClientContext(ca_client_context **ppcac)
Definition: access.cpp:137
void registerForFileDescriptorCallBack(CAFDHANDLER *pFunc, void *pArg)
int epicsStdCall ca_add_masked_array_event ( chtype  type,
arrayElementCount  count,
chid  pChan,
caEventCallBackFunc pCallBack,
void *  pCallBackArg,
ca_real  ,
ca_real  ,
ca_real  ,
evid monixptr,
long  mask 
)

Definition at line 418 of file access.cpp.

423 {
424  return ca_create_subscription ( type, count, pChan, mask,
425  pCallBack, pCallBackArg, monixptr );
426 }
pvd::StructureConstPtr type
LIBCA_API int epicsStdCall ca_create_subscription(chtype type, unsigned long count, chid chanId, long mask, caEventCallBackFunc *pFunc, void *pArg, evid *pEventID)
int epicsStdCall ca_attach_context ( struct ca_client_context pCtx)

Definition at line 746 of file access.cpp.

747 {
749  if ( pcac && pCtx != 0 ) {
750  return ECA_ISATTACHED;
751  }
752  if ( ! pCtx->preemptiveCallbakIsEnabled() ) {
753  return ECA_NOTTHREADED;
754  }
756  return ECA_NORMAL;
757 }
bool preemptiveCallbakIsEnabled() const
Definition: oldAccess.h:556
LIBCOM_API void *epicsStdCall epicsThreadPrivateGet(epicsThreadPrivateId)
Definition: osdThread.c:973
#define ECA_NORMAL
Definition: caerr.h:77
LIBCOM_API void epicsStdCall epicsThreadPrivateSet(epicsThreadPrivateId, void *)
Definition: osdThread.c:961
#define ECA_NOTTHREADED
Definition: caerr.h:134
epicsThreadPrivateId caClientContextId
Definition: access.cpp:46
#define ECA_ISATTACHED
Definition: caerr.h:130
unsigned epicsStdCall ca_beacon_anomaly_count ( void  )

Definition at line 681 of file access.cpp.

682 {
683  ca_client_context * pcac;
684  int caStatus = fetchClientContext ( & pcac );
685  if ( caStatus != ECA_NORMAL ) {
686  return 0u;
687  }
688 
689  return pcac->beaconAnomaliesSinceProgramStart ();
690 }
#define ECA_NORMAL
Definition: caerr.h:77
unsigned beaconAnomaliesSinceProgramStart() const
int fetchClientContext(ca_client_context **ppcac)
Definition: access.cpp:137
int epicsStdCall ca_build_and_connect ( const char *  name_str,
chtype  get_type,
arrayElementCount  get_count,
chid chan,
void *  pvalue,
caCh conn_func,
void *  puser 
)

Definition at line 264 of file access.cpp.

267 {
268  if ( get_type != TYPENOTCONN && pvalue != 0 && get_count != 0 ) {
269  return ECA_ANACHRONISM;
270  }
271 
272  return ca_search_and_connect ( name_str, chan, conn_func, puser );
273 }
int epicsStdCall ca_search_and_connect(const char *name_str, chid *chanptr, caCh *conn_func, void *puser)
Definition: access.cpp:279
#define ECA_ANACHRONISM
Definition: caerr.h:125
#define TYPENOTCONN
Definition: cadef.h:149
int epicsStdCall ca_channel_status ( epicsThreadId  )

Definition at line 693 of file access.cpp.

694 {
695  ::printf ("The R3.14 EPICS OS abstraction API does not allow peeking at thread private storage of another thread.\n");
696  ::printf ("Please call \"ca_client_status ( unsigned level )\" from the subsystem specific diagnostic code.\n");
697  return ECA_ANACHRONISM;
698 }
#define ECA_ANACHRONISM
Definition: caerr.h:125
#define printf
Definition: epicsStdio.h:41
int epicsStdCall ca_clear_channel ( chid  pChan)

Definition at line 363 of file access.cpp.

364 {
365  ca_client_context & cac = pChan->getClientCtx ();
366  {
367  epicsGuard < epicsMutex > guard ( cac.mutex );
368  try {
369  pChan->eliminateExcessiveSendBacklog ( guard );
370  }
371  catch ( cacChannel::notConnected & ) {
372  // intentionally ignored
373  }
374  }
375  if ( cac.pCallbackGuard.get() &&
376  cac.createdByThread == epicsThreadGetIdSelf () ) {
377  epicsGuard < epicsMutex > guard ( cac.mutex );
378  pChan->destructor ( *cac.pCallbackGuard.get(), guard );
379  cac.oldChannelNotifyFreeList.release ( pChan );
380  }
381  else {
382  //
383  // we will definately stall out here if all of the
384  // following are true
385  //
386  // o user creates non-preemtive mode client library context
387  // o user doesnt periodically call a ca function
388  // o user calls this function from an auxiillary thread
389  //
390  CallbackGuard cbGuard ( cac.cbMutex );
391  epicsGuard < epicsMutex > guard ( cac.mutex );
392  pChan->destructor ( *cac.pCallbackGuard.get(), guard );
393  cac.oldChannelNotifyFreeList.release ( pChan );
394  }
395  return ECA_NORMAL;
396 }
Definition: cac.h:97
ca_client_context & getClientCtx()
Definition: oldAccess.h:428
void destructor(CallbackGuard &cbGuard, epicsGuard< epicsMutex > &mutexGuard)
#define ECA_NORMAL
Definition: caerr.h:77
void release(void *p)
Definition: tsFreeList.h:176
void eliminateExcessiveSendBacklog(epicsGuard< epicsMutex > &)
Definition: oldAccess.h:468
LIBCOM_API epicsThreadId epicsStdCall epicsThreadGetIdSelf(void)
Definition: osdThread.c:810
int epicsStdCall ca_clear_event ( evid  pMon)

Definition at line 431 of file access.cpp.

432 {
433  return ca_clear_subscription ( pMon );
434 }
LIBCA_API int epicsStdCall ca_clear_subscription(evid pMon)
int epicsStdCall ca_client_status ( unsigned  level)

Definition at line 701 of file access.cpp.

702 {
703  ca_client_context *pcac;
704  int caStatus = fetchClientContext ( &pcac );
705  if ( caStatus != ECA_NORMAL ) {
706  return caStatus;
707  }
708 
709  pcac->show ( level );
710  return ECA_NORMAL;
711 }
#define ECA_NORMAL
Definition: caerr.h:77
int fetchClientContext(ca_client_context **ppcac)
Definition: access.cpp:137
void show(unsigned level) const
int epicsStdCall ca_context_create ( ca_preemptive_callback_select  premptiveCallbackSelect)

Definition at line 172 of file access.cpp.

174 {
175  ca_client_context *pcac;
176 
177  try {
178  epicsThreadOnce ( & caClientContextIdOnce, ca_init_client_context, 0);
179  if ( caClientContextId == 0 ) {
180  return ECA_ALLOCMEM;
181  }
182 
184  if ( pcac ) {
185  if ( premptiveCallbackSelect == ca_enable_preemptive_callback &&
186  ! pcac->preemptiveCallbakIsEnabled() ) {
187  return ECA_NOTTHREADED;
188  }
189  return ECA_NORMAL;
190  }
191 
192  pcac = new ca_client_context (
193  premptiveCallbackSelect == ca_enable_preemptive_callback );
194  if ( ! pcac ) {
195  return ECA_ALLOCMEM;
196  }
197 
198  epicsThreadPrivateSet ( caClientContextId, (void *) pcac );
199  }
200  catch ( ... ) {
201  return ECA_ALLOCMEM;
202  }
203  return ECA_NORMAL;
204 }
void ca_init_client_context(void *)
Definition: access.cpp:129
bool preemptiveCallbakIsEnabled() const
Definition: oldAccess.h:556
LIBCOM_API void *epicsStdCall epicsThreadPrivateGet(epicsThreadPrivateId)
Definition: osdThread.c:973
#define ECA_NORMAL
Definition: caerr.h:77
LIBCOM_API void epicsStdCall epicsThreadOnce(epicsThreadOnceId *id, EPICSTHREADFUNC, void *arg)
LIBCOM_API void epicsStdCall epicsThreadPrivateSet(epicsThreadPrivateId, void *)
Definition: osdThread.c:961
#define ECA_NOTTHREADED
Definition: caerr.h:134
epicsThreadPrivateId caClientContextId
Definition: access.cpp:46
#define ECA_ALLOCMEM
Definition: caerr.h:83
void epicsStdCall ca_context_destroy ( void  )

Definition at line 232 of file access.cpp.

233 {
234  ca_client_context *pcac;
235 
236  if ( caClientContextId != NULL ) {
238  if ( pcac ) {
239  delete pcac;
241  }
242  }
243 }
LIBCOM_API void *epicsStdCall epicsThreadPrivateGet(epicsThreadPrivateId)
Definition: osdThread.c:973
#define NULL
Definition: catime.c:38
LIBCOM_API void epicsStdCall epicsThreadPrivateSet(epicsThreadPrivateId, void *)
Definition: osdThread.c:961
epicsThreadPrivateId caClientContextId
Definition: access.cpp:46
int epicsStdCall ca_context_status ( ca_client_context pcac,
unsigned  level 
)

Definition at line 713 of file access.cpp.

714 {
715  pcac->show ( level );
716  return ECA_NORMAL;
717 }
#define ECA_NORMAL
Definition: caerr.h:77
void show(unsigned level) const
int epicsStdCall ca_create_channel ( const char *  name_str,
caCh conn_func,
void *  puser,
capri  priority,
chid chanptr 
)

Definition at line 288 of file access.cpp.

291 {
292  ca_client_context * pcac;
293  int caStatus = fetchClientContext ( & pcac );
294  if ( caStatus != ECA_NORMAL ) {
295  return caStatus;
296  }
297 
298  {
299  CAFDHANDLER * pFunc = 0;
300  void * pArg = 0;
301  {
303  guard ( pcac->mutex );
304  if ( pcac->fdRegFuncNeedsToBeCalled ) {
305  pFunc = pcac->fdRegFunc;
306  pArg = pcac->fdRegArg;
307  pcac->fdRegFuncNeedsToBeCalled = false;
308  }
309  }
310  if ( pFunc ) {
311  ( *pFunc ) ( pArg, pcac->sock, true );
312  }
313  }
314 
315  try {
316  epicsGuard < epicsMutex > guard ( pcac->mutex );
317  oldChannelNotify * pChanNotify =
318  new ( pcac->oldChannelNotifyFreeList )
319  oldChannelNotify ( guard, *pcac, name_str,
320  conn_func, puser, priority );
321  // make sure that their chan pointer is set prior to
322  // calling connection call backs
323  *chanptr = pChanNotify;
324  pChanNotify->initiateConnect ( guard );
325  // no need to worry about a connect preempting here because
326  // the connect sequence will not start untill initiateConnect()
327  // is called
328  }
329  catch ( cacChannel::badString & ) {
330  return ECA_BADSTR;
331  }
332  catch ( std::bad_alloc & ) {
333  return ECA_ALLOCMEM;
334  }
335  catch ( cacChannel::badPriority & ) {
336  return ECA_BADPRIORITY;
337  }
339  return ECA_UNAVAILINSERV;
340  }
341  catch ( std :: exception & except ) {
342  pcac->printFormated (
343  "ca_create_channel: "
344  "unexpected exception was \"%s\"",
345  except.what () );
346  return ECA_INTERNAL;
347  }
348  catch ( ... ) {
349  return ECA_INTERNAL;
350  }
351 
352  return ECA_NORMAL;
353 }
#define true
Definition: flexdef.h:84
#define ECA_INTERNAL
Definition: caerr.h:94
int printFormated(const char *pformat,...) const
void CAFDHANDLER(void *parg, int fd, int opened)
Definition: cadef.h:657
#define ECA_NORMAL
Definition: caerr.h:77
#define ECA_BADPRIORITY
Definition: caerr.h:133
void initiateConnect(epicsGuard< epicsMutex > &)
Definition: oldAccess.h:447
int fetchClientContext(ca_client_context **ppcac)
Definition: access.cpp:137
#define ECA_BADSTR
Definition: caerr.h:100
#define ECA_UNAVAILINSERV
Definition: caerr.h:131
#define ECA_ALLOCMEM
Definition: caerr.h:83
struct ca_client_context* epicsStdCall ca_current_context ( )

Definition at line 726 of file access.cpp.

727 {
728  struct ca_client_context *pCtx;
729  if ( caClientContextId ) {
730  pCtx = ( struct ca_client_context * )
732  }
733  else {
734  pCtx = 0;
735  }
736  return pCtx;
737 }
LIBCOM_API void *epicsStdCall epicsThreadPrivateGet(epicsThreadPrivateId)
Definition: osdThread.c:973
epicsThreadPrivateId caClientContextId
Definition: access.cpp:46
void epicsStdCall ca_detach_context ( )

Definition at line 759 of file access.cpp.

760 {
761  if ( caClientContextId ) {
763  }
764 }
LIBCOM_API void epicsStdCall epicsThreadPrivateSet(epicsThreadPrivateId, void *)
Definition: osdThread.c:961
epicsThreadPrivateId caClientContextId
Definition: access.cpp:46
chid epicsStdCall ca_evid_to_chid ( evid  pMon)

Definition at line 437 of file access.cpp.

438 {
439  return & pMon->channel ();
440 }
oldChannelNotify & channel() const
Definition: oldAccess.h:509
int epicsStdCall ca_flush_io ( void  )

Definition at line 509 of file access.cpp.

510 {
511  ca_client_context * pcac;
512  int caStatus = fetchClientContext (&pcac);
513  if ( caStatus != ECA_NORMAL ) {
514  return caStatus;
515  }
516 
517  epicsGuard < epicsMutex > guard ( pcac->mutex );
518  pcac->flush ( guard );
519 
520  return ECA_NORMAL;
521 }
#define ECA_NORMAL
Definition: caerr.h:77
int fetchClientContext(ca_client_context **ppcac)
Definition: access.cpp:137
void flush(epicsGuard< epicsMutex > &)
unsigned epicsStdCall ca_get_ioc_connection_count ( void  )

Definition at line 670 of file access.cpp.

671 {
672  ca_client_context * pcac;
673  int caStatus = fetchClientContext ( & pcac );
674  if ( caStatus != ECA_NORMAL ) {
675  return 0u;
676  }
677 
678  return pcac->circuitCount ();
679 }
#define ECA_NORMAL
Definition: caerr.h:77
int fetchClientContext(ca_client_context **ppcac)
Definition: access.cpp:137
unsigned circuitCount() const
void ca_init_client_context ( void *  )

Definition at line 129 of file access.cpp.

130 {
132 }
epicsThreadPrivateId caClientContextId
Definition: access.cpp:46
LIBCOM_API epicsThreadPrivateId epicsStdCall epicsThreadPrivateCreate(void)
Definition: osdThread.c:934
const char* epicsStdCall ca_message ( long  ca_status)

Definition at line 561 of file access.cpp.

562 {
563  unsigned msgNo = CA_EXTRACT_MSG_NO ( ca_status );
564 
565  if ( msgNo < NELEMENTS (ca_message_text) ) {
566  return ca_message_text[msgNo];
567  }
568  else {
569  return "new CA message number known only by server - see caerr.h";
570  }
571 }
#define CA_EXTRACT_MSG_NO(code)
Definition: caerr.h:54
const char * ca_message_text[]
Definition: access.cpp:49
#define NELEMENTS(A)
Definition: aToIPAddr.c:21
int epicsStdCall ca_modify_host_name ( const char *  )

Definition at line 212 of file access.cpp.

213 {
214  return ECA_NORMAL;
215 }
#define ECA_NORMAL
Definition: caerr.h:77
int epicsStdCall ca_modify_user_name ( const char *  )

Definition at line 223 of file access.cpp.

224 {
225  return ECA_NORMAL;
226 }
#define ECA_NORMAL
Definition: caerr.h:77
int epicsStdCall ca_pend ( ca_real  timeout,
int  early 
)

Definition at line 443 of file access.cpp.

444 {
445  if ( early ) {
446  return ca_pend_io ( timeout );
447  }
448  else {
449  return ca_pend_event ( timeout );
450  }
451 }
double timeout
Definition: pvutils.cpp:25
int epicsStdCall ca_pend_io(ca_real timeout)
Definition: access.cpp:484
int epicsStdCall ca_pend_event(ca_real timeout)
Definition: access.cpp:457
int epicsStdCall ca_pend_event ( ca_real  timeout)

Definition at line 457 of file access.cpp.

458 {
459  ca_client_context *pcac;
460  int status = fetchClientContext ( &pcac );
461  if ( status != ECA_NORMAL ) {
462  return status;
463  }
464 
465  try {
466  // preserve past odd ball behavior of waiting forever when
467  // the delay is zero
468  if ( timeout == 0.0 ) {
469  while ( true ) {
470  pcac->pendEvent ( 60.0 );
471  }
472  }
473  return pcac->pendEvent ( timeout );
474  }
475  catch ( ... ) {
476  return ECA_INTERNAL;
477  }
478 }
double timeout
Definition: pvutils.cpp:25
pvd::Status status
#define ECA_INTERNAL
Definition: caerr.h:94
#define ECA_NORMAL
Definition: caerr.h:77
int fetchClientContext(ca_client_context **ppcac)
Definition: access.cpp:137
int pendEvent(const double &timeout)
int epicsStdCall ca_pend_io ( ca_real  timeout)

Definition at line 484 of file access.cpp.

485 {
486  ca_client_context *pcac;
487  int status = fetchClientContext ( &pcac );
488  if ( status != ECA_NORMAL ) {
489  return status;
490  }
491 
492  try {
493  // preserve past odd ball behavior of waiting forever when
494  // the delay is zero
495  if ( timeout == 0.0 ) {
496  return pcac->pendIO ( DBL_MAX );
497  }
498 
499  return pcac->pendIO ( timeout );
500  }
501  catch ( ... ) {
502  return ECA_INTERNAL;
503  }
504 }
double timeout
Definition: pvutils.cpp:25
pvd::Status status
#define ECA_INTERNAL
Definition: caerr.h:94
#define ECA_NORMAL
Definition: caerr.h:77
int fetchClientContext(ca_client_context **ppcac)
Definition: access.cpp:137
int pendIO(const double &timeout)
int epicsStdCall ca_preemtive_callback_is_enabled ( void  )

Definition at line 766 of file access.cpp.

767 {
769  if ( ! pcac ) {
770  return 0;
771  }
772  return pcac->preemptiveCallbakIsEnabled ();
773 }
bool preemptiveCallbakIsEnabled() const
Definition: oldAccess.h:556
LIBCOM_API void *epicsStdCall epicsThreadPrivateGet(epicsThreadPrivateId)
Definition: osdThread.c:973
epicsThreadPrivateId caClientContextId
Definition: access.cpp:46
int epicsStdCall ca_replace_printf_handler ( caPrintfFunc ca_printf_func)

Definition at line 650 of file access.cpp.

651 {
652  ca_client_context *pcac;
653  int caStatus = fetchClientContext (&pcac);
654  if ( caStatus != ECA_NORMAL ) {
655  return caStatus;
656  }
657 
658  pcac->replaceErrLogHandler ( ca_printf_func );
659 
660  return ECA_NORMAL;
661 }
#define ECA_NORMAL
Definition: caerr.h:77
int fetchClientContext(ca_client_context **ppcac)
Definition: access.cpp:137
void replaceErrLogHandler(caPrintfFunc *ca_printf_func)
int epicsStdCall ca_search_and_connect ( const char *  name_str,
chid chanptr,
caCh conn_func,
void *  puser 
)

Definition at line 279 of file access.cpp.

282 {
283  return ca_create_channel ( name_str, conn_func,
284  puser, CA_PRIORITY_DEFAULT, chanptr );
285 }
#define CA_PRIORITY_DEFAULT
Definition: cadef.h:192
int epicsStdCall ca_create_channel(const char *name_str, caCh *conn_func, void *puser, capri priority, chid *chanptr)
Definition: access.cpp:288
void epicsStdCall ca_self_test ( void  )

Definition at line 777 of file access.cpp.

778 {
780  if ( ! pcac ) {
781  return;
782  }
783  pcac->selfTest ();
784 }
LIBCOM_API void *epicsStdCall epicsThreadPrivateGet(epicsThreadPrivateId)
Definition: osdThread.c:973
epicsThreadPrivateId caClientContextId
Definition: access.cpp:46
void epicsStdCall ca_signal ( long  ca_status,
const char *  message 
)

Definition at line 546 of file access.cpp.

547 {
548  ca_signal_with_file_and_lineno ( ca_status, message, NULL, 0 );
549 }
#define NULL
Definition: catime.c:38
void epicsStdCall ca_signal_with_file_and_lineno(long ca_status, const char *message, const char *pfilenm, int lineno)
Definition: access.cpp:577
void epicsStdCall ca_signal_formated ( long  ca_status,
const char *  pfilenm,
int  lineno,
const char *  pFormat,
  ... 
)

Definition at line 587 of file access.cpp.

589 {
590  ca_client_context *pcac;
591 
592  if ( caClientContextId ) {
594  }
595  else {
596  pcac = 0;
597  }
598 
599  va_list theArgs;
600  va_start ( theArgs, pFormat );
601  if ( pcac ) {
602  pcac->vSignal ( ca_status, pfilenm, lineno, pFormat, theArgs );
603  }
604  else {
605  fprintf ( stderr, "CA exception in thread w/o CA ctx: status=%s file=%s line=%d: \n",
606  ca_message ( ca_status ), pfilenm, lineno );
607  if ( pFormat ) {
608  vfprintf ( stderr, pFormat, theArgs );
609  }
610  }
611  va_end ( theArgs );
612 }
int lineno
Definition: antelope.c:33
LIBCOM_API void *epicsStdCall epicsThreadPrivateGet(epicsThreadPrivateId)
Definition: osdThread.c:973
epicsThreadPrivateId caClientContextId
Definition: access.cpp:46
const char *epicsStdCall ca_message(long ca_status)
Definition: access.cpp:561
#define stderr
Definition: epicsStdio.h:32
void vSignal(int ca_status, const char *pfilenm, int lineno, const char *pFormat, va_list args)
void epicsStdCall ca_signal_with_file_and_lineno ( long  ca_status,
const char *  message,
const char *  pfilenm,
int  lineno 
)

Definition at line 577 of file access.cpp.

579 {
580  ca_signal_formated ( ca_status, pfilenm, lineno, message );
581 }
int lineno
Definition: antelope.c:33
void epicsStdCall ca_signal_formated(long ca_status, const char *pfilenm, int lineno, const char *pFormat,...)
Definition: access.cpp:587
int epicsStdCall ca_task_exit ( void  )

Definition at line 251 of file access.cpp.

252 {
254  return ECA_NORMAL;
255 }
#define ECA_NORMAL
Definition: caerr.h:77
void epicsStdCall ca_context_destroy()
Definition: access.cpp:232
int epicsStdCall ca_task_initialize ( void  )

Definition at line 166 of file access.cpp.

167 {
169 }
int epicsStdCall ca_context_create(ca_preemptive_callback_select premptiveCallbackSelect)
Definition: access.cpp:172
int epicsStdCall ca_test_io ( void  )

Definition at line 526 of file access.cpp.

527 {
528  ca_client_context *pcac;
529  int caStatus = fetchClientContext ( &pcac );
530  if ( caStatus != ECA_NORMAL ) {
531  return caStatus;
532  }
533 
534  if ( pcac->ioComplete () ) {
535  return ECA_IODONE;
536  }
537  else{
538  return ECA_IOINPROGRESS;
539  }
540 }
#define ECA_IOINPROGRESS
Definition: caerr.h:120
#define ECA_IODONE
Definition: caerr.h:119
bool ioComplete() const
Definition: oldAccess.h:561
#define ECA_NORMAL
Definition: caerr.h:77
int fetchClientContext(ca_client_context **ppcac)
Definition: access.cpp:137
const char* epicsStdCall ca_version ( void  )

Definition at line 641 of file access.cpp.

642 {
644 }
#define CA_VERSION_STRING(MINOR_REVISION)
Definition: caProto.h:27
#define CA_MINOR_PROTOCOL_REVISION
Definition: nciu.h:35
int fetchClientContext ( ca_client_context **  ppcac)

Definition at line 137 of file access.cpp.

138 {
139  epicsThreadOnce ( &caClientContextIdOnce, ca_init_client_context, 0 );
140  if ( caClientContextId == 0 ) {
141  return ECA_ALLOCMEM;
142  }
143 
144  int status;
146  if ( *ppcac ) {
147  status = ECA_NORMAL;
148  }
149  else {
150  status = ca_task_initialize ();
151  if ( status == ECA_NORMAL ) {
153  if ( ! *ppcac ) {
154  status = ECA_INTERNAL;
155  }
156  }
157  }
158 
159  return status;
160 }
void ca_init_client_context(void *)
Definition: access.cpp:129
pvd::Status status
#define ECA_INTERNAL
Definition: caerr.h:94
LIBCOM_API void *epicsStdCall epicsThreadPrivateGet(epicsThreadPrivateId)
Definition: osdThread.c:973
#define ECA_NORMAL
Definition: caerr.h:77
LIBCOM_API void epicsStdCall epicsThreadOnce(epicsThreadOnceId *id, EPICSTHREADFUNC, void *arg)
int epicsStdCall ca_task_initialize(void)
Definition: access.cpp:166
epicsThreadPrivateId caClientContextId
Definition: access.cpp:46
#define ECA_ALLOCMEM
Definition: caerr.h:83

Variable Documentation

const char* ca_message_text[]

Definition at line 49 of file access.cpp.

epicsThreadPrivateId caClientContextId

Definition at line 46 of file access.cpp.

const char* dbf_text[LAST_TYPE+3]
Initial value:
= {
"TYPENOTCONN",
"DBF_STRING",
"DBF_SHORT",
"DBF_FLOAT",
"DBF_ENUM",
"DBF_CHAR",
"DBF_LONG",
"DBF_DOUBLE",
"DBF_NO_ACCESS"
}

Definition at line 1034 of file access.cpp.

const short dbf_text_dim = (sizeof dbf_text)/(sizeof (char *))

Definition at line 1048 of file access.cpp.

const char* dbf_text_invalid = "DBF_invalid"

Definition at line 1046 of file access.cpp.

const unsigned short dbr_size[LAST_BUFFER_TYPE+1]

Definition at line 847 of file access.cpp.

const char* dbr_text[LAST_BUFFER_TYPE+1]

Definition at line 1050 of file access.cpp.

const short dbr_text_dim = (sizeof dbr_text) / (sizeof (char *)) + 1

Definition at line 1094 of file access.cpp.

const char* dbr_text_invalid = "DBR_invalid"

Definition at line 1092 of file access.cpp.

Definition at line 946 of file access.cpp.

const unsigned short dbr_value_offset[LAST_BUFFER_TYPE+1]

Definition at line 992 of file access.cpp.

const unsigned short dbr_value_size[LAST_BUFFER_TYPE+1]

Definition at line 896 of file access.cpp.

const epicsType DBR_XXXXToEpicsType[LAST_BUFFER_TYPE+1]

Definition at line 800 of file access.cpp.

const int epicsTypeToDBR_XXXX[lastEpicsType+1]
Initial value:
= {
DBR_STRING
}
#define DBR_CHAR
Definition: db_access.h:74
#define DBR_STRING
Definition: db_access.h:69
#define DBR_FLOAT
Definition: db_access.h:72
#define DBR_DOUBLE
Definition: db_access.h:76
#define DBR_SHORT
Definition: db_access.h:71
#define DBR_ENUM
Definition: db_access.h:73
#define DBR_LONG
Definition: db_access.h:75

Definition at line 786 of file access.cpp.