wdbCtxExitLib.c
上传用户:baixin
上传日期:2008-03-13
资源大小:4795k
文件大小:4k
开发平台:

MultiPlatform

  1. /* wdbCtxExitLib.c - notify host of context exit */
  2. /* Copyright 1984-1998 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01e,26feb98,dbt  fixed a problem if a context is exited while in system mode.
  7.  return WDB_ERR_INVALID_EVENTPOINT when we can't delete a
  8.  context exit eventpoint (task no longer exists) to enable
  9.  a host tool to remove it in target server eventpoint list.
  10. 01d,26jan98,dbt  replaced wdbEventClassConnect() with wdbEvtptClassConnect().
  11.  replaced WDB_EVT_CLASS with WDB_EVTPT_CLASS
  12. 01c,23jan96,tpr  added cast to compile with Diab Data tools.
  13. 01b,22sep95,ms   allow removal of context exit eventpoints (SPR 4853)
  14. 01a,09mar95,ms   written.
  15. */
  16. /*
  17. DESCPRIPTION
  18. */
  19. #include "wdb/wdb.h"
  20. #include "wdb/wdbLibP.h"
  21. #include "wdb/wdbSvcLib.h"
  22. #include "wdb/wdbEvtLib.h"
  23. #include "wdb/wdbEvtptLib.h"
  24. #include "wdb/wdbRtIfLib.h"
  25. /* data types */
  26. typedef struct
  27.     {
  28.     WDB_EVT_NODE eventNode;
  29.     WDB_CTX context;
  30.     UINT32 returnVal;
  31.     UINT32 errnoVal;
  32.     } wdbCtxExitNode_t;
  33. /* local variables */
  34. LOCAL WDB_EVTPT_CLASS ctxExitClass;
  35. LOCAL wdbCtxExitNode_t externExitNode;
  36. /* forward static declarations */
  37. static UINT32 ctxExitEvtptAdd    (WDB_EVTPT_ADD_DESC *pEvtPt, UINT32 *pId);
  38. static UINT32 ctxExitEvtptDelete (TGT_ADDR_T *pId);
  39. /******************************************************************************
  40. *
  41. * wdbCtxExitLibInit - initialize the library.
  42. */
  43. void wdbCtxExitLibInit (void)
  44.     {
  45.     ctxExitClass.evtptType = WDB_EVT_CTX_EXIT;
  46.     ctxExitClass.evtptAdd = ctxExitEvtptAdd;
  47.     ctxExitClass.evtptDel = ctxExitEvtptDelete;
  48.     wdbEvtptClassConnect (&ctxExitClass);
  49.     }
  50. /******************************************************************************
  51. *
  52. * ctxExitEventGet - fill in the WDB_EVT_DATA for the host.
  53. */ 
  54. static void ctxExitEventGet
  55.     (
  56.     void * pNode,
  57.     WDB_EVT_DATA * pEvtData
  58.     )
  59.     {
  60.     wdbCtxExitNode_t * pExitNode = pNode;
  61.     WDB_CTX_EXIT_INFO * pCtxExitInfo;
  62.     pCtxExitInfo = (WDB_CTX_EXIT_INFO *)&pEvtData->eventInfo;
  63.     pEvtData->evtType = WDB_EVT_CTX_EXIT;
  64.     pCtxExitInfo->numInts = 4;
  65.     pCtxExitInfo->context = pExitNode->context;
  66.     pCtxExitInfo->returnVal = pExitNode->returnVal;
  67.     pCtxExitInfo->errnoVal = pExitNode->errnoVal;
  68.     }
  69. /******************************************************************************
  70. *
  71. * ctxExitEventDeq - dequeue the event node.
  72. */ 
  73. static void ctxExitEventDeq
  74.     (
  75.     void * pExitNode
  76.     )
  77.     {
  78.     if (wdbIsNowTasking ())
  79. (*pWdbRtIf->free) (pExitNode);
  80.     }
  81. /******************************************************************************
  82. *
  83. * wdbCtxExitNotifyHook - task-specific exit hook.
  84. */ 
  85. void wdbCtxExitNotifyHook
  86.     (
  87.     WDB_CTX context, /* exiting context */
  88.     UINT32 exitCode, /* exit code/return value */
  89.     UINT32 errnoVal /* errno value */
  90.     )
  91.     {
  92.     wdbCtxExitNode_t * pExitNode;
  93.     if (wdbIsNowExternal ())
  94. pExitNode = &externExitNode;
  95.     else
  96. {
  97. pExitNode = (wdbCtxExitNode_t *)(*pWdbRtIf->malloc)
  98. (sizeof (wdbCtxExitNode_t));
  99. if (pExitNode == NULL)
  100.     return;
  101. }
  102.     pExitNode->context  = context;
  103.     pExitNode->returnVal = exitCode;
  104.     pExitNode->errnoVal  = errnoVal;
  105.     wdbEventNodeInit (&pExitNode->eventNode, ctxExitEventGet, ctxExitEventDeq,
  106. pExitNode);
  107.     wdbEventPost (&pExitNode->eventNode);
  108.     }
  109. /******************************************************************************
  110. *
  111. * ctxExitEvtptAdd - notify the host when some task exits.
  112. */ 
  113. static UINT32 ctxExitEvtptAdd
  114.     (
  115.     WDB_EVTPT_ADD_DESC *pEvtPt,
  116.     UINT32 * pId
  117.     )
  118.     {
  119.     if ((*pWdbRtIf->taskDeleteHookAdd) (pEvtPt->context.contextId,
  120. wdbCtxExitNotifyHook) == ERROR)
  121. return (WDB_ERR_INVALID_CONTEXT);
  122.     *pId = pEvtPt->context.contextId;
  123.     return (OK);
  124.     }
  125. /******************************************************************************
  126. *
  127. * ctxExitEvtptDelete -
  128. */ 
  129. static UINT32 ctxExitEvtptDelete
  130.     (
  131.     TGT_ADDR_T *pId
  132.     )
  133.     {
  134.     if ((int ) *pId == -1) /* XXX - should delete all exit event points */
  135. return (OK);
  136.     if ((*pWdbRtIf->taskDeleteHookAdd) ((UINT32 ) *pId, NULL) == ERROR)
  137.         return (WDB_ERR_INVALID_EVENTPOINT);
  138.     return (OK);
  139.     }