This is Unofficial EPICS BASE Doxygen Site
taskwd.h File Reference
#include "epicsThread.h"
#include "libComAPI.h"
+ Include dependency graph for taskwd.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  taskwdMonitor
 

Typedefs

typedef void(* TASKWDFUNC) (void *usr)
 
typedef void(* TASKWDANYFUNC) (void *usr, epicsThreadId tid)
 

Functions

LIBCOM_API void taskwdInit (void)
 
LIBCOM_API void taskwdInsert (epicsThreadId tid, TASKWDFUNC callback, void *usr)
 
LIBCOM_API void taskwdRemove (epicsThreadId tid)
 
LIBCOM_API void taskwdMonitorAdd (const taskwdMonitor *funcs, void *usr)
 
LIBCOM_API void taskwdMonitorDel (const taskwdMonitor *funcs, void *usr)
 
LIBCOM_API void taskwdAnyInsert (void *key, TASKWDANYFUNC callback, void *usr)
 
LIBCOM_API void taskwdAnyRemove (void *key)
 
LIBCOM_API void taskwdShow (int level)
 

Typedef Documentation

typedef void(* TASKWDANYFUNC) (void *usr, epicsThreadId tid)

Definition at line 51 of file taskwd.h.

typedef void(* TASKWDFUNC) (void *usr)

Definition at line 32 of file taskwd.h.

Function Documentation

LIBCOM_API void taskwdAnyInsert ( void *  key,
TASKWDANYFUNC  callback,
void *  usr 
)

Definition at line 305 of file taskwd.c.

306 {
307  struct mNode *pm;
308  struct aNode *pa;
309 
310  if (callback == NULL) return;
311 
312  taskwdInit();
313 
314  pa = &allocNode()->a;
315  pa->key = key;
316  pa->callback = callback;
317  pa->usr = usr;
318 
319  pm = &allocNode()->m;
320  pm->funcs = &anyFuncs;
321  pm->usr = pa;
322 
323  epicsMutexMustLock(mLock);
324  ellAdd(&mList, (void *)pm);
325  epicsMutexUnlock(mLock);
326 }
struct aNode a
Definition: taskwd.c:56
#define NULL
Definition: catime.c:38
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
const taskwdMonitor * funcs
Definition: taskwd.c:43
Definition: taskwd.c:47
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
Definition: ellLib.c:24
Definition: taskwd.c:41
Definition: caget.c:48
void * key
Definition: taskwd.c:48
void * usr
Definition: taskwd.c:50
TASKWDANYFUNC callback
Definition: taskwd.c:49
void * usr
Definition: taskwd.c:44
void taskwdInit(void)
Definition: taskwd.c:167
struct mNode m
Definition: taskwd.c:55
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
LIBCOM_API void taskwdAnyRemove ( void *  key)

Definition at line 328 of file taskwd.c.

329 {
330  struct mNode *pm;
331  struct aNode *pa;
332 
333  taskwdInit();
334 
335  epicsMutexMustLock(mLock);
336  pm = (struct mNode *)ellFirst(&mList);
337  while (pm) {
338  if (pm->funcs == &anyFuncs) {
339  pa = (struct aNode *)pm->usr;
340  if (pa->key == key) {
341  ellDelete(&mList, (void *)pm);
342  freeNode((union twdNode *)pa);
343  freeNode((union twdNode *)pm);
344  epicsMutexUnlock(mLock);
345  return;
346  }
347  }
348  pm = (struct mNode *)ellNext(&pm->node);
349  }
350  epicsMutexUnlock(mLock);
351 
352  errlogPrintf("taskwdAnyRemove: Unregistered key %p\n", key);
353 }
ELLNODE node
Definition: taskwd.c:42
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
const taskwdMonitor * funcs
Definition: taskwd.c:43
Definition: taskwd.c:47
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
Definition: taskwd.c:41
void * key
Definition: taskwd.c:48
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
void * usr
Definition: taskwd.c:44
Definition: taskwd.c:53
void taskwdInit(void)
Definition: taskwd.c:167
if(yy_init)
Definition: scan.c:972
#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 void taskwdInit ( void  )

Definition at line 167 of file taskwd.c.

