epicsShareFunc int epicsShareAPI errlogRemoveListeners( errlogListener listener, void *pPrivate) { listenerNode *plistenerNode; int count = 0; errlogInit(0); if (!pvtData.atExit) epicsMutexMustLock(pvtData.listenerLock); plistenerNode = (listenerNode *)ellFirst(&pvtData.listenerList); while (plistenerNode) { listenerNode *pnext = (listenerNode *)ellNext(&plistenerNode->node); if (plistenerNode->listener == listener && plistenerNode->pPrivate == pPrivate) { ellDelete(&pvtData.listenerList, &plistenerNode->node); free(plistenerNode); ++count; } plistenerNode = pnext; } if (!pvtData.atExit) epicsMutexUnlock(pvtData.listenerLock); if (count == 0) { fprintf(pvtData.console, "errlogRemoveListeners: No listeners found\n"); } return count; }
static int iocBuild_1(void) { if (iocState != iocVirgin && iocState != iocStopped) { errlogPrintf("iocBuild: IOC can only be initialized from uninitialized or stopped state\n"); return -1; } errlogInit(0); initHookAnnounce(initHookAtIocBuild); if (!epicsThreadIsOkToBlock()) { epicsThreadSetOkToBlock(1); } errlogPrintf("Starting iocInit\n"); if (checkDatabase(pdbbase)) { errlogPrintf("iocBuild: Aborting, bad database definition (DBD)!\n"); return -1; } epicsSignalInstallSigHupIgnore(); initHookAnnounce(initHookAtBeginning); coreRelease(); iocState = iocBuilding; taskwdInit(); callbackInit(); initHookAnnounce(initHookAfterCallbackInit); return 0; }
epicsShareFunc int epicsShareAPI eltc(int yesno) { errlogInit(0); errlogFlush(); pvtData.toConsole = yesno; return 0; }
epicsShareFunc int errlogSevVprintf( const errlogSevEnum severity,const char *pFormat,va_list pvar) { char *pnext; int nchar; int totalChar = 0; int isOkToBlock; if (epicsInterruptIsInterruptContext()) { epicsInterruptContextMessage ("errlogSevVprintf called from interrupt level\n"); return 0; } errlogInit(0); if (pvtData.atExit) return 0; isOkToBlock = epicsThreadIsOkToBlock(); pnext = msgbufGetFree(isOkToBlock); if (!pnext) return 0; nchar = sprintf(pnext, "sevr=%s ", errlogGetSevEnumString(severity)); pnext += nchar; totalChar += nchar; nchar = tvsnPrint(pnext, pvtData.maxMsgSize - totalChar - 1, pFormat, pvar); pnext += nchar; totalChar += nchar; if (pnext[-1] != '\n') { strcpy(pnext,"\n"); totalChar++; } msgbufSetSize(totalChar); return nchar; }
epicsShareFunc int errlogSevPrintf( const errlogSevEnum severity,const char *pFormat, ...) { va_list pvar; int nchar; int isOkToBlock; if (epicsInterruptIsInterruptContext()) { epicsInterruptContextMessage ("errlogSevPrintf called from interrupt level\n"); return 0; } errlogInit(0); if (pvtData.sevToLog > severity) return 0; isOkToBlock = epicsThreadIsOkToBlock(); if (pvtData.atExit || (isOkToBlock && pvtData.toConsole)) { fprintf(pvtData.console, "sevr=%s ", errlogGetSevEnumString(severity)); va_start(pvar, pFormat); vfprintf(pvtData.console, pFormat, pvar); va_end(pvar); fflush(pvtData.console); } va_start(pvar, pFormat); nchar = errlogSevVprintf(severity, pFormat, pvar); va_end(pvar); return nchar; }
epicsShareFunc int errlogVprintf( const char *pFormat,va_list pvar) { int nchar; char *pbuffer; int isOkToBlock; if (epicsInterruptIsInterruptContext()) { epicsInterruptContextMessage ("errlogVprintf called from interrupt level\n"); return 0; } errlogInit(0); if (pvtData.atExit) return 0; isOkToBlock = epicsThreadIsOkToBlock(); pbuffer = msgbufGetFree(isOkToBlock); if (!pbuffer) { vfprintf(pvtData.console, pFormat, pvar); fflush(pvtData.console); return 0; } nchar = tvsnPrint(pbuffer, pvtData.maxMsgSize, pFormat?pFormat:"", pvar); if (pvtData.atExit || (isOkToBlock && pvtData.toConsole)) { fprintf(pvtData.console, "%s", pbuffer); fflush(pvtData.console); } msgbufSetSize(nchar); return nchar; }
epicsShareFunc char * epicsShareAPI errlogGetSevEnumString( const errlogSevEnum severity) { errlogInit(0); if (severity > 3) return "unknown"; return errlogSevEnumString[severity]; }
epicsShareFunc void epicsShareAPI errlogAddListener( errlogListener listener, void *pPrivate) { listenerNode *plistenerNode; errlogInit(0); if (pvtData.atExit) return; plistenerNode = callocMustSucceed(1,sizeof(listenerNode), "errlogAddListener"); epicsMutexMustLock(pvtData.listenerLock); plistenerNode->listener = listener; plistenerNode->pPrivate = pPrivate; ellAdd(&pvtData.listenerList,&plistenerNode->node); epicsMutexUnlock(pvtData.listenerLock); }
epicsShareFunc int errlogPrintfNoConsole( const char *pFormat, ...) { va_list pvar; int nchar; if (epicsInterruptIsInterruptContext()) { epicsInterruptContextMessage ("errlogPrintfNoConsole called from interrupt level\n"); return 0; } errlogInit(0); va_start(pvar, pFormat); nchar = errlogVprintfNoConsole(pFormat, pvar); va_end(pvar); return nchar; }
epicsShareFunc void epicsShareAPI errlogFlush(void) { int count; errlogInit(0); if (pvtData.atExit) return; /*If nothing in queue dont wake up errlogThread*/ epicsMutexMustLock(pvtData.msgQueueLock); count = ellCount(&pvtData.msgQueue); epicsMutexUnlock(pvtData.msgQueueLock); if (count <= 0) return; /*must let errlogThread empty queue*/ epicsMutexMustLock(pvtData.flushLock); epicsEventSignal(pvtData.flush); epicsEventSignal(pvtData.waitForWork); epicsEventMustWait(pvtData.waitForFlush); epicsMutexUnlock(pvtData.flushLock); }
epicsShareFunc int errlogVprintfNoConsole( const char *pFormat,va_list pvar) { int nchar; char *pbuffer; if (epicsInterruptIsInterruptContext()) { epicsInterruptContextMessage ("errlogVprintfNoConsole called from interrupt level\n"); return 0; } errlogInit(0); if (pvtData.atExit) return 0; pbuffer = msgbufGetFree(1); if (!pbuffer) return 0; nchar = tvsnPrint(pbuffer, pvtData.maxMsgSize, pFormat?pFormat:"", pvar); msgbufSetSize(nchar); return nchar; }
epicsShareFunc void errPrintf(long status, const char *pFileName, int lineno, const char *pformat, ...) { va_list pvar; char *pnext; int nchar; int totalChar=0; int isOkToBlock; char name[256]; if (epicsInterruptIsInterruptContext()) { epicsInterruptContextMessage("errPrintf called from interrupt level\n"); return; } errlogInit(0); isOkToBlock = epicsThreadIsOkToBlock(); if (status == 0) status = errno; if (status > 0) { errSymLookup(status, name, sizeof(name)); } if (pvtData.atExit || (isOkToBlock && pvtData.toConsole)) { if (pFileName) fprintf(pvtData.console, "filename=\"%s\" line number=%d\n", pFileName, lineno); if (status > 0) fprintf(pvtData.console, "%s ", name); va_start(pvar, pformat); vfprintf(pvtData.console, pformat, pvar); va_end(pvar); fputc('\n', pvtData.console); fflush(pvtData.console); } if (pvtData.atExit) return; pnext = msgbufGetFree(isOkToBlock); if (!pnext) return; if (pFileName) { nchar = sprintf(pnext,"filename=\"%s\" line number=%d\n", pFileName, lineno); pnext += nchar; totalChar += nchar; } if (status > 0) { nchar = sprintf(pnext,"%s ",name); pnext += nchar; totalChar += nchar; } va_start(pvar, pformat); nchar = tvsnPrint(pnext, pvtData.maxMsgSize - totalChar - 1, pformat, pvar); va_end(pvar); if (nchar>0) { pnext += nchar; totalChar += nchar; } strcpy(pnext, "\n"); totalChar++ ; /*include the \n */ msgbufSetSize(totalChar); }
epicsShareFunc int errlogSetConsole(FILE *stream) { errlogInit(0); pvtData.console = stream ? stream : stderr; return 0; }
epicsShareFunc errlogSevEnum epicsShareAPI errlogGetSevToLog(void) { errlogInit(0); return pvtData.sevToLog; }
epicsShareFunc void epicsShareAPI errlogSetSevToLog( const errlogSevEnum severity) { errlogInit(0); pvtData.sevToLog = severity; }