forked from KolibriOS/kolibrios
132 lines
5.3 KiB
C
132 lines
5.3 KiB
C
|
/****************************************************************************
|
||
|
*
|
||
|
* Open Watcom Project
|
||
|
*
|
||
|
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
|
||
|
*
|
||
|
* ========================================================================
|
||
|
*
|
||
|
* This file contains Original Code and/or Modifications of Original
|
||
|
* Code as defined in and that are subject to the Sybase Open Watcom
|
||
|
* Public License version 1.0 (the 'License'). You may not use this file
|
||
|
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
|
||
|
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
|
||
|
* provided with the Original Code and Modifications, and is also
|
||
|
* available at www.sybase.com/developer/opensource.
|
||
|
*
|
||
|
* The Original Code and all software distributed under the License are
|
||
|
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||
|
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
|
||
|
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
|
||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
|
||
|
* NON-INFRINGEMENT. Please see the License for the specific language
|
||
|
* governing rights and limitations under the License.
|
||
|
*
|
||
|
* ========================================================================
|
||
|
*
|
||
|
* Description: Structures for run-time initialization/finalization.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
|
||
|
#ifndef __RTINIT_H__
|
||
|
#define __RTINIT_H__
|
||
|
|
||
|
#include "langenvd.h"
|
||
|
#if defined( __PPC__ )
|
||
|
#define __TGT_SYS __TGT_SYS_AXP_PPC
|
||
|
typedef unsigned __type_rtp;
|
||
|
typedef unsigned __type_pad;
|
||
|
typedef void( *__type_rtn ) ( void );
|
||
|
#elif defined( __AXP__ )
|
||
|
#define __TGT_SYS __TGT_SYS_AXP_NT
|
||
|
typedef unsigned __type_rtp;
|
||
|
typedef unsigned __type_pad;
|
||
|
typedef void( *__type_rtn ) ( void );
|
||
|
#elif defined( __MIPS__ )
|
||
|
#define __TGT_SYS __TGT_SYS_MIPS
|
||
|
typedef unsigned __type_rtp;
|
||
|
typedef unsigned __type_pad;
|
||
|
typedef void( *__type_rtn ) ( void );
|
||
|
#else
|
||
|
#define __TGT_SYS __TGT_SYS_X86
|
||
|
typedef unsigned char __type_rtp;
|
||
|
typedef unsigned short __type_pad;
|
||
|
#if defined( __386__ )
|
||
|
typedef void __near( *__type_rtn ) ( void );
|
||
|
#else
|
||
|
typedef void( *__type_rtn ) ( void );
|
||
|
#endif
|
||
|
#endif
|
||
|
#include "langenv.h"
|
||
|
|
||
|
#if defined( __MEDIUM__ ) || defined( __LARGE__ ) || defined( __HUGE__ )
|
||
|
#define __LARGE_CODE__
|
||
|
#endif
|
||
|
|
||
|
// initialization progresses from highest priority to lowest
|
||
|
// finalization progresses from lowest to highest
|
||
|
#pragma pack( 1 )
|
||
|
struct rt_init // structure placed in XI/YI segment
|
||
|
{
|
||
|
__type_rtp rtn_type; // - near=0/far=1 routine indication
|
||
|
// also used when walking table to flag
|
||
|
// completed entries
|
||
|
__type_rtp priority; // - priority (0-highest 255-lowest)
|
||
|
__type_rtn rtn; // - routine
|
||
|
#if !( defined( __LARGE_CODE__ ) || defined( __386__ ) ) || defined( COMP_CFG_COFF )
|
||
|
__type_pad padding; // - padding, when small code ptr
|
||
|
// or when risc cpu
|
||
|
#endif
|
||
|
};
|
||
|
#pragma pack()
|
||
|
|
||
|
#if defined( M_I86 )
|
||
|
#if defined( __LARGE_CODE__ ) /* segmented large code models */
|
||
|
#define YIXI( seg, label, routine, priority ) \
|
||
|
struct rt_init __based( __segname( seg ) ) label = \
|
||
|
{ 1, priority, routine };
|
||
|
#else /* other segmented models */
|
||
|
#define YIXI( seg, label, routine, priority ) \
|
||
|
struct rt_init __based( __segname( seg ) ) label = \
|
||
|
{ 0, priority, routine, 0 };
|
||
|
#endif
|
||
|
#else /* non-segmented architectures */
|
||
|
#define YIXI( seg, label, routine, priority ) \
|
||
|
struct rt_init __based( __segname( seg ) ) label = \
|
||
|
{ 0, priority, routine };
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
Use these when you want a global label for the XI/YI structure
|
||
|
*/
|
||
|
#define XI( label, routine, priority ) YIXI( TS_SEG_XI, label, routine, priority )
|
||
|
#define YI( label, routine, priority ) YIXI( TS_SEG_YI, label, routine, priority )
|
||
|
|
||
|
/*
|
||
|
Use these when you don't care about the label on the XI/YI structure
|
||
|
*/
|
||
|
#define __ANON( x ) __anon ## x
|
||
|
#define ANON( x ) __ANON( x )
|
||
|
#define AXI( routine, priority ) static XI( ANON( __LINE__ ), routine, priority )
|
||
|
#define AYI( routine, priority ) static YI( ANON( __LINE__ ), routine, priority )
|
||
|
|
||
|
enum {
|
||
|
INIT_PRIORITY_THREAD = 1, // priority for thread data init
|
||
|
INIT_PRIORITY_FPU = 2, // priority for FPU/EMU init
|
||
|
INIT_PRIORITY_RUNTIME = 10, // priority for run/time initialization
|
||
|
INIT_PRIORITY_IOSTREAM = 20, // priority for IOSTREAM
|
||
|
INIT_PRIORITY_LIBRARY = 32, // default library-initialization priority
|
||
|
INIT_PRIORITY_PROGRAM = 64, // default program-initialization priority
|
||
|
FINI_PRIORITY_DTOR = 40, // priority for module DTOR
|
||
|
DTOR_PRIORITY = 40, // priority for module DTOR
|
||
|
FINI_PRIORITY_EXIT = 16 // when exit() is called, functions between
|
||
|
// 255 and this are called, the rest of the
|
||
|
// fini routines are called from __exit().
|
||
|
};
|
||
|
|
||
|
/* have to turn off, or we get unref'd warnings for AXI & AYI stuff */
|
||
|
#pragma off( unreferenced )
|
||
|
|
||
|
#endif
|