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

VxWorks

开发平台:

C/C++

  1. /* wdbEvtptLib.c - Eventpoint library for the WDB agent */
  2. /* Copyright 1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01a,23jan98,dbt  written based on wdbEvtLib.c.
  7. */
  8. /*
  9. DESCRIPTION
  10. This library provides a framework for eventpoints.
  11. Many debugging facilities require the host to specify which
  12. eventpoints to look for. For example, the breakpoint library requires the
  13. host to set breakpoints at specific addresses, and the task-exit facility
  14. requires the host to tell it which task-exits to report.
  15. The host sets "eventpoints" by calling wdbEvtptAdd, specifying
  16. an EVENT and a CONTEXT. This library routes the request to the appropriate
  17. library based on the EVENT_TYPE field in the EVENT structure.
  18. The routine wdbEvtptClassConnect() allows libraries to register their 
  19. eventpoint services.
  20. */
  21. #include "vxWorks.h"
  22. #include "wdb/dll.h"
  23. #include "wdb/wdb.h"
  24. #include "wdb/wdbLibP.h"
  25. #include "wdb/wdbArchIfLib.h"
  26. #include "wdb/wdbSvcLib.h"
  27. #include "wdb/wdbEvtptLib.h"
  28. /* definitions */
  29. #ifndef offsetof
  30. #define offsetof(type, mbr) ((size_t) &((type *)0)->mbr)
  31. #endif
  32. #define STRUCT_BASE(s,m,p) ((s *)(void *)((char *)(p) - offsetof(s,m)))
  33. #define EVTPT_BASE(p) STRUCT_BASE(WDB_EVTPT_CLASS, evtptList, (p))
  34. /* local variables */
  35. static dll_t wdbEvtptClassList; /* attached libraries */
  36. /* forward declarations */
  37. static void _wdbEvtptDeleteAll (void);
  38. static UINT32 wdbEvtptAdd    (WDB_EVTPT_ADD_DESC * pEvt, UINT32 *pId);
  39. static UINT32 wdbEvtptDelete (WDB_EVTPT_DEL_DESC * pEvt);
  40. /******************************************************************************
  41. *
  42. * wdbEventpointLibInit - initialize the WDB eventpoint library.
  43. */
  44. void wdbEvtptLibInit (void)
  45.     {
  46.     static BOOL wdbEvtptLibInitialized = FALSE;
  47.     if (wdbEvtptLibInitialized)
  48. return;
  49.     dll_init (&wdbEvtptClassList);
  50.     __wdbEvtptDeleteAll   = _wdbEvtptDeleteAll;
  51.     wdbSvcAdd (WDB_EVENTPOINT_ADD, wdbEvtptAdd, xdr_WDB_EVTPT_ADD_DESC, 
  52. xdr_UINT32);
  53.     wdbSvcAdd (WDB_EVENTPOINT_DELETE, wdbEvtptDelete, xdr_WDB_EVTPT_DEL_DESC,
  54. xdr_void);
  55.     wdbEvtptLibInitialized = TRUE;
  56.     }
  57. /*******************************************************************************
  58. *
  59. * wdbEvtptClassConnect - connect an eventpoint class to wdbEvtptAdd
  60. *
  61. * Connect an event classes eventpointAdd routine to wdbEvtptAdd.
  62. * The class whose routine is called is based on the requested WDB_EVT_TYPE.
  63. */
  64. void wdbEvtptClassConnect
  65.     (
  66.     WDB_EVTPT_CLASS * pEvt
  67.     )
  68.     {
  69.     dll_insert(&pEvt->evtptList, &wdbEvtptClassList);
  70.     }
  71. /*******************************************************************************
  72. *
  73. * wdbEvtptAdd - add an eventpoint to some detection mechanism.
  74. *
  75. * This routine checks all the services registered (in the wdbEvtptClassList),
  76. * and calls the service which handles the requested WDB_EVT_TYPE.
  77. */
  78. static UINT32 wdbEvtptAdd
  79.     (
  80.     WDB_EVTPT_ADD_DESC * pEvtpt, /* eventpoint to add */
  81.     UINT32 * pId /* event-point ID returned */
  82.     )
  83.     {
  84.     dll_t * pDll;
  85.     for (pDll = dll_head(&wdbEvtptClassList);
  86.  pDll != dll_end(&wdbEvtptClassList);
  87.  pDll = dll_next(pDll))
  88. {
  89. if (pEvtpt->evtType == EVTPT_BASE(pDll)->evtptType)
  90.     return ((*EVTPT_BASE(pDll)->evtptAdd)(pEvtpt, pId));
  91. }
  92.     return (WDB_ERR_INVALID_EVENT);
  93.     }
  94. /******************************************************************************
  95. *
  96. * _wdbEvtptDeleteAll - delete all eventpoints in the system.
  97. */ 
  98. static void _wdbEvtptDeleteAll (void)
  99.     {
  100.     dll_t * pDll;
  101.     TGT_ADDR_T evtAllId = (TGT_ADDR_T)-1; /* ID for "all eventpoints" */
  102.     for (pDll = dll_head(&wdbEvtptClassList);
  103.  pDll != dll_end(&wdbEvtptClassList);
  104.  pDll = dll_next(pDll))
  105. {
  106. (*EVTPT_BASE(pDll)->evtptDel) (&evtAllId);
  107. }
  108.     }
  109. /*******************************************************************************
  110. *
  111. * wdbEvtptDelete - Delete an event point from the agent.
  112. *
  113. * pEvtptDel->evtptType is used to determine which event class's deletion
  114. * routine to call.
  115. */
  116. static UINT32 wdbEvtptDelete
  117.     (
  118.     WDB_EVTPT_DEL_DESC * pEvtptDel /* eventpoint to delete */
  119.     )
  120.     {
  121.     dll_t * pDll;
  122.     for (pDll = dll_head(&wdbEvtptClassList);
  123.  pDll != dll_end(&wdbEvtptClassList);
  124.  pDll = dll_next(pDll))
  125. {
  126. if (pEvtptDel->evtType == EVTPT_BASE(pDll)->evtptType)
  127.     return ((*EVTPT_BASE(pDll)->evtptDel) (&pEvtptDel->evtptId));
  128. }
  129.     return (WDB_ERR_INVALID_EVENTPOINT);
  130.     }