mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-10-02 19:59:21 +02:00
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:
committed by
Tor Lillqvist
parent
dca0012a23
commit
a27f237964
15
ChangeLog
15
ChangeLog
@@ -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>
|
||||
|
||||
Make also the g_spawn*() functions take parameters in the GLib
|
||||
|
@@ -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>
|
||||
|
||||
Make also the g_spawn*() functions take parameters in the GLib
|
||||
|
@@ -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>
|
||||
|
||||
Make also the g_spawn*() functions take parameters in the GLib
|
||||
|
@@ -208,6 +208,10 @@ g_memmove (gpointer dest,
|
||||
}
|
||||
#endif /* !HAVE_MEMMOVE && !HAVE_WORKING_BCOPY */
|
||||
|
||||
#ifdef G_OS_WIN32
|
||||
#undef g_atexit
|
||||
#endif
|
||||
|
||||
/**
|
||||
* g_atexit:
|
||||
* @func: the function to call on normal program termination.
|
||||
|
@@ -229,6 +229,17 @@ typedef void (*GVoidFunc) (void);
|
||||
*/
|
||||
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 */
|
||||
gchar* g_find_program_in_path (const gchar *program);
|
||||
|
||||
|
Reference in New Issue
Block a user