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

MultiPlatform

  1. /* cplusXtors.c - run time support for static ctors and dtors */
  2. /* Copyright 1993 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01f,19mar02,sn   SPR 71699 - moved cplusXtorStrategy here from cplusUsr.o
  8. 01e,21jan02,sn   combined with cplusGlob.cpp; made a 'C' file
  9. 01d,16oct00,sn   use standard C++
  10. 01c,03jun93,srh  doc cleanup
  11. 01b,23apr93,srh  implemented new force-link/initialization scheme
  12. 01a,31jan93,srh  written.
  13. */
  14. /*
  15. DESCRIPTION
  16. This module contains core run time support for static constructors and
  17. destructors (cplusCallCtors/cplusCallDtors) as well as user-callable
  18. functions (cplusCtorsLink/cplusDtorsLink) which call static
  19. initializers for C++ modules that are linked with VxWorks.
  20. NOMANUAL
  21. */
  22. /* Includes */
  23. #include "vxWorks.h"
  24. #include "cplusLib.h"
  25. extern VOIDFUNCPTR _ctors[];
  26. extern VOIDFUNCPTR _dtors[];
  27. /* Globals */
  28. char __cplusXtors_o = 0;
  29. CPLUS_XTOR_STRATEGIES cplusXtorStrategy = AUTOMATIC;
  30. /******************************************************************************
  31. *
  32. * cplusCtorsLink - call all linked static constructors (C++)
  33. *
  34. * This function calls constructors for all of the static objects linked
  35. * with a VxWorks bootable image.  When creating bootable applications,
  36. * this function should be called from usrRoot() to initialize all static
  37. * objects.  Correct operation depends on correctly munching the C++
  38. * modules that are linked with VxWorks.
  39. *
  40. * RETURNS: N/A
  41. */
  42. BOOL linkedCtorsInitialized = FALSE;
  43. void cplusCtorsLink ()
  44.     {
  45.     if (!linkedCtorsInitialized)
  46.        {
  47.        cplusCallCtors (_ctors);
  48.        linkedCtorsInitialized = TRUE;
  49.        }
  50.     }
  51. /******************************************************************************
  52. *
  53. * cplusDtorsLink - call all linked static destructors (C++)
  54. *
  55. * This function calls destructors for all of the static objects linked
  56. * with a VxWorks bootable image.  When creating bootable applications,
  57. * this function should be called during system shutdown to decommission
  58. * all static objects.  Correct operation depends on correctly munching
  59. * the C++ modules that are linked with VxWorks.
  60. *
  61. * RETURNS: N/A
  62. */
  63. void cplusDtorsLink ()
  64.     {
  65.     cplusCallDtors (_dtors);
  66.     }
  67. /******************************************************************************
  68. *
  69. * cplusCallCtors - call static constructors
  70. *
  71. * This routine takes a <ctors> array, as generated by the munch utility,
  72. * and calls the function which is pointed to by each entry. Each function
  73. * in the <ctors> array calls the static constructors for one compilation
  74. * unit. The functions are called in the first-to-last order.
  75. *
  76. * NOMANUAL
  77. */
  78. void cplusCallCtors
  79.     (
  80.     VOIDFUNCPTR *ctors /* array of pointers to ctor-calling functions */
  81.     )
  82.     {
  83.     /* call ctors in order */
  84.     VOIDFUNCPTR *pVFP;
  85.     for (pVFP = ctors; *pVFP != 0; pVFP++)
  86. {
  87. (**pVFP)();
  88. }
  89.     }
  90. /******************************************************************************
  91. *
  92. * cplusCallDtors - call static destructors
  93. *
  94. * This routine takes a <dtors> array, as generated by the munch utility,
  95. * and calls the function which is pointed to by each entry. Each function
  96. * in the <dtors> array calls the static destructors for one compilation
  97. * unit. The functions are called in the last-to-first order, reversing
  98. * the order in which the static constructors were originally called.
  99. *
  100. * NOMANUAL
  101. */
  102. void cplusCallDtors 
  103.     (
  104.     VOIDFUNCPTR *dtors /* array of pointers to dtor-calling functions */
  105.     )
  106.     {
  107.     /* advance pVFP to end of dtors list */
  108.     VOIDFUNCPTR *pVFP;
  109.     for (pVFP = dtors; *pVFP != 0; pVFP++)
  110. {
  111. }
  112.     
  113.     /* call dtors in reverse order of ctors */
  114.     while (pVFP > dtors)
  115. {
  116. (**--pVFP)();
  117. }
  118.     }