wdbEvtLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* wdbEvtLib.c - Event library for the WDB agent */
  2. /* Copyright 1984-1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01e,27jan99,dbt  reworked dequeue mechanism (SPR #24654).
  7. 01d,26jan98,dbt  moved eventpoint handling to wdbEvtptLib.c
  8.  call event dequeue routine only if it is not NULL.
  9. 01c,31aug95,ms   events are now dequeued in FIFO order (SPR #4631)
  10. 01b,07jun95,ms   added _wdbEvtptDeleteAll
  11. 01a,01nov94,ms   written.
  12. */
  13. /*
  14. DESCRIPTION
  15. This library provides a framework for asynchrous debugging events.
  16. It provides a means for any library to send event data up to
  17. the host. Many debugging facilities require that the host
  18. be notified of some event occuring on the target at an unknow time in
  19. the future. Examples would be breakpoints, exceptions, the return
  20. of a function call, task exit, etc. The routine wdbEventPost() provides
  21. a means for all of these libraries to notify the host of async events.
  22. To post an event, a library must pass wdbEventPost() a static WDB_EVT_NODE
  23. structure. This structure is initialized via wdbEventNodeInit(), and
  24. should otherwise be treated as an abstract data type by other libraries.
  25. */
  26. #include "vxWorks.h"
  27. #include "wdb/dll.h"
  28. #include "wdb/wdb.h"
  29. #include "wdb/wdbLibP.h"
  30. #include "wdb/wdbArchIfLib.h"
  31. #include "wdb/wdbSvcLib.h"
  32. #include "wdb/wdbEvtLib.h"
  33. /* local variables */
  34. static dll_t wdbEventList; /* events for the host */
  35. /* forward declarations */
  36. static BOOL _wdbEventListIsEmpty (void);
  37. static UINT32 wdbEventGet    (void *dummy,  WDB_EVT_DATA *pEvtData);
  38. /******************************************************************************
  39. *
  40. * wdbEventLibInit - initialize the WDB event library.
  41. */
  42. void wdbEventLibInit (void)
  43.     {
  44.     dll_init (&wdbEventList);
  45.     __wdbEventListIsEmpty = _wdbEventListIsEmpty;
  46.     wdbSvcAdd (WDB_EVENT_GET, wdbEventGet, xdr_void, xdr_WDB_EVT_DATA);
  47.     }
  48. /******************************************************************************
  49. *
  50. * wdbEventNodeInit - Initialize an event node.
  51. *
  52. * Each eventpoint library (breakpoints, async function calls, exceptions,
  53. * etc.) uses WDB_EVT_NODE's to post asynchronous events to the host.
  54. *
  55. * A libary initializes an WDB_EVT_NODE, and then passes it to wdbEventPost()
  56. * in order to post an event to the host.
  57. * When the host is ready to recieve the event, the nodes getEvent() routine
  58. * is called to upload the data.
  59. * After the data has been uploaded, the nodes deq() routine is called
  60. * to return the node to the poster. If the poster has more event data
  61. * available, it can call wdbEventPost() again from within it's deq() routine.
  62. */
  63. void wdbEventNodeInit
  64.     (
  65.     WDB_EVT_NODE *pEvtNode, /* abstract data type */
  66.     void        (*getEvent) /* routine to upload event data */
  67.     (
  68.     void *arg,
  69.     WDB_EVT_DATA *pEvtMsg
  70.     ),
  71.     void        (*deq) /* called after data is uploaded */
  72.     (
  73.     void *arg
  74.     ),
  75.     void * arg /* arg to pass to routines above */
  76.     )
  77.     {
  78.     pEvtNode->getEvent = getEvent;
  79.     pEvtNode->deq = deq;
  80.     pEvtNode->arg = arg;
  81.     pEvtNode->onQueue = FALSE;
  82.     }
  83. /******************************************************************************
  84. *
  85. * wdbEventPost - post an event.
  86. *
  87. * Add an event node to the event list, and notfiy the host.
  88. * To save bandwidth, the host is only notified when the eventList
  89. * first becomes non-empty.
  90. */
  91. void wdbEventPost
  92.     (
  93.     WDB_EVT_NODE * pEvtNode
  94.     )
  95.     {
  96.     BOOL notify;
  97.     int lockKey;
  98.     lockKey = intLock();
  99.     /* already on the queue? then return */
  100.     if (pEvtNode->onQueue == TRUE)
  101.         {
  102.         intUnlock (lockKey);
  103.         return;
  104.         }
  105.     notify = wdbEventListIsEmpty();
  106.     dll_insert (&pEvtNode->node, &wdbEventList);
  107.     pEvtNode->onQueue = TRUE;
  108.     intUnlock (lockKey);
  109.     if (notify)
  110. {
  111.         wdbNotifyHost();
  112. }
  113.     }
  114. /******************************************************************************
  115. *
  116. * wdbEventDeq - dequeue an event from the event list.
  117. *
  118. * This routine can only be called from an agent RPC handler.
  119. *
  120. * RETURNS: OK, or ERROR if the node was not on the queue.
  121. */
  122. STATUS wdbEventDeq
  123.     (
  124.     WDB_EVT_NODE * pEvtNode
  125.     )
  126.     {
  127.     int lockKey;
  128.     lockKey = intLock();
  129.     /* already off the queue? then return ERROR */
  130.     if (pEvtNode->onQueue == FALSE)
  131. {
  132. intUnlock (lockKey);
  133. return (ERROR);
  134. }
  135.     /* else dll_remove it */
  136.     dll_remove (&pEvtNode->node);
  137.     pEvtNode->onQueue = FALSE;
  138.     intUnlock (lockKey);
  139.     /* call the nodes cleanup routine */
  140.     if (*pEvtNode->deq != NULL)
  141. (*pEvtNode->deq) (pEvtNode->arg);
  142.     return (OK);
  143.     }
  144. /******************************************************************************
  145. *
  146. * wdbEventGet - get an event from the agents event list.
  147. */
  148. static UINT32 wdbEventGet
  149.     (
  150.     void  * dummy, /* ignored */
  151.     WDB_EVT_DATA * pEvtData /* fill in this with the event data */
  152.     )
  153.     {
  154.     uint_t   lockKey;
  155.     WDB_EVT_NODE *  pEventNode = NULL;
  156.     lockKey = intLock();
  157.     if (!dll_empty (&wdbEventList))
  158. {
  159. /* remove the event from the queue */
  160. pEventNode = (WDB_EVT_NODE *)dll_tail (&wdbEventList);
  161. dll_remove (&pEventNode->node);
  162. pEventNode->onQueue = FALSE;
  163. }
  164.     intUnlock (lockKey);
  165.     /* if the event list is empty return a WDB_EVT_NONE */
  166.     if (pEventNode == NULL)
  167.         {
  168.         pEvtData->evtType = WDB_EVT_NONE;
  169.         return (OK);
  170.         }
  171.     /* get event data from the event node */
  172.     (*pEventNode->getEvent) (pEventNode->arg, pEvtData);
  173.     /* call the nodes cleanup routine */
  174.     if (*pEventNode->deq != NULL)
  175. (*pEventNode->deq) (pEventNode->arg);
  176.     return (OK);
  177.     }
  178. /******************************************************************************
  179. *
  180. * _wdbEventListIsEmpty -
  181. */
  182. static BOOL _wdbEventListIsEmpty (void)
  183.     {
  184.     return (dll_empty (&wdbEventList));
  185.     }