From 4d470362b20627044ed9e56fa47ba012cb9b4c54 Mon Sep 17 00:00:00 2001 From: Hans Breuer Date: Sat, 28 Feb 2004 13:03:55 +0000 Subject: [PATCH] updated externals, including those from bug #135386 2003-02-28 Hans Breuer * glib/glib.def : updated externals, including those from bug #135386 * glib/makefile.msc.in : build gatomic.c * glibconfig.h.win32.in : removed duplicate definition of G_MAXSIZE, typedef void* GPid instead of int * tests/child-test.c glib/gmain.c : applied patch from J. Ali Harlow to fix g_child_watch implementation on win32, bug #50296 --- ChangeLog | 14 ++++++ ChangeLog.pre-2-10 | 14 ++++++ ChangeLog.pre-2-12 | 14 ++++++ ChangeLog.pre-2-4 | 14 ++++++ ChangeLog.pre-2-6 | 14 ++++++ ChangeLog.pre-2-8 | 14 ++++++ glib/glib.def | 12 +++++ glib/gmain.c | 103 ++++++++++++++++++++++++++++-------------- glib/makefile.msc.in | 2 +- glibconfig.h.win32.in | 4 +- 10 files changed, 167 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6c0e65954..b8be66679 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2003-02-28 Hans Breuer + + * glib/glib.def : updated externals, including those + from bug #135386 + + * glib/makefile.msc.in : build gatomic.c + + * glibconfig.h.win32.in : removed duplicate definition + of G_MAXSIZE, typedef void* GPid instead of int + + * tests/child-test.c glib/gmain.c : + applied patch from J. Ali Harlow to fix + g_child_watch implementation on win32, bug #50296 + Fri Feb 27 22:13:22 2004 Matthias Clasen * glib/gqueue.c: Trivial doc changes. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 6c0e65954..b8be66679 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,17 @@ +2003-02-28 Hans Breuer + + * glib/glib.def : updated externals, including those + from bug #135386 + + * glib/makefile.msc.in : build gatomic.c + + * glibconfig.h.win32.in : removed duplicate definition + of G_MAXSIZE, typedef void* GPid instead of int + + * tests/child-test.c glib/gmain.c : + applied patch from J. Ali Harlow to fix + g_child_watch implementation on win32, bug #50296 + Fri Feb 27 22:13:22 2004 Matthias Clasen * glib/gqueue.c: Trivial doc changes. diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 6c0e65954..b8be66679 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,17 @@ +2003-02-28 Hans Breuer + + * glib/glib.def : updated externals, including those + from bug #135386 + + * glib/makefile.msc.in : build gatomic.c + + * glibconfig.h.win32.in : removed duplicate definition + of G_MAXSIZE, typedef void* GPid instead of int + + * tests/child-test.c glib/gmain.c : + applied patch from J. Ali Harlow to fix + g_child_watch implementation on win32, bug #50296 + Fri Feb 27 22:13:22 2004 Matthias Clasen * glib/gqueue.c: Trivial doc changes. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 6c0e65954..b8be66679 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,17 @@ +2003-02-28 Hans Breuer + + * glib/glib.def : updated externals, including those + from bug #135386 + + * glib/makefile.msc.in : build gatomic.c + + * glibconfig.h.win32.in : removed duplicate definition + of G_MAXSIZE, typedef void* GPid instead of int + + * tests/child-test.c glib/gmain.c : + applied patch from J. Ali Harlow to fix + g_child_watch implementation on win32, bug #50296 + Fri Feb 27 22:13:22 2004 Matthias Clasen * glib/gqueue.c: Trivial doc changes. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 6c0e65954..b8be66679 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,17 @@ +2003-02-28 Hans Breuer + + * glib/glib.def : updated externals, including those + from bug #135386 + + * glib/makefile.msc.in : build gatomic.c + + * glibconfig.h.win32.in : removed duplicate definition + of G_MAXSIZE, typedef void* GPid instead of int + + * tests/child-test.c glib/gmain.c : + applied patch from J. Ali Harlow to fix + g_child_watch implementation on win32, bug #50296 + Fri Feb 27 22:13:22 2004 Matthias Clasen * glib/gqueue.c: Trivial doc changes. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 6c0e65954..b8be66679 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,17 @@ +2003-02-28 Hans Breuer + + * glib/glib.def : updated externals, including those + from bug #135386 + + * glib/makefile.msc.in : build gatomic.c + + * glibconfig.h.win32.in : removed duplicate definition + of G_MAXSIZE, typedef void* GPid instead of int + + * tests/child-test.c glib/gmain.c : + applied patch from J. Ali Harlow to fix + g_child_watch implementation on win32, bug #50296 + Fri Feb 27 22:13:22 2004 Matthias Clasen * glib/gqueue.c: Trivial doc changes. diff --git a/glib/glib.def b/glib/glib.def index d92070afe..112b612df 100644 --- a/glib/glib.def +++ b/glib/glib.def @@ -44,6 +44,12 @@ EXPORTS g_async_queue_unref g_async_queue_unref_and_unlock g_atexit + g_atomic_int_add_fallback + g_atomic_int_compare_and_exchange_fallback + g_atomic_int_exchange_and_add_fallback +; g_atomic_int_get_fallback + g_atomic_pointer_compare_and_exchange_fallback +; g_atomic_pointer_get_fallback g_basename g_bit_nth_lsf g_bit_nth_msf @@ -68,6 +74,9 @@ EXPORTS g_cache_new g_cache_remove g_cache_value_foreach + g_child_watch_add + g_child_watch_add_full + g_child_watch_source_new g_clear_error g_completion_add_items g_completion_clear_items @@ -363,6 +372,7 @@ EXPORTS g_node_child_position g_node_children_foreach g_node_copy + g_node_copy_deep g_node_depth g_node_destroy g_node_find @@ -427,6 +437,7 @@ EXPORTS g_queue_copy g_queue_delete_link g_queue_find + g_queue_find_custom g_queue_foreach g_queue_free g_queue_get_length @@ -648,6 +659,7 @@ EXPORTS g_string_sized_new g_string_truncate g_string_up + g_strip_context g_strjoin g_strjoinv g_strlcat diff --git a/glib/gmain.c b/glib/gmain.c index f02fcea2d..128cbef09 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -168,8 +168,12 @@ struct _GChildWatchSource GSource source; GPid pid; gint child_status; - gint count; - gboolean child_exited; +#ifdef G_OS_WIN32 + GPollFD poll; +#else /* G_OS_WIN32 */ + gint count; + gboolean child_exited; +#endif /* G_OS_WIN32 */ }; struct _GPollRec @@ -243,6 +247,7 @@ G_LOCK_DEFINE_STATIC (main_loop); static GMainContext *default_main_context; static GSList *main_contexts_without_pipe = NULL; +#ifndef G_OS_WIN32 /* Child status monitoring code */ enum { CHILD_WATCH_UNINITIALIZED, @@ -251,11 +256,8 @@ enum { }; static gint child_watch_init_state = CHILD_WATCH_UNINITIALIZED; static gint child_watch_count = 0; -#ifndef G_OS_WIN32 static gint child_watch_wake_up_pipe[2] = {0, 0}; -#else -static HANDLE child_watch_wake_up_semaphore = NULL; -#endif +#endif /* !G_OS_WIN32 */ G_LOCK_DEFINE_STATIC (main_context_list); static GSList *main_context_list = NULL; @@ -3250,6 +3252,54 @@ g_timeout_add (guint32 interval, /* Child watch functions */ +#ifdef G_OS_WIN32 + +static gboolean +g_child_watch_prepare (GSource *source, + gint *timeout) +{ + *timeout = -1; + return FALSE; +} + + +static gboolean +g_child_watch_check (GSource *source) +{ + GChildWatchSource *child_watch_source; + gboolean child_exited; + + child_watch_source = (GChildWatchSource *) source; + + child_exited = child_watch_source->poll.revents & G_IO_IN; + + if (child_exited) + { + DWORD child_status; + + /* + * Note: We do _not_ check for the special value of STILL_ACTIVE + * since we know that the process has exited and doing so runs into + * problems if the child process "happens to return STILL_ACTIVE(259)" + * as Microsoft's Platform SDK puts it. + */ + if (!GetExitCodeProcess (child_watch_source->pid, &child_status)) + { + gchar *emsg = g_win32_error_message (GetLastError ()); + g_warning (G_STRLOC ": GetExitCodeProcess() failed: %s", emsg); + g_free (emsg); + + child_watch_source->child_status = -1; + } + else + child_watch_source->child_status = child_status; + } + + return child_exited; +} + +#else /* G_OS_WIN32 */ + static void check_for_child_exited (GSource *source) { @@ -3263,15 +3313,9 @@ check_for_child_exited (GSource *source) if (child_watch_source->count < count) { -#ifndef G_OS_WIN32 gint child_status; if (waitpid (child_watch_source->pid, &child_status, WNOHANG) > 0) -#else - DWORD child_status; - if (GetExitCodeProcess (child_watch_source->pid, &child_status) && - child_status != STILL_ACTIVE) -#endif { child_watch_source->child_status = child_status; child_watch_source->child_exited = TRUE; @@ -3305,6 +3349,8 @@ g_child_watch_check (GSource *source) return (child_watch_source->count < child_watch_count); } +#endif /* G_OS_WIN32 */ + static gboolean g_child_watch_dispatch (GSource *source, GSourceFunc callback, @@ -3328,6 +3374,8 @@ g_child_watch_dispatch (GSource *source, return FALSE; } +#ifndef G_OS_WIN32 + static void g_child_watch_signal_handler (int signum) { @@ -3335,11 +3383,7 @@ g_child_watch_signal_handler (int signum) if (child_watch_init_state == CHILD_WATCH_INITIALIZED_THREADED) { -#ifndef G_OS_WIN32 write (child_watch_wake_up_pipe[1], "B", 1); -#else - ReleaseSemaphore(child_watch_wake_up_semaphore, 1, NULL); -#endif } else { @@ -3356,11 +3400,7 @@ g_child_watch_source_init_single (void) child_watch_init_state = CHILD_WATCH_INITIALIZED_SINGLE; -#ifndef G_OS_WIN32 signal (SIGCHLD, g_child_watch_signal_handler); -#else - /* FIXME: really nothing to be done ? --hb */ -#endif } static gpointer @@ -3375,21 +3415,15 @@ child_watch_helper_thread (gpointer data) poll_func = g_poll; #endif -#ifndef G_OS_WIN32 fds.fd = child_watch_wake_up_pipe[0]; fds.events = G_IO_IN; -#endif while (1) { gchar b[20]; GSList *list; -#ifndef G_OS_WIN32 read (child_watch_wake_up_pipe[0], b, 20); -#else - WaitForSingleObject(child_watch_wake_up_semaphore, INFINITE); -#endif /* We were woken up. Wake up all other contexts in all other threads */ G_UNLOCK (main_context_list); @@ -3412,24 +3446,16 @@ g_child_watch_source_init_multi_threaded (void) g_assert (g_thread_supported()); -#ifndef G_OS_WIN32 if (pipe (child_watch_wake_up_pipe) < 0) g_error ("Cannot create wake up pipe: %s\n", g_strerror (errno)); fcntl (child_watch_wake_up_pipe[1], F_SETFL, O_NONBLOCK | fcntl (child_watch_wake_up_pipe[1], F_GETFL)); -#else - child_watch_wake_up_semaphore = CreateSemaphore (NULL, 0, G_MAXINT, NULL); -#endif /* We create a helper thread that polls on the wakeup pipe indefinitely */ /* FIXME: Think this through for races */ if (g_thread_create (child_watch_helper_thread, NULL, FALSE, &error) == NULL) g_error ("Cannot create a thread to monitor child exit status: %s\n", error->message); child_watch_init_state = CHILD_WATCH_INITIALIZED_THREADED; -#ifndef G_OS_WIN32 signal (SIGCHLD, g_child_watch_signal_handler); -#else - /* FIXME: really nothing to be done ? --hb */ -#endif } static void @@ -3455,6 +3481,8 @@ g_child_watch_source_init (void) } } +#endif /* !G_OS_WIN32 */ + /** * g_child_watch_source_new: * @pid: process id of a child process to watch @@ -3475,7 +3503,14 @@ g_child_watch_source_new (GPid pid) GSource *source = g_source_new (&g_child_watch_funcs, sizeof (GChildWatchSource)); GChildWatchSource *child_watch_source = (GChildWatchSource *)source; +#ifdef G_OS_WIN32 + child_watch_source->poll.fd = (int)pid; + child_watch_source->poll.events = G_IO_IN; + + g_source_add_poll (source, &child_watch_source->poll); +#else /* G_OS_WIN32 */ g_child_watch_source_init (); +#endif /* G_OS_WIN32 */ child_watch_source->pid = pid; diff --git a/glib/makefile.msc.in b/glib/makefile.msc.in index 203681d86..3e566c374 100644 --- a/glib/makefile.msc.in +++ b/glib/makefile.msc.in @@ -89,7 +89,7 @@ localcharset.c : libcharset/localcharset.c glib-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib : $(glib_OBJECTS) gnulib\gnulib.lib lib /out:glib-@GLIB_MAJOR_VERSION@.@GLIB_MINOR_VERSION@s.lib $(glib_OBJECTS) gnulib\gnulib.lib -libglib-2.0-@LT_CURRENT_MINUS_AGE@.dll : $(glib_OBJECTS) glib.def +libglib-2.0-@LT_CURRENT_MINUS_AGE@.dll : $(glib_OBJECTS) gnulib\gnulib.lib glib.def $(CC) $(CFLAGS) -LD -Fe$@ $(glib_OBJECTS) $(LIBICONV_LIBS) $(INTL_LIBS) \ gnulib\gnulib.lib $(DIRENT_LIBS) user32.lib advapi32.lib shell32.lib wsock32.lib $(LDFLAGS) /implib:glib-2.0.lib /def:glib.def diff --git a/glibconfig.h.win32.in b/glibconfig.h.win32.in index d4b1313f5..e8295c4b1 100644 --- a/glibconfig.h.win32.in +++ b/glibconfig.h.win32.in @@ -74,8 +74,6 @@ typedef unsigned int gsize; #define G_GSSIZE_FORMAT "i" #define G_GSIZE_FORMAT "u" -#define G_MAXSIZE G_MAXUINT - #define GPOINTER_TO_INT(p) ((gint) (p)) #define GPOINTER_TO_UINT(p) ((guint) (p)) @@ -192,7 +190,7 @@ union _GSystemThread #define G_MODULE_SUFFIX "dll" -typedef int GPid; +typedef void* GPid; G_END_DECLS