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

VxWorks

开发平台:

C/C++

  1. /* taskInfo.c - task information library */
  2. /* Copyright 1984-1993 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01j,18dec00,pes  Correct compiler warnings
  8. 01i,29may98,cym  removed all ifdefs for SIMNT since the register set is now
  9. current.
  10. 01h,04mar98,jmb  add dec'l
  11. 01g,06jan98,cym  changed taskRegsGet for SIMNT to update TCB from 
  12.  windows context.
  13. 01g,10nov97,dbt  modified taskBpHook() routine interface.
  14. 01f,29oct96,jdi  doc: taskName() returns empty string of the task has no name.
  15. 01e,06oct95,jdi  changed Debugging .pG's to .tG "Shell".
  16. 01d,25feb93,jdi  doc: reinstated VX_UNBREAKABLE as publishable option, per kdl.
  17. 01c,04feb93,jdi  documentation cleanup for 5.1.
  18. 01b,04jan04,wmd  added check of calling task id before calling 
  19.  taskRegsStackToTcb() for the i960 in taskRegsGet().
  20.  added predeclarations for i960 to get rid of warnings.
  21. 01a,23aug92,jcf  extracted from v02y of taskLib.c.
  22. */
  23. /*
  24. DESCRIPTION
  25. This library provides a programmatic interface for obtaining task information.
  26. Task information is crucial as a debugging aid and user-interface 
  27. convenience during the development cycle of an application.  
  28. The routines taskOptionsGet(), taskRegsGet(), taskName(), taskNameToId(), 
  29. taskIsReady(), taskIsSuspended(), and taskIdListGet() are used to obtain
  30. task information.  Three routines -- taskOptionsSet(), taskRegsSet(), and
  31. taskIdDefault() -- provide programmatic access to debugging features.
  32. The chief drawback of using task information is that tasks may
  33. change their state between the time the information is gathered and the
  34. time it is utilized.  Information provided by these routines should
  35. therefore be viewed as a snapshot of the system, and not relied upon
  36. unless the task is consigned to a known state, such as suspended.
  37. Task management and control routines are provided by taskLib.  Higher-level
  38. task information display routines are provided by taskShow.
  39. INCLUDE FILES: taskLib.h
  40. SEE ALSO: taskLib, taskShow, taskHookLib, taskVarLib, semLib, kernelLib,
  41. .pG "Basic OS"
  42. */
  43. #include "vxWorks.h"
  44. #include "errno.h"
  45. #include "semLib.h"
  46. #include "string.h"
  47. #include "regs.h"
  48. #include "intLib.h"
  49. #include "taskArchLib.h"
  50. #include "stdio.h"
  51. #include "memLib.h"
  52. #include "private/sigLibP.h"
  53. #include "private/classLibP.h"
  54. #include "private/objLibP.h"
  55. #include "private/smObjLibP.h"
  56. #include "private/smFixBlkLibP.h"
  57. #include "private/taskLibP.h"
  58. #include "private/kernelLibP.h"
  59. #include "private/workQLibP.h"
  60. #include "private/windLibP.h"
  61. /* external function declarations */
  62. #if CPU_FAMILY==I960
  63. void taskRegsStackToTcb (WIND_TCB *pTcb);
  64. void taskRegsTcbToStack (WIND_TCB *pTcb);
  65. #endif
  66. /* forward static functions */
  67. static BOOL taskNameNoMatch (Q_NODE *pNode, char *name);
  68. /*******************************************************************************
  69. *
  70. * taskOptionsSet - change task options
  71. *
  72. * This routine changes the execution options of a task.
  73. * The only option that can be changed after a task has been created is:
  74. * .iP VX_UNBREAKABLE 21
  75. * do not allow breakpoint debugging.
  76. * .LP
  77. * For definitions, see taskLib.h.
  78. *
  79. * RETURNS: OK, or ERROR if the task ID is invalid.
  80. *
  81. * SEE ALSO: taskOptionsGet()
  82. */
  83. STATUS taskOptionsSet
  84.     (
  85.     int tid,                    /* task ID */
  86.     int mask,                   /* bit mask of option bits to unset */
  87.     int newOptions              /* bit mask of option bits to set */
  88.     )
  89.     {
  90.     FAST WIND_TCB *pTcb;
  91.     if (INT_RESTRICT () != OK) /* restrict interrupt use */
  92. return (ERROR);
  93.     taskLock (); /* LOCK PREEMPTION */
  94.     if ((pTcb = taskTcb (tid)) == NULL) /* check task ID validity */
  95. {
  96. taskUnlock (); /* UNLOCK PREEMPTION */
  97. return (ERROR);
  98. }
  99.     /* update the task options */
  100.     pTcb->options = (pTcb->options & ~mask) | newOptions;
  101.     /* 
  102.      * If we are setting/resetting unbreakable option for current task,
  103.      * then call breakpoint callout.
  104.      */
  105.     if (((mask & VX_UNBREAKABLE) || (newOptions & VX_UNBREAKABLE)) &&
  106. ((tid == 0) || (tid == (int)taskIdCurrent)) &&
  107. (taskBpHook != NULL))
  108. {
  109. (* taskBpHook) (tid);
  110. }
  111.     taskUnlock (); /* UNLOCK PREEMPTION */
  112.     return (OK);
  113.     }
  114. /*******************************************************************************
  115. *
  116. * taskOptionsGet - examine task options
  117. *
  118. * This routine gets the current execution options of the specified task.
  119. * The option bits returned by this routine indicate the following modes:
  120. * .iP VX_FP_TASK 22
  121. * execute with floating-point coprocessor support.
  122. * .iP VX_PRIVATE_ENV
  123. * include private environment support (see envLib).
  124. * .iP VX_NO_STACK_FILL
  125. * do not fill the stack for use by checkstack().
  126. * .iP VX_UNBREAKABLE
  127. * do not allow breakpoint debugging.
  128. * .LP
  129. * For definitions, see taskLib.h.
  130. *
  131. * RETURNS: OK, or ERROR if the task ID is invalid.
  132. *
  133. * SEE ALSO: taskOptionsSet()
  134. */
  135. STATUS taskOptionsGet
  136.     (
  137.     int tid,                    /* task ID */
  138.     int *pOptions               /* task's options */
  139.     )
  140.     {
  141.     WIND_TCB *pTcb = taskTcb (tid); /* get pointer to tcb */
  142.     if (pTcb == NULL) /* invalid task ID */
  143. return (ERROR);
  144.     *pOptions = pTcb->options; /* fill in the options */
  145.     return (OK);
  146.     }
  147. /*******************************************************************************
  148. *
  149. * taskBpHookSet - set breakpoint hook for dbgLib
  150. *
  151. * This routine allows dbgLib to install its break-point install/remove routine
  152. * used by taskOptionsSet.  It should only be called by dbgInit().
  153. *
  154. * NOMANUAL
  155. */
  156. void taskBpHookSet
  157.     (
  158.     FUNCPTR bpHook
  159.     )
  160.     {
  161.     taskBpHook = bpHook;
  162.     }
  163. /*******************************************************************************
  164. *
  165. * taskRegsGet - get a task's registers from the TCB
  166. *
  167. * This routine gathers task information kept in the TCB.  It copies the
  168. * contents of the task's registers to the register structure <pRegs>.
  169. *
  170. * NOTE
  171. * This routine only works well if the task is known to be in a stable,
  172. * non-executing state.  Self-examination, for instance, is not advisable,
  173. * as results are unpredictable.
  174. *
  175. * RETURNS: OK, or ERROR if the task ID is invalid.
  176. *
  177. * SEE ALSO: taskSuspend(), taskRegsSet()
  178. */
  179. STATUS taskRegsGet
  180.     (
  181.     int         tid,    /* task ID */
  182.     REG_SET     *pRegs  /* put register contents here */
  183.     )
  184.     {
  185.     FAST WIND_TCB *pTcb = taskTcb (tid);
  186.     if (pTcb == NULL)
  187. return (ERROR);
  188. #if CPU_FAMILY==I960
  189.     if (tid != taskIdSelf ())
  190.      taskRegsStackToTcb (pTcb);
  191. #endif /* CPU_FAMILY==I960 */
  192.     if (pTcb->pExcRegSet != NULL)
  193. {
  194. bcopy ((char *)pTcb->pExcRegSet, (char *)&pTcb->regs, sizeof (REG_SET));
  195.         pTcb->pExcRegSet = NULL;
  196. }
  197.     bcopy ((char *) &pTcb->regs, (char *) pRegs, sizeof (REG_SET));
  198.     return (OK);
  199.     }
  200. /*******************************************************************************
  201. *
  202. * taskRegsSet - set a task's registers
  203. *
  204. * This routine loads a specified register set <pRegs> into a specified
  205. * task's TCB.
  206. *
  207. * NOTE
  208. * This routine only works well if the task is known not to be in the ready
  209. * state.  Suspending the task before changing the register set is
  210. * recommended.
  211. *
  212. * RETURNS: OK, or ERROR if the task ID is invalid.
  213. *
  214. * SEE ALSO: taskSuspend(), taskRegsGet()
  215. */
  216. STATUS taskRegsSet
  217.     (
  218.     int         tid,    /* task ID */
  219.     REG_SET     *pRegs  /* get register contents from here */
  220.     )
  221.     {
  222.     FAST WIND_TCB *pTcb = taskTcb (tid);
  223.     if (pTcb == NULL)
  224. return (ERROR);
  225.     bcopy ((char *) pRegs, (char *) &pTcb->regs, sizeof (REG_SET));
  226. #if CPU_FAMILY==I960
  227.     taskRegsTcbToStack (pTcb);
  228. #endif /* CPU_FAMILY==I960 */
  229.     return (OK);
  230.     }
  231. /*******************************************************************************
  232. *
  233. * taskName - get the name associated with a task ID
  234. *
  235. * This routine returns a pointer to the name of a task of a specified ID, if
  236. * the task has a name.  If the task has no name, it returns an empty string. 
  237. *
  238. * RETURNS: A pointer to the task name, or NULL if the task ID is invalid.
  239. */
  240. char *taskName
  241.     (
  242.     int tid             /* ID of task whose name is to be found */
  243.     )
  244.     {
  245.     WIND_TCB *pTcb = taskTcb (tid);
  246.     if (pTcb ==  NULL)
  247. return ((char *) NULL);
  248.     if (pTcb->name == NULL)
  249. return ("");
  250.     else
  251. return (pTcb->name);
  252.     }
  253. /*******************************************************************************
  254. *
  255. * taskNameToId - look up the task ID associated with a task name
  256. *
  257. * This routine returns the ID of the task matching a specified name.
  258. * Referencing a task in this way is inefficient, since it involves a search
  259. * of the task list.
  260. *
  261. * RETURNS: The task ID, or ERROR if the task is not found.
  262. *
  263. * ERRNO: S_taskLib_NAME_NOT_FOUND
  264. *
  265. */
  266. int taskNameToId
  267.     (
  268.     char *name          /* task name to look up */
  269.     )
  270.     {
  271.     int tid = (int) Q_EACH (&activeQHead, taskNameNoMatch, name);
  272.     if (tid == (int)NULL) /* no match found */
  273. {
  274. errno = S_taskLib_NAME_NOT_FOUND;
  275. return (ERROR);
  276. }
  277.     return (tid - OFFSET (WIND_TCB, activeNode));
  278.     }
  279. /*******************************************************************************
  280. *
  281. * taskNameNoMatch - boolean function checks that a node's name and name differ
  282. *
  283. * This local routine is utilized by taskNameToId() as the qEach() boolean
  284. * function to test for a node matching some name.
  285. *
  286. * RETURNS: TRUE if node's name and specified name differ, FALSE otherwise.
  287. *
  288. * NOMANUAL
  289. */
  290. LOCAL BOOL taskNameNoMatch
  291.     (
  292.     Q_NODE *pNode,      /* active node to compare name with */
  293.     char   *name        /* name to compare to */
  294.     )
  295.     {
  296.     WIND_TCB *pTcb = (WIND_TCB *) ((int)pNode - OFFSET (WIND_TCB, activeNode));
  297.     return ((pTcb->name == NULL) || (strcmp (pTcb->name, name) != 0));
  298.     }
  299. /*******************************************************************************
  300. *
  301. * taskIdDefault - set the default task ID
  302. *
  303. * This routine maintains a global default task ID.  This ID is used by
  304. * libraries that want to allow a task ID argument to take on a default value
  305. * if the user did not explicitly supply one.
  306. *
  307. * If <tid> is not zero (i.e., the user did specify a task ID), the default
  308. * ID is set to that value, and that value is returned.  If <tid> is zero
  309. * (i.e., the user did not specify a task ID), the default ID is not changed
  310. * and its value is returned.  Thus the value returned is always the last
  311. * task ID the user specified.
  312. *
  313. * RETURNS: The most recent non-zero task ID.
  314. *
  315. * SEE ALSO: dbgLib,
  316. * .pG "Target Shell,"
  317. * windsh,
  318. * .tG "Shell"
  319. */
  320. int taskIdDefault
  321.     (
  322.     int tid             /* user supplied task ID; if 0, return default */
  323.     )
  324.     {
  325.     static int defaultTaskId; /* current default task ID */
  326.     if (tid != 0)
  327. defaultTaskId = tid; /* update default */
  328.     return (defaultTaskId);
  329.     }
  330. /*******************************************************************************
  331. *
  332. * taskIsReady - check if a task is ready to run
  333. *
  334. * This routine tests the status field of a task to determine
  335. * if it is ready to run.
  336. *
  337. * RETURNS: TRUE if the task is ready, otherwise FALSE.
  338. */
  339. BOOL taskIsReady
  340.     (
  341.     int tid     /* task ID */
  342.     )
  343.     {
  344.     FAST WIND_TCB *pTcb = taskTcb (tid);
  345.     return ((pTcb != NULL) && (pTcb->status == WIND_READY));
  346.     }
  347. /*******************************************************************************
  348. *
  349. * taskIsSuspended - check if a task is suspended
  350. *
  351. * This routine tests the status field of a task to determine
  352. * if it is suspended.
  353. *
  354. * RETURNS: TRUE if the task is suspended, otherwise FALSE.
  355. */
  356. BOOL taskIsSuspended
  357.     (
  358.     int tid     /* task ID */
  359.     )
  360.     {
  361.     WIND_TCB *pTcb = taskTcb (tid);
  362.     return ((pTcb != NULL) && (pTcb->status & WIND_SUSPEND));
  363.     }
  364. /*******************************************************************************
  365. *
  366. * taskIdListGet - get a list of active task IDs
  367. *
  368. * This routine provides the calling task with a list of all active
  369. * tasks.  An unsorted list of task IDs for no more than <maxTasks> tasks is
  370. * put into <idList>.
  371. *
  372. * WARNING:
  373. * Kernel rescheduling is disabled with taskLock() while tasks are filled
  374. * into the <idList>.  There is no guarantee that all the tasks are valid
  375. * or that new tasks have not been created by the time this routine returns.
  376. *
  377. * RETURNS: The number of tasks put into the ID list.
  378. */
  379. int taskIdListGet
  380.     (
  381.     int idList[],               /* array of task IDs to be filled in */
  382.     int maxTasks                /* max tasks <idList> can accommodate */
  383.     )
  384.     {
  385.     FAST int ix;
  386.     int      active;
  387.     taskLock (); /* LOCK PREEMPTION */
  388.     active = Q_INFO (&activeQHead, idList, maxTasks);
  389.     taskUnlock (); /* UNLOCK PREEMPTION */
  390.     /* fix up the ID list by lopping off the the offset to the activeNode for
  391.      * each element in the idList.
  392.      */
  393.     for (ix = 0; ix < active; ix ++)
  394. idList [ix] -= OFFSET (WIND_TCB, activeNode);
  395.     return (active); /* return idList count */
  396.     }