source: trunk/src/odincrt/initterm.cpp@ 21787

Last change on this file since 21787 was 21538, checked in by dmik, 15 years ago

odincrt: Small code cleanup.

File size: 3.3 KB
Line 
1/*
2 * DLL entry point
3 *
4 * Copyright 1998 Sander van Leeuwen
5 * Copyright 1998 Peter Fitzsimmons
6 *
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11
12#define INCL_DOSMODULEMGR
13#define INCL_DOSPROCESS
14#define INCL_DOSERRORS
15#include <os2wrap.h> // Odin32 OS/2 api wrappers
16#include <stdlib.h>
17#include <stdio.h>
18#include <string.h>
19#include <odin.h>
20#include <misc.h>
21#include <exitlist.h>
22#include <initdll.h>
23
24#ifdef __IBMCPP__
25
26static void APIENTRY cleanup(ULONG reason);
27
28/*
29 * _DLL_InitTerm is the function that gets called by the operating system
30 * loader when it loads and frees this DLL for each process that accesses
31 * this DLL. However, it only gets called the first time the DLL is loaded
32 * and the last time it is freed for a particular process. The system
33 * linkage convention MUST be used because the operating system loader is
34 * calling this function.
35 *
36 * If ulFlag is zero then the DLL is being loaded so initialization should
37 * be performed. If ulFlag is 1 then the DLL is being freed so
38 * termination should be performed.
39 *
40 * A non-zero value must be returned to indicate success.
41 */
42unsigned long SYSTEM _DLL_InitTerm(unsigned long hModule, unsigned long ulFlag)
43{
44 APIRET rc;
45
46 switch (ulFlag)
47 {
48 case 0:
49 {
50#ifdef WITH_KLIB
51 /*
52 * We need to reserve memory for the executable image
53 * before initiating any heaps. Lets do reserve 32MBs
54 */
55 PVOID pvReserved = NULL;
56 DosAllocMem(&pvReserved, 32*1024*1024, PAG_READ);
57#endif
58 /* initialize C and C++ runtime */
59 if (_CRT_init() == -1)
60 return 0UL;
61 ctordtorInit();
62
63 /*
64 * Register an exit list routine to clean up runtime at termination.
65 * We can't simply do it at DLL unload time because this is forbidden
66 * for VAC runtime Odin runtime is based on (see CPPLIB.INF from VAC
67 * for details).
68 */
69 rc = DosExitList(EXITLIST_ODINCRT|EXLST_ADD, cleanup);
70 if(rc)
71 return 0UL;
72#if 1
73 /*
74 * Experimental console hack. Sets apptype to PM anyhow.
75 * First Dll to be initiated should now allways be OdinCrt!
76 * So include odincrt first!
77 */
78 PPIB pPIB;
79 PTIB pTIB;
80 rc = DosGetInfoBlocks(&pTIB, &pPIB);
81 if (rc != NO_ERROR)
82 return 0UL;
83 pPIB->pib_ultype = 3;
84#endif
85
86#ifdef WITH_KLIB
87 /* cleanup - hacking is done */
88 DosFreeMem(pvReserved);
89#endif
90 break;
91 }
92 case 1:
93 break;
94 default:
95 return 0UL;
96 }
97
98 /* success */
99 return 1UL;
100}
101
102static void APIENTRY cleanup(ULONG /*ulReason*/)
103{
104 /* cleanup C++ and C runtime */
105 ctordtorTerm();
106 _CRT_term();
107 DosExitList(EXLST_EXIT, cleanup);
108 return ;
109}
110
111
112#elif defined(__WATCOM_CPLUSPLUS__)
113
114int __dll_initialize(unsigned long hModule, unsigned long ulFlag)
115{
116#if 1
117 /*
118 * Experimental console hack. Sets apptype to PM anyhow.
119 * First Dll to be initiated should now allways be OdinCrt!
120 * So include odincrt first!
121 */
122 APIRET rc;
123 PPIB pPIB;
124 PTIB pTIB;
125 rc = DosGetInfoBlocks(&pTIB, &pPIB);
126 if (rc != NO_ERROR)
127 return 0UL;
128 pPIB->pib_ultype = 3;
129#endif
130 return 1;
131}
132
133int __dll_terminate(unsigned long hModule, unsigned long ulFlag)
134{
135 return 1;
136}
137
138#else
139#error message("compiler is not supported");
140#endif
141
Note: See TracBrowser for help on using the repository browser.