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

VxWorks

开发平台:

C/C++

  1. /* wdbCtxStart.c - notify host of context creation */
  2. /* Copyright 1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01a,25feb98,dbt  written.
  7. */
  8. /*
  9. DESCPRIPTION
  10. This library provides routines to notify host on context creation.
  11. NOMANUAL
  12. */
  13. #include "vxWorks.h"
  14. #include "taskHookLib.h"
  15. #include "wdb/wdb.h"
  16. #include "wdb/wdbLibP.h"
  17. #include "wdb/wdbSvcLib.h"
  18. #include "wdb/wdbEvtLib.h"
  19. #include "wdb/wdbEvtptLib.h"
  20. #include "wdb/wdbRtIfLib.h"
  21. /* data types */
  22. typedef struct
  23.     {
  24.     WDB_EVT_NODE eventNode;
  25.     WDB_CTX createdCtx;
  26.     WDB_CTX creationCtx;
  27.     } wdbCtxStartNode_t;
  28. /* local variables */
  29. LOCAL WDB_EVTPT_CLASS wdbCtxStartClass;
  30. LOCAL wdbCtxStartNode_t externStartNode;
  31. LOCAL UINT32 wdbCtxStartEvtptCount;
  32. /* forward static declarations */
  33. static UINT32 wdbCtxStartEvtptAdd (WDB_EVTPT_ADD_DESC *pEvtPt, UINT32 *pId);
  34. static UINT32 wdbCtxStartEvtptDelete (TGT_ADDR_T *pId);
  35. /******************************************************************************
  36. *
  37. * wdbCtxStartInit - initialize the library
  38. *
  39. * RETURNS : N/A
  40. *
  41. * NOMANUAL
  42. */
  43. void wdbCtxStartLibInit (void)
  44.     {
  45.     wdbCtxStartClass.evtptType = WDB_EVT_CTX_START;
  46.     wdbCtxStartClass.evtptAdd = wdbCtxStartEvtptAdd;
  47.     wdbCtxStartClass.evtptDel = wdbCtxStartEvtptDelete;
  48.     /* initialize context start eventpoint count */
  49.     wdbCtxStartEvtptCount = 0;
  50.     wdbEvtptClassConnect (&wdbCtxStartClass);
  51.     }
  52. /******************************************************************************
  53. *
  54. * wdbCtxStartEventGet - fill in the WDB_EVT_DATA for the host.
  55. * This routine fills in the WDB_EVT_DATA with event informations. 
  56. *
  57. * RETURNS: N/A
  58. */ 
  59. static void wdbCtxStartEventGet
  60.     (
  61.     void * pNode,
  62.     WDB_EVT_DATA * pEvtData
  63.     )
  64.     {
  65.     wdbCtxStartNode_t * pStartNode = pNode;
  66.     WDB_CTX_START_INFO * pCtxStartInfo;
  67.     pCtxStartInfo = (WDB_CTX_START_INFO *)&pEvtData->eventInfo;
  68.     pEvtData->evtType = WDB_EVT_CTX_START;
  69.     pCtxStartInfo->numInts = 4;
  70.     pCtxStartInfo->createdCtx = pStartNode->createdCtx;
  71.     pCtxStartInfo->creationCtx = pStartNode->creationCtx;
  72.     }
  73. /******************************************************************************
  74. *
  75. * wdbCtxStartEventDeq - dequeue the event node.
  76. *
  77. * This routine dequeues the event node.
  78. *
  79. * RETURNS: N/A
  80. */ 
  81. static void wdbCtxStartEventDeq
  82.     (
  83.     void * pStartNode
  84.     )
  85.     {
  86.     if (wdbIsNowTasking ())
  87. (*pWdbRtIf->free) (pStartNode);
  88.     }
  89. /******************************************************************************
  90. *
  91. * wdbCtxStartNotifyHook - task-specific create hook.
  92. *
  93. * This routine is called at every task creation in order to notify the
  94. * host of this creation.
  95. *
  96. * RETURNS: N/A
  97. */ 
  98. static void wdbCtxStartNotifyHook
  99.     (
  100.     WDB_CTX * createdCtx, /* created context */
  101.     WDB_CTX * creationCtx /* context where it was created from */
  102.     )
  103.     {
  104.     wdbCtxStartNode_t * pStartNode;
  105.     if (wdbIsNowExternal ())
  106. pStartNode = &externStartNode;
  107.     else
  108. {
  109. pStartNode = (wdbCtxStartNode_t *)(*pWdbRtIf->malloc)
  110.     (sizeof (wdbCtxStartNode_t));
  111. if (pStartNode == NULL)
  112.     return;
  113. }
  114.     pStartNode->createdCtx  = *createdCtx;
  115.     pStartNode->creationCtx  = *creationCtx;
  116.     wdbEventNodeInit (&pStartNode->eventNode, wdbCtxStartEventGet, 
  117. wdbCtxStartEventDeq, pStartNode);
  118.     wdbEventPost (&pStartNode->eventNode);
  119.     }
  120. /******************************************************************************
  121. *
  122. * wdbCtxStartEvtptAdd - notify the host when some task exits.
  123. *
  124. * Add a context start eventpoint
  125. *
  126. * RETURN : WDB_OK always.
  127. */ 
  128. static UINT32 wdbCtxStartEvtptAdd
  129.     (
  130.     WDB_EVTPT_ADD_DESC * pEvtPt,
  131.     UINT32 * pId
  132.     )
  133.     {
  134.     (*pWdbRtIf->taskCreateHookAdd) (wdbCtxStartNotifyHook);
  135.     wdbCtxStartEvtptCount ++;
  136.     /* XXX DBT hack to get a unique eventpoint ID */
  137.     *pId = (UINT32)&wdbCtxStartEvtptCount;
  138.     return (OK);
  139.     }
  140. /******************************************************************************
  141. *
  142. * wdbCtxStartEvtptDelete - delete context start eventpoint
  143. *
  144. * This routine deletes a context start eventpoint.
  145. *
  146. * RETURNS : WDB_OK always.
  147. */ 
  148. static UINT32 wdbCtxStartEvtptDelete
  149.     (
  150.     TGT_ADDR_T *pId
  151.     )
  152.     {
  153.     if ((int ) *pId == -1) /* remove all context start eventpoints */
  154. {
  155. (*pWdbRtIf->taskCreateHookAdd) (NULL);
  156. wdbCtxStartEvtptCount = 0;
  157. return (WDB_OK);
  158. }
  159.     /* test if there is an eventpoint to delete and if the ID is good */
  160.     if (wdbCtxStartEvtptCount == 0 || 
  161. ((int ) *pId != (int) &wdbCtxStartEvtptCount))
  162. return (WDB_ERR_INVALID_EVENTPOINT);
  163.     /* 
  164.      * Remove the context start notification hook only if there are no
  165.      * more context start eventpoints.
  166.      */
  167.     if (wdbCtxStartEvtptCount == 1)
  168. (*pWdbRtIf->taskCreateHookAdd) (NULL);
  169.     wdbCtxStartEvtptCount --;
  170.     return (WDB_OK);
  171.     }