This is Unofficial EPICS BASE Doxygen Site
errlog.h File Reference
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include "libComAPI.h"
#include "compilerDependencies.h"
+ Include dependency graph for errlog.h:

Go to the source code of this file.

Macros

#define errMessage(S, PM)   errPrintf(S, __FILE__, __LINE__, "%s", PM)
 
#define epicsPrintf   errlogPrintf
 
#define epicsVprintf   errlogVprintf
 

Typedefs

typedef void(* errlogListener) (void *pPrivate, const char *message)
 

Enumerations

enum  errlogSevEnum { errlogInfo, errlogMinor, errlogMajor, errlogFatal }
 

Functions

LIBCOM_API int errlogPrintf (const char *pformat,...) EPICS_PRINTF_STYLE(1
 
LIBCOM_API int LIBCOM_API int errlogVprintf (const char *pformat, va_list pvar)
 
LIBCOM_API int errlogSevPrintf (const errlogSevEnum severity, const char *pformat,...) EPICS_PRINTF_STYLE(2
 
LIBCOM_API int LIBCOM_API int errlogSevVprintf (const errlogSevEnum severity, const char *pformat, va_list pvar)
 
LIBCOM_API int errlogMessage (const char *message)
 
LIBCOM_API const char * errlogGetSevEnumString (errlogSevEnum severity)
 
LIBCOM_API void errlogSetSevToLog (errlogSevEnum severity)
 
LIBCOM_API errlogSevEnum errlogGetSevToLog (void)
 
LIBCOM_API void errlogAddListener (errlogListener listener, void *pPrivate)
 
LIBCOM_API int errlogRemoveListeners (errlogListener listener, void *pPrivate)
 
LIBCOM_API int eltc (int yesno)
 
LIBCOM_API int errlogSetConsole (FILE *stream)
 
LIBCOM_API int errlogInit (int bufsize)
 
LIBCOM_API int errlogInit2 (int bufsize, int maxMsgSize)
 
LIBCOM_API void errlogFlush (void)
 
LIBCOM_API void errPrintf (long status, const char *pFileName, int lineno, const char *pformat,...) EPICS_PRINTF_STYLE(4
 
LIBCOM_API void LIBCOM_API int errlogPrintfNoConsole (const char *pformat,...) EPICS_PRINTF_STYLE(1
 
LIBCOM_API void LIBCOM_API int LIBCOM_API int errlogVprintfNoConsole (const char *pformat, va_list pvar)
 
LIBCOM_API void errSymLookup (long status, char *pBuf, size_t bufLength)
 

Variables

LIBCOM_API int errVerbose
 
LIBCOM_API const char * errlogSevEnumString []
 

Macro Definition Documentation

#define epicsPrintf   errlogPrintf

Definition at line 51 of file errlog.h.

#define epicsVprintf   errlogVprintf

Definition at line 52 of file errlog.h.

#define errMessage (   S,
  PM 
)    errPrintf(S, __FILE__, __LINE__, "%s", PM)

Definition at line 48 of file errlog.h.

Typedef Documentation

typedef void(* errlogListener) (void *pPrivate, const char *message)

Definition at line 24 of file errlog.h.

Enumeration Type Documentation

Enumerator
errlogInfo 
errlogMinor 
errlogMajor 
errlogFatal 

Definition at line 26 of file errlog.h.

26  {
27  errlogInfo,
errlogSevEnum
Definition: errlog.h:26

Function Documentation

LIBCOM_API int eltc ( int  yesno)

Definition at line 368 of file errlog.c.

369 {
370  errlogInit(0);
371  errlogFlush();
372  pvtData.toConsole = yesno;
373  return 0;
374 }
void errlogFlush(void)
Definition: errlog.c:529
int errlogInit(int bufsize)
Definition: errlog.c:524
LIBCOM_API void errlogAddListener ( errlogListener  listener,
void *  pPrivate 
)

Definition at line 317 of file errlog.c.

318 {
319  listenerNode *plistenerNode;
320 
321  errlogInit(0);
322  if (pvtData.atExit)
323  return;
324 
325  plistenerNode = callocMustSucceed(1,sizeof(listenerNode),
326  "errlogAddListener");
327  epicsMutexMustLock(pvtData.listenerLock);
328  plistenerNode->listener = listener;
329  plistenerNode->pPrivate = pPrivate;
330  ellAdd(&pvtData.listenerList,&plistenerNode->node);
331  epicsMutexUnlock(pvtData.listenerLock);
332 }
ELLNODE node
Definition: errlog.c:52
void * pPrivate
Definition: errlog.c:54
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
int errlogInit(int bufsize)
Definition: errlog.c:524
struct listener listener
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
Definition: ellLib.c:24
LIBCOM_API void * callocMustSucceed(size_t count, size_t size, const char *msg)
A calloc() that never returns NULL.
Definition: cantProceed.c:22
errlogListener listener
Definition: errlog.c:53
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
LIBCOM_API void errlogFlush ( void  )

Definition at line 529 of file errlog.c.

530 {
531  int count;
532 
533  errlogInit(0);
534  if (pvtData.atExit)
535  return;
536 
537  /*If nothing in queue dont wake up errlogThread*/
538  epicsMutexMustLock(pvtData.msgQueueLock);
539  count = ellCount(&pvtData.msgQueue);
540  epicsMutexUnlock(pvtData.msgQueueLock);
541  if (count <= 0)
542  return;
543 
544  /*must let errlogThread empty queue*/
545  epicsMutexMustLock(pvtData.flushLock);
546  epicsEventSignal(pvtData.flush);
547  epicsEventSignal(pvtData.waitForWork);
548  epicsEventMustWait(pvtData.waitForFlush);
549  epicsMutexUnlock(pvtData.flushLock);
550 }
#define ellCount(PLIST)
Report the number of nodes in a list.
Definition: ellLib.h:84
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
LIBCOM_API void epicsEventMustWait(epicsEventId id)
Wait for an event (see epicsEventWait()).
Definition: epicsEvent.cpp:123
int errlogInit(int bufsize)
Definition: errlog.c:524
#define epicsEventSignal(ID)
A synonym for epicsEventTrigger().
Definition: epicsEvent.h:172
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
LIBCOM_API const char* errlogGetSevEnumString ( errlogSevEnum  severity)

Definition at line 297 of file errlog.c.

298 {
299  errlogInit(0);
300  if (severity > 3)
301  return "unknown";
302  return errlogSevEnumString[severity];
303 }
int errlogInit(int bufsize)
Definition: errlog.c:524
LIBCOM_API const char * errlogSevEnumString[]
LIBCOM_API errlogSevEnum errlogGetSevToLog ( void  )

Definition at line 311 of file errlog.c.

312 {
313  errlogInit(0);
314  return pvtData.sevToLog;
315 }
int errlogInit(int bufsize)
Definition: errlog.c:524
LIBCOM_API int errlogInit ( int  bufsize)

Definition at line 524 of file errlog.c.

525 {
527 }
int errlogInit2(int bufsize, int maxMsgSize)
Definition: errlog.c:500
int bufsize
Definition: errlog.c:461
#define MAX_MESSAGE_SIZE
Definition: errlog.c:38
LIBCOM_API int errlogInit2 ( int  bufsize,
int  maxMsgSize 
)

Definition at line 500 of file errlog.c.

501 {
502  static epicsThreadOnceId errlogOnceFlag = EPICS_THREAD_ONCE_INIT;
503  struct initArgs config;
504 
505  if (pvtData.atExit)
506  return 0;
507 
508  if (bufsize < BUFFER_SIZE)
510  config.bufsize = bufsize;
511 
514  config.maxMsgSize = maxMsgSize;
515 
516  epicsThreadOnce(&errlogOnceFlag, errlogInitPvt, &config);
517  if (pvtData.errlogInitFailed) {
518  fprintf(stderr,"errlogInit failed\n");
519  exit(1);
520  }
521  return 0;
522 }
int bufsize
Definition: errlog.c:461
#define MAX_MESSAGE_SIZE
Definition: errlog.c:38
#define BUFFER_SIZE
Definition: errlog.c:37
#define EPICS_THREAD_ONCE_INIT
Definition: epicsThread.h:109
int maxMsgSize
Definition: errlog.c:79
LIBCOM_API void epicsStdCall epicsThreadOnce(epicsThreadOnceId *id, EPICSTHREADFUNC, void *arg)
#define stderr
Definition: epicsStdio.h:32
LIBCOM_API int errlogMessage ( const char *  message)

Definition at line 180 of file errlog.c.

181 {
182  errlogPrintf("%s", message);
183  return 0;
184 }
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
LIBCOM_API int errlogPrintf ( const char *  pformat,
  ... 
)
LIBCOM_API void LIBCOM_API int errlogPrintfNoConsole ( const char *  pformat,
  ... 
)
LIBCOM_API int errlogRemoveListeners ( errlogListener  listener,
void *  pPrivate 
)

Definition at line 334 of file errlog.c.

335 {
336  listenerNode *plistenerNode;
337  int count = 0;
338 
339  errlogInit(0);
340  if (!pvtData.atExit)
341  epicsMutexMustLock(pvtData.listenerLock);
342 
343  plistenerNode = (listenerNode *)ellFirst(&pvtData.listenerList);
344  while (plistenerNode) {
345  listenerNode *pnext = (listenerNode *)ellNext(&plistenerNode->node);
346 
347  if (plistenerNode->listener == listener &&
348  plistenerNode->pPrivate == pPrivate) {
349  ellDelete(&pvtData.listenerList, &plistenerNode->node);
350  free(plistenerNode);
351  ++count;
352  }
353  plistenerNode = pnext;
354  }
355 
356  if (!pvtData.atExit)
357  epicsMutexUnlock(pvtData.listenerLock);
358 
359  if (count == 0) {
360  FILE *console = pvtData.console ? pvtData.console : stderr;
361 
362  fprintf(console,
363  "errlogRemoveListeners: No listeners found\n");
364  }
365  return count;
366 }
ELLNODE node
Definition: errlog.c:52
void * pPrivate
Definition: errlog.c:54
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
int errlogInit(int bufsize)
Definition: errlog.c:524
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
FILE * console
Definition: errlog.c:83
errlogListener listener
Definition: errlog.c:53
#define stderr
Definition: epicsStdio.h:32
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
void ellDelete(ELLLIST *pList, ELLNODE *pNode)
Deletes a node from a list.
Definition: ellLib.c:75
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
LIBCOM_API int errlogSetConsole ( FILE *  stream)

Definition at line 376 of file errlog.c.

377 {
378  errlogInit(0);
379  pvtData.console = stream;
380  return 0;
381 }
int errlogInit(int bufsize)
Definition: errlog.c:524
LIBCOM_API void errlogSetSevToLog ( errlogSevEnum  severity)

Definition at line 305 of file errlog.c.

306 {
307  errlogInit(0);
308  pvtData.sevToLog = severity;
309 }
int errlogInit(int bufsize)
Definition: errlog.c:524
LIBCOM_API int errlogSevPrintf ( const errlogSevEnum  severity,
const char *  pformat,
  ... 
)
LIBCOM_API int LIBCOM_API int errlogSevVprintf ( const errlogSevEnum  severity,
const char *  pformat,
va_list  pvar 
)

Definition at line 262 of file errlog.c.

263 {
264  char *pnext;
265  int nchar;
266  int totalChar = 0;
267  int isOkToBlock;
268 
271  ("errlogSevVprintf called from interrupt level\n");
272  return 0;
273  }
274 
275  errlogInit(0);
276  if (pvtData.atExit)
277  return 0;
278 
279  isOkToBlock = epicsThreadIsOkToBlock();
280  pnext = msgbufGetFree(isOkToBlock);
281  if (!pnext)
282  return 0;
283 
284  nchar = sprintf(pnext, "sevr=%s ", errlogGetSevEnumString(severity));
285  pnext += nchar; totalChar += nchar;
286  nchar = tvsnPrint(pnext, pvtData.maxMsgSize - totalChar - 1, pFormat, pvar);
287  pnext += nchar; totalChar += nchar;
288  if (pnext[-1] != '\n') {
289  strcpy(pnext,"\n");
290  totalChar++;
291  }
292  msgbufSetSize(totalChar);
293  return nchar;
294 }
int errlogInit(int bufsize)
Definition: errlog.c:524
LIBCOM_API int epicsInterruptIsInterruptContext(void)
Definition: osdInterrupt.c:48
LIBCOM_API void epicsInterruptContextMessage(const char *message)
Definition: osdInterrupt.c:53
int epicsStdCall epicsThreadIsOkToBlock(void)
const char * errlogGetSevEnumString(errlogSevEnum severity)
Definition: errlog.c:297
LIBCOM_API int LIBCOM_API int errlogVprintf ( const char *  pformat,
va_list  pvar 
)

Definition at line 144 of file errlog.c.

145 {
146  int nchar;
147  char *pbuffer;
148  int isOkToBlock;
149  FILE *console;
150 
153  ("errlogVprintf called from interrupt level\n");
154  return 0;
155  }
156 
157  errlogInit(0);
158  if (pvtData.atExit)
159  return 0;
160  isOkToBlock = epicsThreadIsOkToBlock();
161 
162  pbuffer = msgbufGetFree(isOkToBlock);
163  if (!pbuffer) {
164  console = pvtData.console ? pvtData.console : stderr;
165  vfprintf(console, pFormat, pvar);
166  fflush(console);
167  return 0;
168  }
169 
170  nchar = tvsnPrint(pbuffer, pvtData.maxMsgSize, pFormat?pFormat:"", pvar);
171  if (pvtData.atExit || (isOkToBlock && pvtData.toConsole)) {
172  console = pvtData.console ? pvtData.console : stderr;
173  fprintf(console, "%s", pbuffer);
174  fflush(console);
175  }
176  msgbufSetSize(nchar);
177  return nchar;
178 }
int errlogInit(int bufsize)
Definition: errlog.c:524
LIBCOM_API int epicsInterruptIsInterruptContext(void)
Definition: osdInterrupt.c:48
FILE * console
Definition: errlog.c:83
LIBCOM_API void epicsInterruptContextMessage(const char *message)
Definition: osdInterrupt.c:53
char * pbuffer
Definition: errlog.c:85
int epicsStdCall epicsThreadIsOkToBlock(void)
#define stderr
Definition: epicsStdio.h:32
LIBCOM_API void LIBCOM_API int LIBCOM_API int errlogVprintfNoConsole ( const char *  pformat,
va_list  pvar 
)

Definition at line 204 of file errlog.c.

205 {
206  int nchar;
207  char *pbuffer;
208 
211  ("errlogVprintfNoConsole called from interrupt level\n");
212  return 0;
213  }
214 
215  errlogInit(0);
216  if (pvtData.atExit)
217  return 0;
218 
219  pbuffer = msgbufGetFree(1);
220  if (!pbuffer)
221  return 0;
222 
223  nchar = tvsnPrint(pbuffer, pvtData.maxMsgSize, pFormat?pFormat:"", pvar);
224  msgbufSetSize(nchar);
225  return nchar;
226 }
int errlogInit(int bufsize)
Definition: errlog.c:524
LIBCOM_API int epicsInterruptIsInterruptContext(void)
Definition: osdInterrupt.c:48
LIBCOM_API void epicsInterruptContextMessage(const char *message)
Definition: osdInterrupt.c:53
char * pbuffer
Definition: errlog.c:85
LIBCOM_API void errPrintf ( long  status,
const char *  pFileName,
int  lineno,
const char *  pformat,
  ... 
)
LIBCOM_API void errSymLookup ( long  status,
char *  pBuf,
size_t  bufLength 
)

Definition at line 190 of file errSymLib.c.

191 {
192  const char* msg = errSymLookupInternal(status);
193  if(msg) {
194  strncpy(pBuf, msg, bufLength-1);
195  pBuf[bufLength-1] = '\0';
196  return;
197  }
198  errRawCopy(status, pBuf, bufLength);
199 }
pvd::Status status

Variable Documentation

LIBCOM_API const char* errlogSevEnumString[]
LIBCOM_API int errVerbose

Definition at line 41 of file errlog.c.