// extern "C" int epicsShareAPI ca_context_create ( ca_preemptive_callback_select premptiveCallbackSelect ) { ca_client_context *pcac; try { epicsThreadOnce ( & caClientContextIdOnce, ca_init_client_context, 0); if ( caClientContextId == 0 ) { return ECA_ALLOCMEM; } pcac = ( ca_client_context * ) epicsThreadPrivateGet ( caClientContextId ); if ( pcac ) { if ( premptiveCallbackSelect == ca_enable_preemptive_callback && ! pcac->preemptiveCallbakIsEnabled() ) { return ECA_NOTTHREADED; } return ECA_NORMAL; } pcac = new ca_client_context ( premptiveCallbackSelect == ca_enable_preemptive_callback ); if ( ! pcac ) { return ECA_ALLOCMEM; } epicsThreadPrivateSet ( caClientContextId, (void *) pcac ); } catch ( ... ) { return ECA_ALLOCMEM; } return ECA_NORMAL; }
void casAttachThreadToClient ( struct client *pClient ) { epicsSignalInstallSigAlarmIgnore (); epicsSignalInstallSigPipeIgnore (); pClient->tid = epicsThreadGetIdSelf (); epicsThreadPrivateSet ( rsrvCurrentClient, pClient ); taskwdInsert ( pClient->tid, NULL, NULL ); }
epicsShareFunc void epicsExitCallAtThreadExits(void) { exitPvt * pep; epicsThreadOnce ( & exitPvtOnce, exitPvtOnceFunc, 0 ); pep = epicsThreadPrivateGet ( exitPvtPerThread ); if ( pep ) { epicsExitCallAtExitsPvt ( pep ); destroyExitPvt ( pep ); epicsThreadPrivateSet ( exitPvtPerThread, 0 ); } }
// extern "C" int epicsShareAPI ca_attach_context ( struct ca_client_context * pCtx ) { ca_client_context *pcac = (ca_client_context *) epicsThreadPrivateGet ( caClientContextId ); if ( pcac && pCtx != 0 ) { return ECA_ISATTACHED; } if ( ! pCtx->preemptiveCallbakIsEnabled() ) { return ECA_NOTTHREADED; } epicsThreadPrivateSet ( caClientContextId, pCtx ); return ECA_NORMAL; }
// // ca_context_destroy () // // extern "C" void epicsShareAPI ca_context_destroy () { ca_client_context *pcac; if ( caClientContextId != NULL ) { pcac = (ca_client_context *) epicsThreadPrivateGet ( caClientContextId ); if ( pcac ) { delete pcac; epicsThreadPrivateSet ( caClientContextId, 0 ); } } }
epicsShareFunc int epicsAtThreadExit(epicsExitFunc func, void *arg) { exitPvt * pep; epicsThreadOnce ( & exitPvtOnce, exitPvtOnceFunc, 0 ); pep = epicsThreadPrivateGet ( exitPvtPerThread ); if ( ! pep ) { pep = createExitPvt (); if ( ! pep ) { return -1; } epicsThreadPrivateSet ( exitPvtPerThread, pep ); } return epicsAtExitPvt ( pep, func, arg ); }
void udpRecvThread::run () { epicsThreadPrivateSet ( caClientCallbackThreadId, &this->iiu ); if ( this->iiu._searchDestList.count () == 0 ) { callbackManager mgr ( this->ctxNotify, this->cbMutex ); epicsGuard < epicsMutex > guard ( this->iiu.cacMutex ); genLocalExcep ( mgr.cbGuard, guard, this->iiu.cacRef, ECA_NOSEARCHADDR, NULL ); } do { osiSockAddr src; osiSocklen_t src_size = sizeof ( src ); int status = recvfrom ( this->iiu.sock, this->iiu.recvBuf, sizeof ( this->iiu.recvBuf ), 0, & src.sa, & src_size ); if ( status <= 0 ) { if ( status < 0 ) { int errnoCpy = SOCKERRNO; if ( errnoCpy != SOCK_EINTR && errnoCpy != SOCK_SHUTDOWN && errnoCpy != SOCK_ENOTSOCK && errnoCpy != SOCK_EBADF && // Avoid spurious ECONNREFUSED bug in linux errnoCpy != SOCK_ECONNREFUSED && // Avoid ECONNRESET from disconnected socket bug // in windows errnoCpy != SOCK_ECONNRESET ) { char sockErrBuf[64]; epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) ); errlogPrintf ( "CAC: UDP recv error was \"%s\"\n", sockErrBuf ); } } } else if ( status > 0 ) { this->iiu.postMsg ( src, this->iiu.recvBuf, (arrayElementCount) status, epicsTime::getCurrent() ); } } while ( ! this->iiu.shutdownCmd ); }
void epicsShareAPI epicsSetThreadStdout(FILE *fp) { epicsThreadOnce(&onceId,once,0); epicsThreadPrivateSet(stdoutThreadPrivateId,fp); }
void epicsShareAPI ca_detach_context () { if ( caClientContextId ) { epicsThreadPrivateSet ( caClientContextId, 0 ); } }