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

VxWorks

开发平台:

C/C++

  1. /* errnoLib.c - error status library */
  2. /* Copyright 1984-1999 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 04n,12mar99,p_m  Fixed SPR# 10002 by documenting makeStatTbl usage on Windows.
  8. 04m,14oct95,jdi  doc: revised pathnames for Tornado.
  9. 04l,05feb93,jdi  documentation; updated location of statTbl.
  10. 04k,21jan93,jdi  documentation cleanup for 5.1.
  11. 04j,14oct92,jdi  made __errno() NOMANUAL.
  12. 04i,09jul92,smb  added __errno() for ANSI merge.
  13.  removed errno.h include.
  14. 04h,04jul92,jcf  scalable/ANSI/cleanup effort.
  15. 04g,26may92,rrr  the tree shuffle
  16. 04f,25nov91,llk  ansi stuff.
  17.  added strerror().
  18. 04e,04oct91,rrr  passed through the ansification filter
  19.                   -changed functions to ansi style
  20.   -changed includes to have absolute path from h/
  21.   -changed copyright notice
  22. 04d,05apr91,jdi  documentation -- removed header parens and x-ref numbers;
  23.  doc review by dnw.
  24. 04c,11feb91,jaa  documentation cleanup.
  25. 04b,28oct90,jcf  documentation.
  26. 04a,14mar90,jcf  errno is now a global variable updated on context switch/intr.
  27.  removed tcb extension dependencies.
  28. 03f,07mar90,jdi  documentation cleanup.
  29. 03e,19aug88,gae  documentation.
  30. 03d,05jun88,dnw  changed from stsLib to errnoLib.
  31.  documentation.
  32. 03c,30may88,dnw  changed to v4 names.
  33. 03b,22apr88,gae  made [sg]etStatus() work at interrupt level.
  34. 03a,27jan88,jcf  made kernel independent.
  35. 02n,04nov87,ecs  documentation.
  36. 02m,22apr87,llk  moved printStatus() to usrLib.c.
  37. 02l,24mar87,jlf  documentation.
  38. 02k,20dec86,dnw  changed printStatus() to print numeric value if no
  39.    symbolic value.
  40.  changed to not get include files from default directories.
  41. 02j,04sep86,jlf  documentation.
  42. 02i,31jul86,llk  documentation.
  43. 02h,01jul86,jlf  documentation.
  44. 02g,08apr86,dnw  changed printStatus to not use symLib.
  45.  deleted makeStatSymTbl() since status symbol table is now
  46.    pre-built.
  47. 02f,11feb86,dnw  changed references to old TASK_STACK_HEADER to new
  48.    tcb extension.
  49. 02e,09nov85,jlf  fixed bug in makeStatSymTbl which was caused by an extra
  50.  level of indirection.
  51. 02d,11oct85,dnw  changed to new calling sequence of symCreate.
  52.  de-linted.
  53. 02c,27aug85,rdc  added makeStatSymTbl and printStatus.
  54. 02b,21jul85,jlf  documentation.
  55. 02a,08apr85,rdc  modifications for vrtx vers. 3: setTaskStatus
  56.         uses TASK_STACK_HEADER.
  57. 01d,19sep84,jlf  worked on comments a little.
  58. 01c,08sep84,jlf  added copyright and comments. Fixed setTaskStatus to not
  59.  try to set a status is tid is not legitimate.
  60. 01b,24aug84,dnw  added setTaskStatus.
  61.  added test for intContext in setStatus so that calls
  62.    at interrupt level won't clobber arbitrary task.
  63. 01a,30jul84,ecs  written
  64. */
  65. /*
  66. DESCRIPTION
  67. This library contains routines for setting and examining the error status
  68. values of tasks and interrupts.  Most VxWorks functions return ERROR when
  69. they detect an error, or NULL in the case of functions returning pointers.
  70. In addition, they set an error status that elaborates the nature of the
  71. error.
  72. This facility is compatible with the UNIX error status mechanism in which
  73. error status values are set in the global variable `errno'.  However, in
  74. VxWorks there are many task and interrupt contexts that share common memory
  75. space and therefore conflict in their use of this global variable.
  76. VxWorks resolves this in two ways:
  77. .IP (1) 4
  78. For tasks, VxWorks maintains the `errno' value for each context
  79. separately, and saves and restores the value of `errno' with every context
  80. switch.  The value of `errno' for a non-executing task is stored in the
  81. task's TCB.  Thus, regardless of task context, code can always reference
  82. or modify `errno' directly.
  83. .IP (2)
  84. For interrupt service routines, VxWorks saves and restores `errno' on
  85. the interrupt stack as part of the interrupt enter and exit code provided
  86. automatically with the intConnect() facility.   Thus, interrupt service
  87. routines can also reference or modify `errno' directly.
  88. .LP
  89. The `errno' facility is used throughout VxWorks for error reporting.  In
  90. situations where a lower-level routine has generated an error, by convention,
  91. higher-level routines propagate the same error status, leaving `errno'
  92. with the value set at the deepest level.  Developers are encouraged to use
  93. the same mechanism for application modules where appropriate.
  94. ERROR STATUS VALUES
  95. An error status is a 4-byte integer.  By convention, the most significant
  96. two bytes are the module number, which indicates the module in which the
  97. error occurred.  The lower two bytes indicate the specific error within
  98. that module.  Module number 0 is reserved for UNIX error numbers so that
  99. values from the UNIX errno.h header file can be set and tested without
  100. modification.  Module numbers 1-500 decimal are reserved for VxWorks
  101. modules.  These are defined in vwModNum.h.  All other module numbers are
  102. available to applications.
  103. PRINTING ERROR STATUS VALUES
  104. VxWorks can include a special symbol table called `statSymTbl'
  105. which printErrno() uses to print human-readable error messages.
  106. This table is created with the tool makeStatTbl, found
  107. in f3host/<hostOs>/binf1.
  108. This tool reads all the .h files in a specified directory and generates a
  109. C-language file, which generates a symbol table when compiled.  Each symbol
  110. consists of an error status value and its definition, which was obtained
  111. from the header file.
  112. For example, suppose the header file target/h/myFile.h contains the line:
  113. .CS
  114.     #define S_myFile_ERROR_TOO_MANY_COOKS 0x230003
  115. .CE
  116. The table `statSymTbl' is created by first running:
  117. On Unix:
  118. .CS
  119.     makeStatTbl target/h > statTbl.c
  120. .CE
  121. On Windows:
  122. .CS
  123.     makeStatTbl target/h
  124. .CE
  125. This creates a file f3statTbl.cfP in the current directory, which, when
  126. compiled, generates `statSymTbl'.  The table is then linked in with
  127. VxWorks.  Normally, these steps are performed automatically by the makefile
  128. in f3target/src/usrf1.
  129. If the user now types from the VxWorks shell:
  130. .CS
  131.     -> printErrno 0x230003
  132. .CE
  133. The printErrno() routine would respond:
  134. .CS
  135.     S_myFile_ERROR_TOO_MANY_COOKS
  136. .CE
  137. The makeStatTbl tool looks for error status lines of the form:
  138. .CS
  139.     #define S_xxx  <n>
  140. .CE
  141. where <xxx> is any string, and <n> is any number.
  142. All VxWorks status lines are of the form:
  143. .CS
  144.     #define S_thisFile_MEANINGFUL_ERROR_MESSAGE   0xnnnn
  145. .CE
  146. where <thisFile> is the name of the module.
  147. This facility is available to the user by adding header files with
  148. status lines of the appropriate forms and remaking VxWorks.
  149. INCLUDE FILES
  150. The file vwModNum.h contains the module numbers for every VxWorks module.
  151. The include file for each module contains the error numbers which that module
  152. can generate.
  153. SEE ALSO: printErrno(), makeStatTbl,
  154. .pG "Basic OS"
  155. */
  156. #include "vxWorks.h"
  157. #include "taskLib.h"
  158. #include "symLib.h"
  159. #include "errnoLib.h"
  160. #include "sysSymTbl.h"
  161. #undef errno /* undefine errno so we can define the actual errno variable */
  162. /* global variables */
  163. int errno; /* updated on each context switch and interrupt by kernel */
  164. /*******************************************************************************
  165. * __errno - returns the address of errno.
  166. *
  167. * INCLUDE: errno.h
  168. *
  169. * RETURNS: pointer to errno
  170. *
  171. * NOMANUAL
  172. */
  173. int *__errno (void)
  174.     {
  175.     return (&errno); 
  176.     }
  177. /*******************************************************************************
  178. *
  179. * errnoGet - get the error status value of the calling task
  180. *
  181. * This routine gets the error status stored in `errno'.
  182. * It is provided for compatibility with previous versions of VxWorks and
  183. * simply accesses `errno' directly.
  184. *
  185. * RETURNS:
  186. * The error status value contained in `errno'.
  187. *
  188. * SEE ALSO: errnoSet(), errnoOfTaskGet()
  189. */
  190. int errnoGet (void)
  191.     
  192.     {
  193.     return (errno);
  194.     }
  195. /*******************************************************************************
  196. *
  197. * errnoOfTaskGet - get the error status value of a specified task
  198. *
  199. * This routine gets the error status most recently set for a specified task.
  200. * If <taskId> is zero, the calling task is assumed, and the value currently
  201. * in `errno' is returned.
  202. *
  203. * This routine is provided primarily for debugging purposes.  Normally,
  204. * tasks access `errno' directly to set and get their own error status values.
  205. *
  206. * RETURNS: The error status of the specified task, or ERROR if the task does
  207. * not exist.
  208. *
  209. * SEE ALSO: errnoSet(), errnoGet()
  210. */
  211. int errnoOfTaskGet
  212.     (
  213.     int taskId                  /* task ID, 0 means current task */
  214.     )
  215.     {
  216.     WIND_TCB *pTcb;
  217.     /* if getting errno of self just return errno */
  218.     if ((taskId == 0) || (taskId == taskIdSelf ()))
  219. return (errno);
  220.     /* get pointer to current task's tcb, be sure it exists */
  221.     if ((pTcb = taskTcb (taskId)) == NULL)
  222. return (ERROR);
  223.     /* return the error status from the tcb extension */
  224.     return (pTcb->errorStatus);
  225.     }
  226. /*******************************************************************************
  227. *
  228. * errnoSet - set the error status value of the calling task
  229. *
  230. * This routine sets the `errno' variable with a specified error status.
  231. * It is provided for compatibility with previous versions of VxWorks and
  232. * simply accesses `errno' directly.
  233. *
  234. * RETURNS:
  235. * OK, or ERROR if the interrupt nest level is too deep.
  236. *
  237. * SEE ALSO: errnoGet(), errnoOfTaskSet()
  238. */
  239. STATUS errnoSet
  240.     (
  241.     int errorValue              /* error status value to set */
  242.     )
  243.     {
  244.     errno = errorValue;
  245.     return (OK);
  246.     }
  247. /*******************************************************************************
  248. *
  249. * errnoOfTaskSet - set the error status value of a specified task
  250. *
  251. * This routine sets the error status for a specified task.
  252. * If <taskId> is zero, the calling task is assumed, and `errno' is set with
  253. * the specified error status.
  254. *
  255. * This routine is provided primarily for debugging purposes.  Normally,
  256. * tasks access `errno' directly to set and get their own error status values.
  257. *
  258. * RETURNS: OK, or ERROR if the task does not exist.
  259. *
  260. * SEE ALSO: errnoSet(), errnoOfTaskGet()
  261. */
  262. STATUS errnoOfTaskSet
  263.     (
  264.     int taskId,                 /* task ID, 0 means current task */
  265.     int errorValue              /* error status value */
  266.     )
  267.     {
  268.     WIND_TCB *pTcb; /* this gets pointer to current task's tcb */
  269.     /* if setting errno of self just set errno */
  270.     if ((taskId == 0) || (taskId == taskIdSelf ()))
  271. {
  272. errno = errorValue;
  273. return (OK);
  274. }
  275.     /* get pointer to specified task's tcb */
  276.     if ((pTcb = taskTcb (taskId)) == NULL)
  277. return (ERROR);
  278.     /* stuff errorValue in tcb extension */
  279.     pTcb->errorStatus = errorValue;
  280.     return (OK);
  281.     }