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

VxWorks

开发平台:

C/C++

  1. /* cplusUsr.c - C++ user interface library */
  2. /* Copyright 1993-2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01m,22may02,fmk  change comments for cplusCtors and cplusDtors
  8. 01l,19mar02,sn   SPR 71699 - Moved cplusXtorStrategy to cplusXtors.c
  9. 01k,22jan02,sn   Changed to C file
  10. 01j,07dec01,sn   moved demangler functions to cplusDem.cpp
  11. 01i,11oct98,ms   reworked 01h fix, since it caused bootrom build to fail
  12. 01h,08oct98,sn   moved defn of cplusXtorStrategy to cplusInit.cpp
  13. 01g,14jul97,dgp  doc: add windsh x-ref to cplusCtors(), cplusDtors(), 
  14.       & cplusXtorSet()
  15. 01f,08oct96,bjl  changed cplusXtorStrategy from MANUAL to AUTOMATIC
  16. 01e,31oct93,srh  fixed spr 2270
  17. 01d,18jun93,jdi  more doc cleanup.
  18. 01c,03jun93,srh  doc cleanup
  19. 01b,23apr93,srh  implemented new force-link/initialization scheme
  20. 01a,31jan93,srh  written.
  21. */
  22. /*
  23. DESCRIPTION
  24. This module provides C++ support routines meant to be called from the
  25. VxWorks shell. It provides utilities for calling constructors and
  26. destructors for static objects, and for setting modes used by the C++
  27. demangler and the static object support routines.
  28. NOMANUAL
  29. */
  30. /* includes */
  31. #include "vxWorks.h"
  32. #include "cplusLib.h"
  33. #include "moduleLib.h"
  34. extern int (*_func_logMsg) (const char *, ...);
  35. /* defines */
  36. /* typedefs */
  37. /* globals */
  38. char __cplusUsr_o = 0;
  39. /* locals */
  40. /* forward declarations */
  41. /******************************************************************************
  42. *
  43. * cplusXtorSet - change C++ static constructor calling strategy (C++)
  44. *
  45. * This command sets the C++ static constructor calling strategy
  46. * to <strategy>.  The default strategy is 0.
  47. *
  48. * There are two static constructor calling strategies: <automatic>
  49. * and <manual>.  These modes are represented by numeric codes:
  50. *
  51. * .TS
  52. * center,tab(|);
  53. * lf3 lf3
  54. * l l.
  55. * Strategy   | Code
  56. * _
  57. * manual     | 0
  58. * automatic  | 1
  59. * .TE
  60. *
  61. * Under the manual strategy, a module's static constructors and
  62. * destructors are called by cplusCtors() and cplusDtors(), which are
  63. * themselves invoked manually.
  64. * Under the automatic strategy, a module's static constructors are
  65. * called as a side-effect of loading the module using the VxWorks module
  66. * loader.  A module's static destructors are called as a side-effect of
  67. * unloading the module.
  68. *
  69. * NOTE: The manual strategy is applicable only to modules that are
  70. * loaded by the VxWorks module loader.  Static constructors and
  71. * destructors contained by modules linked with the VxWorks image
  72. * are called using cplusCtorsLink() and cplusDtorsLink().
  73. *
  74. * RETURNS: N/A
  75. *
  76. * SEE ALSO
  77. * windsh,
  78. * .tG "Shell"
  79. */
  80. void cplusXtorSet
  81.     (
  82.     int strategy
  83.     )
  84.     {
  85.     cplusXtorStrategy = (CPLUS_XTOR_STRATEGIES) strategy;
  86.     }
  87. /******************************************************************************
  88. *
  89. * callAllCtors - used by cplusCtors to call ctors for all loaded modules
  90. *
  91. *
  92. * RETURNS: TRUE
  93. *
  94. * NOMANUAL
  95. */
  96. static BOOL callAllCtors
  97.     (
  98.     MODULE_ID module,
  99.     int dummy
  100.     )
  101.     {
  102.     if (module->ctors != 0)
  103. {
  104. cplusCallCtors (module->ctors);
  105. }
  106.     return TRUE;
  107.     }
  108. /******************************************************************************
  109. *
  110. * callAllDtors - used by cplusDtors to call dtors for all loaded modules
  111. *
  112. * RETURNS: TRUE
  113. *
  114. * NOMANUAL
  115. */
  116. static BOOL callAllDtors
  117.     (
  118.     MODULE_ID module,
  119.     int dummy
  120.     )
  121.     {
  122.     if (module->dtors != 0)
  123. {
  124. cplusCallDtors (module->dtors);
  125. }
  126.     return TRUE;
  127.     }
  128. /****************************************************************
  129. *
  130. * cplusCtors - call static constructors (C++)
  131. *
  132. * This function is used to call static constructors under the manual
  133. * strategy (see cplusXtorSet()).  <moduleName> is the name of an
  134. * object module that was "munched" before loading.  If <moduleName> is 0,
  135. * then all static constructors, in all modules loaded by the VxWorks
  136. * module loader, are called.
  137. *
  138. * EXAMPLES
  139. * The following example shows how to initialize the static objects in
  140. * modules called "applx.out" and "apply.out".
  141. * .CS
  142. *     -> cplusCtors "applx.out"
  143. *     value = 0 = 0x0
  144. *     -> cplusCtors "apply.out"
  145. *     value = 0 = 0x0
  146. * .CE
  147. * The following example shows how to initialize all the static objects that are
  148. * currently loaded, with a single invocation of cplusCtors():
  149. * .CS
  150. *     -> cplusCtors
  151. *     value = 0 = 0x0
  152. * .CE
  153. *
  154. * WARNING
  155. * cplusCtors() should only be called once per module otherwise unpredictable
  156. * behavior may result.
  157. * RETURNS: N/A
  158. *
  159. * SEE ALSO: cplusXtorSet(), windsh,
  160. * .tG "Shell"
  161. */
  162. void cplusCtors
  163.     (
  164.     const char * moduleName /* name of loaded module */
  165.     )
  166.     {
  167.     MODULE_ID module;
  168.     
  169.     if (moduleName == 0)
  170. {
  171. moduleEach ((FUNCPTR) callAllCtors, 0);
  172. return;
  173. }
  174.     else if ((module = moduleFindByName ((char *) moduleName)) == 0)
  175. {
  176.         if (_func_logMsg != 0)
  177.     {
  178.     (* _func_logMsg) ("cplusCtors: can't find module "%s"n",
  179.       (int) moduleName, 0, 0, 0, 0, 0);
  180.             }
  181. return;
  182. }
  183.     
  184.     if (module->ctors != 0)
  185. {
  186. cplusCallCtors (module->ctors);
  187. }
  188.     }
  189. /****************************************************************
  190. *
  191. * cplusDtors - call static destructors (C++)
  192. *
  193. * This function is used to call static destructors under the manual
  194. * strategy (see cplusXtorSet()).  <moduleName> is the name of an
  195. * object module that was "munched" before loading.  If <moduleName> is 0,
  196. * then all static destructors, in all modules loaded by the VxWorks
  197. * module loader, are called.
  198. *
  199. * EXAMPLES
  200. * The following example shows how to destroy the static objects in
  201. * modules called "applx.out" and "apply.out":
  202. * .CS
  203. *     -> cplusDtors "applx.out"
  204. *     value = 0 = 0x0
  205. *     -> cplusDtors "apply.out"
  206. *     value = 0 = 0x0
  207. * .CE
  208. * The following example shows how to destroy all the static objects that are
  209. * currently loaded, with a single invocation of cplusDtors():
  210. * .CS
  211. *     -> cplusDtors
  212. *     value = 0 = 0x0
  213. * .CE
  214. *
  215. * WARNING
  216. * cplusDtors() should only be called once per module otherwise unpredictable
  217. * behavior may result.
  218. * RETURNS: N/A
  219. * SEE ALSO: cplusXtorSet(), windsh,
  220. * .tG "Shell"
  221. */
  222. void cplusDtors
  223.     (
  224.     const char * moduleName
  225.     )
  226.     {
  227.     MODULE_ID module;
  228.     if (moduleName == 0)
  229. {
  230. moduleEach ((FUNCPTR) callAllDtors, 0);
  231. return;
  232. }
  233.     else if ((module = moduleFindByName ((char *) moduleName)) == 0)
  234. {
  235.         if (_func_logMsg != 0)
  236.     {
  237.     (* _func_logMsg) ("cplusDtors: can't find module "%s"n",
  238.       (int) moduleName, 0, 0, 0, 0, 0);
  239.     }
  240. return;
  241. }
  242.     if (module->dtors != 0)
  243. {
  244. cplusCallDtors (module->dtors);
  245. }
  246.     }