|
1 |
| -/* gconstructor.h - Module constructor and destructor helper header |
| 1 | +/* g2constructor.h - Module constructor and destructor helper header |
2 | 2 |
|
3 |
| - If G_HAS_CONSTRUCTORS is true then the compiler support *both* constructors and |
| 3 | + If G2_HAS_CONSTRUCTORS is true then the compiler support *both* constructors and |
4 | 4 | destructors, in a sane way, including e.g. on library unload. If not you're on
|
5 | 5 | your own.
|
6 | 6 |
|
7 | 7 | Some compilers need #pragma to handle this, which does not work with macros,
|
8 | 8 | so the way you need to use this is (for constructors):
|
9 | 9 |
|
10 |
| - #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA |
11 |
| - #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(my_constructor) |
| 10 | + #ifdef G2_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA |
| 11 | + #pragma G2_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(G2_FUNCNAME(my_constructor)) |
12 | 12 | #endif
|
13 |
| - G_DEFINE_CONSTRUCTOR(my_constructor) |
14 |
| - static void my_constructor(void) { |
| 13 | + G2_DEFINE_CONSTRUCTOR(G2_FUNCNAME(my_constructor)) |
| 14 | + static void G2_FUNCNAME(my_constructor)(void) { |
15 | 15 | ...
|
16 | 16 | }
|
17 | 17 |
|
18 | 18 | */
|
19 | 19 |
|
20 |
| -#ifndef G_CONSTRUCTOR_H_ |
21 |
| -#define G_CONSTRUCTOR_H_ |
| 20 | +#ifndef G2_CONSTRUCTOR_H_ |
| 21 | +#define G2_CONSTRUCTOR_H_ |
| 22 | + |
| 23 | +#ifndef G2_MODEL_PREFIX |
| 24 | +#ifdef MODEL_IDENTIFIER |
| 25 | +#define G2_MODEL_PREFIX MODEL_IDENTIFIER |
| 26 | +#else |
| 27 | +#define G2_MODEL_PREFIX |
| 28 | +#endif |
| 29 | +#endif |
| 30 | + |
| 31 | +#define G2_CONCAT(a, b) a ## b |
| 32 | +#define G2_CONCAT_(a, b) G2_CONCAT(a, b) |
| 33 | +#define G2_FUNCNAME(name) G2_CONCAT_(G2_MODEL_PREFIX, name) |
22 | 34 |
|
23 | 35 | #if defined(__cplusplus)
|
24 | 36 |
|
25 |
| -#define G_HAS_CONSTRUCTORS 1 |
| 37 | +#define G2_HAS_CONSTRUCTORS 1 |
| 38 | + |
| 39 | +#define G2_DEFINE_CONSTRUCTOR(_func) G2_CXX_CTOR(_func) |
| 40 | +#define G2_DEFINE_DESTRUCTOR(_func) G2_CXX_DTOR(_func) |
26 | 41 |
|
27 |
| -#define G_DEFINE_CONSTRUCTOR(_func) \ |
| 42 | +#define G2_CXX_CTOR(_func) \ |
28 | 43 | static void _func(void); \
|
29 | 44 | struct _func ## _wrapper_struct { _func ## _wrapper_struct() { _func(); } }; \
|
30 | 45 | static _func ## _wrapper_struct _func ## _wrapper;
|
31 | 46 |
|
32 |
| -#define G_DEFINE_DESTRUCTOR(_func) \ |
| 47 | +#define G2_CXX_DTOR(_func) \ |
33 | 48 | static void _func(void); \
|
34 | 49 | struct _func ## _wrapper_struct2 { ~_func ## _wrapper_struct2() { _func(); } }; \
|
35 | 50 | static _func ## _wrapper_struct2 _func ## _wrapper2;
|
36 | 51 |
|
37 | 52 | #elif (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7))) || \
|
38 | 53 | defined(__clang__)
|
39 | 54 |
|
40 |
| -#define G_HAS_CONSTRUCTORS 1 |
| 55 | +#define G2_HAS_CONSTRUCTORS 1 |
41 | 56 |
|
42 |
| -#define G_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func (void); |
43 |
| -#define G_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func (void); |
| 57 | +#define G2_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func (void); |
| 58 | +#define G2_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func (void); |
44 | 59 |
|
45 | 60 | #elif defined(_MSC_VER) && (_MSC_VER >= 1500)
|
46 | 61 | /* Visual Studio 2008 and later has _pragma */
|
47 | 62 |
|
48 |
| -#define G_HAS_CONSTRUCTORS 1 |
| 63 | +#define G2_HAS_CONSTRUCTORS 1 |
49 | 64 |
|
50 | 65 | #ifdef _WIN64
|
51 |
| -#define G_MSVC_SYMBOL_PREFIX "" |
| 66 | +#define G2_MSVC_SYMBOL_PREFIX "" |
52 | 67 | #else
|
53 |
| -#define G_MSVC_SYMBOL_PREFIX "_" |
| 68 | +#define G2_MSVC_SYMBOL_PREFIX "_" |
54 | 69 | #endif
|
55 | 70 |
|
56 |
| -#define G_DEFINE_CONSTRUCTOR(_func) G_MSVC_CTOR (_func, G_MSVC_SYMBOL_PREFIX) |
57 |
| -#define G_DEFINE_DESTRUCTOR(_func) G_MSVC_DTOR (_func, G_MSVC_SYMBOL_PREFIX) |
| 71 | +#define G2_DEFINE_CONSTRUCTOR(_func) G2_MSVC_CTOR(_func, G2_MSVC_SYMBOL_PREFIX) |
| 72 | +#define G2_DEFINE_DESTRUCTOR(_func) G2_MSVC_DTOR(_func, G2_MSVC_SYMBOL_PREFIX) |
58 | 73 |
|
59 |
| -#define G_MSVC_CTOR(_func,_sym_prefix) \ |
| 74 | +#define G2_MSVC_CTOR(_func, _sym_prefix) \ |
60 | 75 | static void _func(void); \
|
61 | 76 | extern int (* _array ## _func)(void); \
|
62 | 77 | int _func ## _wrapper(void) { _func(); return _array ## _func == NULL; } \
|
63 | 78 | __pragma(comment(linker,"/include:" _sym_prefix # _func "_wrapper")) \
|
64 | 79 | __pragma(section(".CRT$XCU",read)) \
|
65 | 80 | __declspec(allocate(".CRT$XCU")) int (* _array ## _func)(void) = _func ## _wrapper;
|
66 | 81 |
|
67 |
| -#define G_MSVC_DTOR(_func,_sym_prefix) \ |
| 82 | +#define G2_MSVC_DTOR(_func, _sym_prefix) \ |
68 | 83 | static void _func(void); \
|
69 | 84 | extern int (* _array ## _func)(void); \
|
70 | 85 | int _func ## _constructor(void) { atexit (_func); return _array ## _func == NULL; } \
|
|
74 | 89 |
|
75 | 90 | #elif defined(_MSC_VER) && (_MSC_VER >= 1400)
|
76 | 91 |
|
77 |
| -#define G_HAS_CONSTRUCTORS 1 |
| 92 | +#define G2_HAS_CONSTRUCTORS 1 |
78 | 93 |
|
79 | 94 | /* Pre Visual Studio 2008 must use #pragma section */
|
80 |
| -#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 |
81 |
| -#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 |
| 95 | +#define G2_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 |
| 96 | +#define G2_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 |
82 | 97 |
|
83 |
| -#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ |
| 98 | +#define G2_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ |
84 | 99 | section(".CRT$XCU",read)
|
85 |
| -#define G_DEFINE_CONSTRUCTOR(_func) \ |
| 100 | +#define G2_DEFINE_CONSTRUCTOR(_func) \ |
86 | 101 | static void _func(void); \
|
87 | 102 | static int _func ## _wrapper(void) { _func(); return 0; } \
|
88 | 103 | __declspec(allocate(".CRT$XCU")) static int (*p)(void) = _func ## _wrapper;
|
89 | 104 |
|
90 |
| -#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ |
| 105 | +#define G2_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ |
91 | 106 | section(".CRT$XCU",read)
|
92 |
| -#define G_DEFINE_DESTRUCTOR(_func) \ |
| 107 | +#define G2_DEFINE_DESTRUCTOR(_func) \ |
93 | 108 | static void _func(void); \
|
94 | 109 | static int _func ## _constructor(void) { atexit (_func); return 0; } \
|
95 | 110 | __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor;
|
|
100 | 115 | * http://opensource.apple.com/source/OpenSSL098/OpenSSL098-35/src/fips/fips_premain.c
|
101 | 116 | */
|
102 | 117 |
|
103 |
| -#define G_HAS_CONSTRUCTORS 1 |
| 118 | +#define G2_HAS_CONSTRUCTORS 1 |
104 | 119 |
|
105 |
| -#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 |
106 |
| -#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 |
| 120 | +#define G2_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 |
| 121 | +#define G2_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 |
107 | 122 |
|
108 |
| -#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ |
| 123 | +#define G2_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ |
109 | 124 | init(_func)
|
110 |
| -#define G_DEFINE_CONSTRUCTOR(_func) \ |
| 125 | +#define G2_DEFINE_CONSTRUCTOR(_func) \ |
111 | 126 | static void _func(void);
|
112 | 127 |
|
113 |
| -#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ |
| 128 | +#define G2_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ |
114 | 129 | fini(_func)
|
115 |
| -#define G_DEFINE_DESTRUCTOR(_func) \ |
| 130 | +#define G2_DEFINE_DESTRUCTOR(_func) \ |
116 | 131 | static void _func(void);
|
117 | 132 |
|
118 | 133 | #else
|
|
0 commit comments