Wrapping atexit() is a bad idea on Windows, where the EXE and each DLL

2005-08-31  Tor Lillqvist  <tml@novell.com>

	* glib/gutils.h: Wrapping atexit() is a bad idea on Windows, where
	the EXE and each DLL have their own atexit function chains.

	#define g_atexit as atexit instead. This means it has a
	better chance of doing what the caller wants. For instance,
	gtkhtml calls g_atexit() registering a function in gtkhtml
	itself. This caused a crash when g_atexit() was implemented as a
	function in the GLib DLL. The gtkhtml DLL was already unloaded by
	the time the GLib DLL got unloaded.

	* glib/gutils.c: #undef the #define mentioned above, to also get a
	real g_atexit() into the DLL for backward compatibility.
This commit is contained in:
Tor Lillqvist
2005-08-31 20:30:44 +00:00
committed by Tor Lillqvist
parent dca0012a23
commit a27f237964
5 changed files with 60 additions and 0 deletions

View File

@@ -1,3 +1,18 @@
2005-08-31 Tor Lillqvist <tml@novell.com>
* glib/gutils.h: Wrapping atexit() is a bad idea on Windows, where
the EXE and each DLL have their own atexit function chains.
#define g_atexit as atexit instead. This means it has a
better chance of doing what the caller wants. For instance,
gtkhtml calls g_atexit() registering a function in gtkhtml
itself. This caused a crash when g_atexit() was implemented as a
function in the GLib DLL. The gtkhtml DLL was already unloaded by
the time the GLib DLL got unloaded.
* glib/gutils.c: #undef the #define mentioned above, to also get a
real g_atexit() into the DLL for backward compatibility.
2005-08-30 Tor Lillqvist <tml@novell.com> 2005-08-30 Tor Lillqvist <tml@novell.com>
Make also the g_spawn*() functions take parameters in the GLib Make also the g_spawn*() functions take parameters in the GLib

View File

@@ -1,3 +1,18 @@
2005-08-31 Tor Lillqvist <tml@novell.com>
* glib/gutils.h: Wrapping atexit() is a bad idea on Windows, where
the EXE and each DLL have their own atexit function chains.
#define g_atexit as atexit instead. This means it has a
better chance of doing what the caller wants. For instance,
gtkhtml calls g_atexit() registering a function in gtkhtml
itself. This caused a crash when g_atexit() was implemented as a
function in the GLib DLL. The gtkhtml DLL was already unloaded by
the time the GLib DLL got unloaded.
* glib/gutils.c: #undef the #define mentioned above, to also get a
real g_atexit() into the DLL for backward compatibility.
2005-08-30 Tor Lillqvist <tml@novell.com> 2005-08-30 Tor Lillqvist <tml@novell.com>
Make also the g_spawn*() functions take parameters in the GLib Make also the g_spawn*() functions take parameters in the GLib

View File

@@ -1,3 +1,18 @@
2005-08-31 Tor Lillqvist <tml@novell.com>
* glib/gutils.h: Wrapping atexit() is a bad idea on Windows, where
the EXE and each DLL have their own atexit function chains.
#define g_atexit as atexit instead. This means it has a
better chance of doing what the caller wants. For instance,
gtkhtml calls g_atexit() registering a function in gtkhtml
itself. This caused a crash when g_atexit() was implemented as a
function in the GLib DLL. The gtkhtml DLL was already unloaded by
the time the GLib DLL got unloaded.
* glib/gutils.c: #undef the #define mentioned above, to also get a
real g_atexit() into the DLL for backward compatibility.
2005-08-30 Tor Lillqvist <tml@novell.com> 2005-08-30 Tor Lillqvist <tml@novell.com>
Make also the g_spawn*() functions take parameters in the GLib Make also the g_spawn*() functions take parameters in the GLib

View File

@@ -208,6 +208,10 @@ g_memmove (gpointer dest,
} }
#endif /* !HAVE_MEMMOVE && !HAVE_WORKING_BCOPY */ #endif /* !HAVE_MEMMOVE && !HAVE_WORKING_BCOPY */
#ifdef G_OS_WIN32
#undef g_atexit
#endif
/** /**
* g_atexit: * g_atexit:
* @func: the function to call on normal program termination. * @func: the function to call on normal program termination.

View File

@@ -229,6 +229,17 @@ typedef void (*GVoidFunc) (void);
*/ */
void g_atexit (GVoidFunc func); void g_atexit (GVoidFunc func);
#ifdef G_OS_WIN32
/* It's a bad idea to wrap atexit() on Windows. If the GLib DLL calls
* atexit(), the function will be called when the GLib DLL is detached
* from the program, which is not what the caller wants. The caller
* wants the function to be called when it *itself* exits (or is
* detached, in case the caller, too, is a DLL).
*/
int atexit (void (*)(void));
#define g_atexit(func) atexit(func)
#endif
/* Look for an executable in PATH, following execvp() rules */ /* Look for an executable in PATH, following execvp() rules */
gchar* g_find_program_in_path (const gchar *program); gchar* g_find_program_in_path (const gchar *program);