168 {
169  static epicsThreadOnceId twdOnceFlag = EPICS_THREAD_ONCE_INIT;
170  epicsThreadOnce(&twdOnceFlag, twdInitOnce, NULL);
171 }
#define NULL
Definition: catime.c:38
#define EPICS_THREAD_ONCE_INIT
Definition: epicsThread.h:109
LIBCOM_API void epicsStdCall epicsThreadOnce(epicsThreadOnceId *id, EPICSTHREADFUNC, void *arg)
LIBCOM_API void taskwdInsert ( epicsThreadId  tid,
TASKWDFUNC  callback,
void *  usr 
)

Definition at line 176 of file taskwd.c.

177 {
178  struct tNode *pt;
179  struct mNode *pm;
180 
181  taskwdInit();
182  if (tid == 0)
183  tid = epicsThreadGetIdSelf();
184 
185  pt = &allocNode()->t;
186  pt->tid = tid;
187  pt->callback = callback;
188  pt->usr = usr;
189  pt->suspended = FALSE;
190 
191  epicsMutexMustLock(mLock);
192  pm = (struct mNode *)ellFirst(&mList);
193  while (pm) {
194  if (pm->funcs->insert) {
195  pm->funcs->insert(pm->usr, tid);
196  }
197  pm = (struct mNode *)ellNext(&pm->node);
198  }
199  epicsMutexUnlock(mLock);
200 
201  epicsMutexMustLock(tLock);
202  ellAdd(&tList, (void *)pt);
203  epicsMutexUnlock(tLock);
204 }
#define FALSE
Definition: dbDefs.h:32
Definition: taskwd.c:33
void(* insert)(void *usr, epicsThreadId tid)
Definition: taskwd.h:41
ELLNODE node
Definition: taskwd.c:42
void * usr
Definition: taskwd.c:37
int suspended
Definition: taskwd.c:38
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
const taskwdMonitor * funcs
Definition: taskwd.c:43
struct tNode t
Definition: taskwd.c:54
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
Definition: ellLib.c:24
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
Definition: taskwd.c:41
Definition: caget.c:48
TASKWDFUNC callback
Definition: taskwd.c:36
void * usr
Definition: taskwd.c:44
void taskwdInit(void)
Definition: taskwd.c:167
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
epicsThreadId tid
Definition: taskwd.c:35
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
LIBCOM_API epicsThreadId epicsStdCall epicsThreadGetIdSelf(void)
Definition: osdThread.c:810
LIBCOM_API void taskwdMonitorAdd ( const taskwdMonitor funcs,
void *  usr 
)

Definition at line 248 of file taskwd.c.

249 {
250  struct mNode *pm;
251 
252  if (funcs == NULL) return;
253 
254  taskwdInit();
255 
256  pm = &allocNode()->m;
257  pm->funcs = funcs;
258  pm->usr = usr;
259 
260  epicsMutexMustLock(mLock);
261  ellAdd(&mList, (void *)pm);
262  epicsMutexUnlock(mLock);
263 }
#define NULL
Definition: catime.c:38
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
const taskwdMonitor * funcs
Definition: taskwd.c:43
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
Definition: ellLib.c:24
Definition: taskwd.c:41
void * usr
Definition: taskwd.c:44
void taskwdInit(void)
Definition: taskwd.c:167
struct mNode m
Definition: taskwd.c:55
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
LIBCOM_API void taskwdMonitorDel ( const taskwdMonitor funcs,
void *  usr 
)

Definition at line 265 of file taskwd.c.

266 {
267  struct mNode *pm;
268 
269  if (funcs == NULL) return;
270 
271  taskwdInit();
272 
273  epicsMutexMustLock(mLock);
274  pm = (struct mNode *)ellFirst(&mList);
275  while (pm) {
276  if (pm->funcs == funcs && pm->usr == usr) {
277  ellDelete(&mList, (void *)pm);
278  freeNode((union twdNode *)pm);
279  epicsMutexUnlock(mLock);
280  return;
281  }
282  pm = (struct mNode *)ellNext(&pm->node);
283  }
284  epicsMutexUnlock(mLock);
285 
286  errlogPrintf("taskwdMonitorDel: Unregistered!\n");
287 }
ELLNODE node
Definition: taskwd.c:42
#define NULL
Definition: catime.c:38
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
const taskwdMonitor * funcs
Definition: taskwd.c:43
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
Definition: taskwd.c:41
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
void * usr
Definition: taskwd.c:44
Definition: taskwd.c:53
void taskwdInit(void)
Definition: taskwd.c:167
#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 void taskwdRemove ( epicsThreadId  tid)

