Borrow G_DEFINE_CONSTRUCTOR from GLib
This commit is contained in:
		
							
								
								
									
										144
									
								
								src/matrix-event-types.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								src/matrix-event-types.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,144 @@ | ||||
| /* | ||||
|  * This file is part of matrix-glib-sdk | ||||
|  * | ||||
|  * matrix-glib-sdk is free software: you can redistribute it and/or | ||||
|  * modify it under the terms of the GNU Lesser General Public | ||||
|  * License as published by the Free Software Foundation, either | ||||
|  * version 3 of the License, or (at your option) any later version. | ||||
|  * | ||||
|  * matrix-glib-sdk is distributed in the hope that it will be | ||||
|  * useful, but WITHOUT ANY WARRANTY; without even the implied | ||||
|  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||||
|  * See the GNU Lesser General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU Lesser General Public | ||||
|  * License along with matrix-glib-sdk. If not, see | ||||
|  * <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include "matrix-glib.h" | ||||
| #include "matrix-marshalers.h" | ||||
|  | ||||
| /* | ||||
|   Borrowed from GLib | ||||
|  | ||||
|   If G_HAS_CONSTRUCTORS is true then the compiler support *both* | ||||
|   constructors and destructors, in a sane way, including e.g. on | ||||
|   library unload. If not you're on your own. | ||||
|  | ||||
|   Some compilers need #pragma to handle this, which does not work with macros, | ||||
|   so the way you need to use this is (for constructors): | ||||
|  | ||||
|   #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA | ||||
|   #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(my_constructor) | ||||
|   #endif | ||||
|   G_DEFINE_CONSTRUCTOR(my_constructor) | ||||
|   static void my_constructor(void) { | ||||
|    ... | ||||
|   } | ||||
|  | ||||
| */ | ||||
|  | ||||
| #ifndef __GTK_DOC_IGNORE__ | ||||
|  | ||||
| #if  __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) | ||||
|  | ||||
| #define G_HAS_CONSTRUCTORS 1 | ||||
|  | ||||
| #define G_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func (void); | ||||
| #define G_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func (void); | ||||
|  | ||||
| #elif defined (_MSC_VER) && (_MSC_VER >= 1500) | ||||
| /* Visual studio 2008 and later has _Pragma */ | ||||
|  | ||||
| #define G_HAS_CONSTRUCTORS 1 | ||||
|  | ||||
| /* We do some weird things to avoid the constructors being optimized | ||||
|  * away on VS2015 if WholeProgramOptimization is enabled. First we | ||||
|  * make a reference to the array from the wrapper to make sure its | ||||
|  * references. Then we use a pragma to make sure the wrapper function | ||||
|  * symbol is always included at the link stage. Also, the symbols | ||||
|  * need to be extern (but not dllexport), even though they are not | ||||
|  * really used from another object file. | ||||
|  */ | ||||
|  | ||||
| /* We need to account for differences between the mangling of symbols | ||||
|  * for Win32 (x86) and x64 programs, as symbols on Win32 are prefixed | ||||
|  * with an underscore but symbols on x64 are not. | ||||
|  */ | ||||
| #ifdef _WIN64 | ||||
| #define G_MSVC_SYMBOL_PREFIX "" | ||||
| #else | ||||
| #define G_MSVC_SYMBOL_PREFIX "_" | ||||
| #endif | ||||
|  | ||||
| #define G_DEFINE_CONSTRUCTOR(_func) G_MSVC_CTOR (_func, G_MSVC_SYMBOL_PREFIX) | ||||
| #define G_DEFINE_DESTRUCTOR(_func) G_MSVC_DTOR (_func, G_MSVC_SYMBOL_PREFIX) | ||||
|  | ||||
| #define G_MSVC_CTOR(_func,_sym_prefix) \ | ||||
|   static void _func(void); \ | ||||
|   extern int (* _array ## _func)(void);              \ | ||||
|   int _func ## _wrapper(void) { _func(); g_slist_find (NULL,  _array ## _func); return 0; } \ | ||||
|   __pragma(comment(linker,"/include:" _sym_prefix # _func "_wrapper")) \ | ||||
|   __pragma(section(".CRT$XCU",read)) \ | ||||
|   __declspec(allocate(".CRT$XCU")) int (* _array ## _func)(void) = _func ## _wrapper; | ||||
|  | ||||
| #define G_MSVC_DTOR(_func,_sym_prefix) \ | ||||
|   static void _func(void); \ | ||||
|   extern int (* _array ## _func)(void);              \ | ||||
|   int _func ## _constructor(void) { atexit (_func); g_slist_find (NULL,  _array ## _func); return 0; } \ | ||||
|    __pragma(comment(linker,"/include:" _sym_prefix # _func "_constructor")) \ | ||||
|   __pragma(section(".CRT$XCU",read)) \ | ||||
|   __declspec(allocate(".CRT$XCU")) int (* _array ## _func)(void) = _func ## _constructor; | ||||
|  | ||||
| #elif defined (_MSC_VER) | ||||
|  | ||||
| #define G_HAS_CONSTRUCTORS 1 | ||||
|  | ||||
| /* Pre Visual studio 2008 must use #pragma section */ | ||||
| #define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 | ||||
| #define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 | ||||
|  | ||||
| #define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ | ||||
|   section(".CRT$XCU",read) | ||||
| #define G_DEFINE_CONSTRUCTOR(_func) \ | ||||
|   static void _func(void); \ | ||||
|   static int _func ## _wrapper(void) { _func(); return 0; } \ | ||||
|   __declspec(allocate(".CRT$XCU")) static int (*p)(void) = _func ## _wrapper; | ||||
|  | ||||
| #define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ | ||||
|   section(".CRT$XCU",read) | ||||
| #define G_DEFINE_DESTRUCTOR(_func) \ | ||||
|   static void _func(void); \ | ||||
|   static int _func ## _constructor(void) { atexit (_func); return 0; } \ | ||||
|   __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; | ||||
|  | ||||
| #elif defined(__SUNPRO_C) | ||||
|  | ||||
| /* This is not tested, but i believe it should work, based on: | ||||
|  * http://opensource.apple.com/source/OpenSSL098/OpenSSL098-35/src/fips/fips_premain.c | ||||
|  */ | ||||
|  | ||||
| #define G_HAS_CONSTRUCTORS 1 | ||||
|  | ||||
| #define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 | ||||
| #define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 | ||||
|  | ||||
| #define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ | ||||
|   init(_func) | ||||
| #define G_DEFINE_CONSTRUCTOR(_func) \ | ||||
|   static void _func(void); | ||||
|  | ||||
| #define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ | ||||
|   fini(_func) | ||||
| #define G_DEFINE_DESTRUCTOR(_func) \ | ||||
|   static void _func(void); | ||||
|  | ||||
| #else | ||||
|  | ||||
| /* constructors not supported for this compiler */ | ||||
|  | ||||
| #errer "Constructors are not supported by your compiler, but are needed for this library" | ||||
| #endif | ||||
|  | ||||
| #endif /* __GTK_DOC_IGNORE__ */ | ||||
		Reference in New Issue
	
	Block a user