Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /****************************************************************************
  2. *
  3. *                            Open Watcom Project
  4. *
  5. *    Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
  6. *
  7. *  ========================================================================
  8. *
  9. *    This file contains Original Code and/or Modifications of Original
  10. *    Code as defined in and that are subject to the Sybase Open Watcom
  11. *    Public License version 1.0 (the 'License'). You may not use this file
  12. *    except in compliance with the License. BY USING THIS FILE YOU AGREE TO
  13. *    ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
  14. *    provided with the Original Code and Modifications, and is also
  15. *    available at www.sybase.com/developer/opensource.
  16. *
  17. *    The Original Code and all software distributed under the License are
  18. *    distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  19. *    EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
  20. *    ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
  21. *    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
  22. *    NON-INFRINGEMENT. Please see the License for the specific language
  23. *    governing rights and limitations under the License.
  24. *
  25. *  ========================================================================
  26. *
  27. * Description:  Structures for run-time initialization/finalization.
  28. *
  29. ****************************************************************************/
  30.  
  31.  
  32. #ifndef __RTINIT_H__
  33. #define __RTINIT_H__
  34.  
  35. #include "langenvd.h"
  36. #if defined( __PPC__ )
  37.      #define   __TGT_SYS    __TGT_SYS_AXP_PPC
  38.     typedef unsigned        __type_rtp;
  39.     typedef unsigned        __type_pad;
  40.     typedef void(           *__type_rtn ) ( void );
  41. #elif defined( __AXP__ )
  42.     #define   __TGT_SYS     __TGT_SYS_AXP_NT
  43.     typedef unsigned        __type_rtp;
  44.     typedef unsigned        __type_pad;
  45.     typedef void(           *__type_rtn ) ( void );
  46. #elif defined( __MIPS__ )
  47.     #define   __TGT_SYS     __TGT_SYS_MIPS
  48.     typedef unsigned        __type_rtp;
  49.     typedef unsigned        __type_pad;
  50.     typedef void(           *__type_rtn ) ( void );
  51. #else
  52.     #define   __TGT_SYS   __TGT_SYS_X86
  53.     typedef unsigned char   __type_rtp;
  54.     typedef unsigned short  __type_pad;
  55.   #if defined( __386__ )
  56.     typedef void __near(    *__type_rtn ) ( void );
  57.   #else
  58.     typedef void(           *__type_rtn ) ( void );
  59.    #endif
  60. #endif
  61. #include "langenv.h"
  62.  
  63. #if defined( __MEDIUM__ ) || defined( __LARGE__ ) || defined( __HUGE__ )
  64.     #define __LARGE_CODE__
  65. #endif
  66.  
  67. // initialization progresses from highest priority to lowest
  68. // finalization progresses from lowest to highest
  69. #pragma pack( 1 )
  70. struct rt_init // structure placed in XI/YI segment
  71. {
  72.     __type_rtp  rtn_type; // - near=0/far=1 routine indication
  73.                           //   also used when walking table to flag
  74.                           //   completed entries
  75.     __type_rtp  priority; // - priority (0-highest 255-lowest)
  76.     __type_rtn  rtn;      // - routine
  77. #if !( defined( __LARGE_CODE__ ) || defined( __386__ ) ) || defined( COMP_CFG_COFF )
  78.     __type_pad  padding;  // - padding, when small code ptr
  79.                           //   or when risc cpu
  80. #endif
  81. };
  82. #pragma pack()
  83.  
  84. #if defined( M_I86 )
  85.   #if defined( __LARGE_CODE__ ) /* segmented large code models */
  86.     #define YIXI( seg, label, routine, priority )               \
  87.         struct rt_init __based( __segname( seg ) ) label =      \
  88.         { 1, priority, routine };
  89.   #else                         /* other segmented models */
  90.     #define YIXI( seg, label, routine, priority )               \
  91.         struct rt_init __based( __segname( seg ) ) label =      \
  92.         { 0, priority, routine, 0 };
  93.   #endif
  94. #else                           /* non-segmented architectures */
  95.     #define YIXI( seg, label, routine, priority )               \
  96.         struct rt_init __based( __segname( seg ) ) label =      \
  97.         { 0, priority, routine };
  98. #endif
  99.  
  100. /*
  101.     Use these when you want a global label for the XI/YI structure
  102. */
  103. #define XI( label, routine, priority ) YIXI( TS_SEG_XI, label, routine, priority )
  104. #define YI( label, routine, priority ) YIXI( TS_SEG_YI, label, routine, priority )
  105.  
  106. /*
  107.     Use these when you don't care about the label on the XI/YI structure
  108. */
  109. #define __ANON( x )     __anon ## x
  110. #define ANON( x )       __ANON( x )
  111. #define AXI( routine, priority ) static XI( ANON( __LINE__ ), routine, priority )
  112. #define AYI( routine, priority ) static YI( ANON( __LINE__ ), routine, priority )
  113.  
  114. enum {
  115.     INIT_PRIORITY_THREAD    =  1, // priority for thread data init
  116.     INIT_PRIORITY_FPU       =  2, // priority for FPU/EMU init
  117.     INIT_PRIORITY_RUNTIME   = 10, // priority for run/time initialization
  118.     INIT_PRIORITY_IOSTREAM  = 20, // priority for IOSTREAM
  119.     INIT_PRIORITY_LIBRARY   = 32, // default library-initialization priority
  120.     INIT_PRIORITY_PROGRAM   = 64, // default program-initialization priority
  121.     FINI_PRIORITY_DTOR      = 40, // priority for module DTOR
  122.     DTOR_PRIORITY           = 40, // priority for module DTOR
  123.     FINI_PRIORITY_EXIT      = 16  // when exit() is called, functions between
  124.                                   // 255 and this are called, the rest of the
  125.                                   // fini routines are called from __exit().
  126. };
  127.  
  128. /* have to turn off, or we get unref'd warnings for AXI & AYI stuff */
  129. #pragma off( unreferenced )
  130.  
  131. #endif
  132.