diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2016-05-18 18:14:16 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2016-05-18 18:14:16 +0100 |
commit | 5602ef4bf2a06771412fb4ce34e38bf967e018e6 (patch) | |
tree | 4535e35e360e0f53990c3e32034b159b2e26f9cd | |
parent | aa44956ef6b928534e2b93a0ddaaf7b4fbe32651 (diff) | |
parent | 78362cfc62ebc5af8b529048b2e2aec0f977ceeb (diff) | |
download | dbus-5602ef4bf2a06771412fb4ce34e38bf967e018e6.tar.gz |
Merge branch 'dbus-1.10' into dbus-1.10-ci
-rw-r--r-- | dbus/dbus-internals.h | 1 | ||||
-rw-r--r-- | dbus/dbus-spawn-win.c | 52 | ||||
-rw-r--r-- | dbus/dbus-sysdeps.h | 3 | ||||
-rw-r--r-- | test/spawn-test.c | 2 | ||||
-rw-r--r-- | test/test-segfault.c | 26 |
5 files changed, 69 insertions, 15 deletions
diff --git a/dbus/dbus-internals.h b/dbus/dbus-internals.h index df8e9643..5e6efd81 100644 --- a/dbus/dbus-internals.h +++ b/dbus/dbus-internals.h @@ -124,6 +124,7 @@ static void _dbus_verbose(const char * x,...) {;} # define _dbus_is_verbose() FALSE #endif /* !DBUS_ENABLE_VERBOSE_MODE */ +DBUS_PRIVATE_EXPORT void _dbus_trace_ref (const char *obj_name, void *obj, int old_refcount, diff --git a/dbus/dbus-spawn-win.c b/dbus/dbus-spawn-win.c index c58bf3cd..f741f923 100644 --- a/dbus/dbus-spawn-win.c +++ b/dbus/dbus-spawn-win.c @@ -60,7 +60,7 @@ */ struct DBusBabysitter { - int refcount; + DBusAtomic refcount; HANDLE start_sync_event; #ifdef DBUS_ENABLE_EMBEDDED_TESTS @@ -91,16 +91,33 @@ struct DBusBabysitter int child_status; }; +static void +_dbus_babysitter_trace_ref (DBusBabysitter *sitter, + int old_refcount, + int new_refcount, + const char *why) +{ +#ifdef DBUS_ENABLE_VERBOSE_MODE + static int enabled = -1; + + _dbus_trace_ref ("DBusBabysitter", sitter, old_refcount, new_refcount, why, + "DBUS_BABYSITTER_TRACE", &enabled); +#endif +} + static DBusBabysitter* _dbus_babysitter_new (void) { DBusBabysitter *sitter; + dbus_int32_t old_refcount; sitter = dbus_new0 (DBusBabysitter, 1); if (sitter == NULL) return NULL; - sitter->refcount = 1; + old_refcount = _dbus_atomic_inc (&sitter->refcount); + + _dbus_babysitter_trace_ref (sitter, old_refcount, old_refcount+1, __FUNCTION__); sitter->start_sync_event = CreateEvent (NULL, FALSE, FALSE, NULL); if (sitter->start_sync_event == NULL) @@ -148,11 +165,13 @@ _dbus_babysitter_new (void) DBusBabysitter * _dbus_babysitter_ref (DBusBabysitter *sitter) { + dbus_int32_t old_refcount; PING(); _dbus_assert (sitter != NULL); - _dbus_assert (sitter->refcount > 0); - sitter->refcount += 1; + old_refcount = _dbus_atomic_inc (&sitter->refcount); + _dbus_assert (old_refcount > 0); + _dbus_babysitter_trace_ref (sitter, old_refcount, old_refcount+1, __FUNCTION__); return sitter; } @@ -187,14 +206,16 @@ void _dbus_babysitter_unref (DBusBabysitter *sitter) { int i; + dbus_int32_t old_refcount; PING(); _dbus_assert (sitter != NULL); - _dbus_assert (sitter->refcount > 0); - sitter->refcount -= 1; + old_refcount = _dbus_atomic_dec (&sitter->refcount); + _dbus_assert (old_refcount > 0); + _dbus_babysitter_trace_ref (sitter, old_refcount, old_refcount-1, __FUNCTION__); - if (sitter->refcount == 0) + if (old_refcount == 1) { close_socket_to_babysitter (sitter); @@ -584,10 +605,9 @@ babysitter (void *parameter) { int ret = 0; DBusBabysitter *sitter = (DBusBabysitter *) parameter; + HANDLE handle; PING(); - _dbus_babysitter_ref (sitter); - if (sitter->child_setup) { PING(); @@ -597,11 +617,14 @@ babysitter (void *parameter) _dbus_verbose ("babysitter: spawning %s\n", sitter->log_name); PING(); - sitter->child_handle = spawn_program (sitter->log_name, - sitter->argv, sitter->envp); + handle = spawn_program (sitter->log_name, sitter->argv, sitter->envp); PING(); - if (sitter->child_handle == (HANDLE) -1) + if (handle != INVALID_HANDLE_VALUE) + { + sitter->child_handle = handle; + } + else { sitter->child_handle = NULL; sitter->have_spawn_errno = TRUE; @@ -659,7 +682,8 @@ _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, _DBUS_ASSERT_ERROR_IS_CLEAR (error); _dbus_assert (argv[0] != NULL); - *sitter_p = NULL; + if (sitter_p != NULL) + *sitter_p = NULL; PING(); sitter = _dbus_babysitter_new (); @@ -727,7 +751,7 @@ _dbus_spawn_async_with_babysitter (DBusBabysitter **sitter_p, PING(); sitter_thread = (HANDLE) CreateThread (NULL, 0, babysitter, - sitter, 0, &sitter_thread_id); + _dbus_babysitter_ref (sitter), 0, &sitter_thread_id); if (sitter_thread == 0) { diff --git a/dbus/dbus-sysdeps.h b/dbus/dbus-sysdeps.h index 2f493b09..2d152b8c 100644 --- a/dbus/dbus-sysdeps.h +++ b/dbus/dbus-sysdeps.h @@ -295,8 +295,11 @@ struct DBusAtomic # undef DBUS_HAVE_ATOMIC_INT #endif +DBUS_PRIVATE_EXPORT dbus_int32_t _dbus_atomic_inc (DBusAtomic *atomic); +DBUS_PRIVATE_EXPORT dbus_int32_t _dbus_atomic_dec (DBusAtomic *atomic); +DBUS_PRIVATE_EXPORT dbus_int32_t _dbus_atomic_get (DBusAtomic *atomic); #ifdef DBUS_WIN diff --git a/test/spawn-test.c b/test/spawn-test.c index 723a4889..12d37c80 100644 --- a/test/spawn-test.c +++ b/test/spawn-test.c @@ -16,7 +16,7 @@ main (int argc, char **argv) { char **argv_copy; int i; - DBusError error; + DBusError error = DBUS_ERROR_INIT; if (argc < 2) { diff --git a/test/test-segfault.c b/test/test-segfault.c index c062ce1c..b6c0f8ad 100644 --- a/test/test-segfault.c +++ b/test/test-segfault.c @@ -13,11 +13,37 @@ #include <sys/prctl.h> #endif +#ifdef DBUS_WIN +#include <stdio.h> +#include <windows.h> + +int +exception_handler(LPEXCEPTION_POINTERS p); + +/* Explicit Windows exception handlers needed to supress OS popups */ +int +exception_handler(LPEXCEPTION_POINTERS p) +{ + fprintf(stderr, "test-segfault: raised fatal exception as intended\n"); + ExitProcess(0xc0000005); +} +#endif + int main (int argc, char **argv) { char *p; +#ifdef DBUS_WIN + /* Disable Windows popup dialog when an app crashes so that app quits + * immediately with error code instead of waiting for user to dismiss + * the dialog. */ + DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX); + SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX); + /* Disable "just in time" debugger */ + SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)&exception_handler); +#endif + #if HAVE_SETRLIMIT /* No core dumps please, we know we crashed. */ struct rlimit r = { 0, }; |