Definition at line 206 of file taskwd.c.

207 {
208  struct tNode *pt;
209  struct mNode *pm;
210  char tName[40];
211 
212  taskwdInit();
213 
214  if (tid == 0)
215  tid = epicsThreadGetIdSelf();
216 
217  epicsMutexMustLock(tLock);
218  pt = (struct tNode *)ellFirst(&tList);
219  while (pt != NULL) {
220  if (tid == pt->tid) {
221  ellDelete(&tList, (void *)pt);
222  epicsMutexUnlock(tLock);
223  freeNode((union twdNode *)pt);
224 
225  epicsMutexMustLock(mLock);
226  pm = (struct mNode *)ellFirst(&mList);
227  while (pm) {
228  if (pm->funcs->remove) {
229  pm->funcs->remove(pm->usr, tid);
230  }
231  pm = (struct mNode *)ellNext(&pm->node);
232  }
233  epicsMutexUnlock(mLock);
234  return;
235  }
236  pt = (struct tNode *)ellNext(&pt->node);
237  }
238  epicsMutexUnlock(tLock);
239 
240  epicsThreadGetName(tid, tName, sizeof(tName));
241  errlogPrintf("taskwdRemove: Thread %s (%p) not registered!\n",
242  tName, (void *)tid);
243 }
Definition: taskwd.c:33
ELLNODE node
Definition: taskwd.c:42
#define NULL
Definition: catime.c:38
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
const taskwdMonitor * funcs
Definition: taskwd.c:43
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
Definition: taskwd.c:41
void(* remove)(void *usr, epicsThreadId tid)
Definition: taskwd.h:43
LIBCOM_API void epicsStdCall epicsThreadGetName(epicsThreadId id, char *name, size_t size)
Definition: osdThread.c:857
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
void * usr
Definition: taskwd.c:44
Definition: taskwd.c:53
ELLNODE node
Definition: taskwd.c:34
void taskwdInit(void)
Definition: taskwd.c:167
#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
epicsThreadId tid
Definition: taskwd.c:35
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
LIBCOM_API epicsThreadId epicsStdCall epicsThreadGetIdSelf(void)
Definition: osdThread.c:810
LIBCOM_API void taskwdShow ( int  level)

Definition at line 358 of file taskwd.c.

359 {
360  struct tNode *pt;
361  int mCount, fCount, tCount;
362  char tName[40];
363 
364  epicsMutexMustLock(mLock);
365  mCount = ellCount(&mList);
366  epicsMutexUnlock(mLock);
367 
368  epicsMutexMustLock(fLock);
369  fCount = ellCount(&fList);
370  epicsMutexUnlock(fLock);
371 
372  epicsMutexMustLock(tLock);
373  tCount = ellCount(&tList);
374  printf("%d monitors, %d threads registered, %d free nodes\n",
375  mCount, tCount, fCount);
376  if (level) {
377  printf("%16.16s %9s %12s %12s %12s\n",
378  "THREAD NAME", "STATE", "EPICS TID", "epicsCallback", "USR ARG");
379  pt = (struct tNode *)ellFirst(&tList);
380  while (pt != NULL) {
381  epicsThreadGetName(pt->tid, tName, sizeof(tName));
382  printf("%16.16s %9s %12p %12p %12p\n",
383  tName, pt->suspended ? "Suspended" : "Ok ",
384  (void *)pt->tid, (void *)pt->callback, pt->usr);
385  pt = (struct tNode *)ellNext(&pt->node);
386  }
387  }
388  epicsMutexUnlock(tLock);
389 }
Definition: taskwd.c:33
#define ellCount(PLIST)
Report the number of nodes in a list.
Definition: ellLib.h:84
#define printf
Definition: epicsStdio.h:41
#define NULL
Definition: catime.c:38
void * usr
Definition: taskwd.c:37
int suspended
Definition: taskwd.c:38
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
LIBCOM_API void epicsStdCall epicsThreadGetName(epicsThreadId id, char *name, size_t size)
Definition: osdThread.c:857
TASKWDFUNC callback
Definition: taskwd.c:36
ELLNODE node
Definition: taskwd.c:34
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
epicsThreadId tid
Definition: taskwd.c:35
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89