X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=tests%2Fchild-test.c;h=ad055b27028009f07236e8a739f010e1dd8689c5;hb=d8722441d167694dd943aeeab4e8addd4ce41f6a;hp=be65b3fca51cd70e2d6b05440c0c387ff337adad;hpb=109ebb109a49735cb42c84f6c9ba881c50797011;p=platform%2Fupstream%2Fglib.git diff --git a/tests/child-test.c b/tests/child-test.c index be65b3f..ad055b2 100644 --- a/tests/child-test.c +++ b/tests/child-test.c @@ -38,6 +38,12 @@ #include #endif +#ifdef G_OS_WIN32 +#define GPID_FORMAT "%p" +#else +#define GPID_FORMAT "%d" +#endif + GMainLoop *main_loop; gint alive; @@ -45,7 +51,7 @@ gint alive; char *argv0; #endif -GPid +static GPid get_a_child (gint ttl) { GPid pid; @@ -62,7 +68,7 @@ get_a_child (gint ttl) cmdline = g_strdup_printf( "child-test -c%d", ttl); if (!CreateProcess (argv0, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) - exit (1); + g_error ("CreateProcess failed: %s\n", g_win32_error_message (GetLastError ())); g_free(cmdline); @@ -83,23 +89,34 @@ get_a_child (gint ttl) #endif /* G_OS_WIN32 */ } -gboolean +static gboolean child_watch_callback (GPid pid, gint status, gpointer data) { +#ifdef VERBOSE gint ttl = GPOINTER_TO_INT (data); -#ifndef G_OS_WIN32 - g_print ("child %d (ttl %d) exited, status %d\n", pid, ttl, status); -#else - g_print ("child %p (ttl %d) exited, status %d\n", pid, ttl, status); + g_print ("child " GPID_FORMAT " (ttl %d) exited, status %d\n", pid, ttl, status); #endif + g_spawn_close_pid (pid); + if (--alive == 0) g_main_loop_quit (main_loop); return TRUE; } +static gboolean +quit_loop (gpointer data) +{ + GMainLoop *main_loop = data; + + g_main_loop_quit (main_loop); + + return TRUE; +} + +#ifdef TEST_THREAD static gpointer test_thread (gpointer data) { @@ -116,44 +133,69 @@ test_thread (gpointer data) g_source_attach (source, g_main_loop_get_context (new_main_loop)); g_source_unref (source); -#ifdef G_OS_WIN32 - g_print ("whee! created pid: %p (ttl %d)\n", pid, ttl); - CloseHandle(pid); -#else - g_print ("whee! created pid: %d (ttl %d)\n", pid, ttl); +#ifdef VERBOSE + g_print ("whee! created pid: " GPID_FORMAT " (ttl %d)\n", pid, ttl); #endif g_main_loop_run (new_main_loop); return NULL; } +#endif int main (int argc, char *argv[]) { +#ifndef TEST_THREAD + GPid pid; +#endif #ifdef G_OS_WIN32 argv0 = argv[0]; if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'c') { int ttl = atoi (argv[1] + 2); Sleep (ttl * 1000); + /* Exit on purpose with STILL_ACTIVE (which isn't a very common + * exit status) to verify that g_child_watch_check() in gmain.c + * doesn't believe a child still to be active if it happens to + * exit with that status. + */ exit (STILL_ACTIVE); } #endif - /* Only run the test, if threads are enabled and a default thread - implementation is available */ -#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE) - g_thread_init (NULL); + main_loop = g_main_loop_new (NULL, FALSE); - system ("/bin/true"); +#ifdef G_OS_WIN32 + system ("ipconfig /all"); +#else + system ("true"); +#endif alive = 2; + g_timeout_add_seconds (30, quit_loop, main_loop); + +#ifdef TEST_THREAD g_thread_create (test_thread, GINT_TO_POINTER (10), FALSE, NULL); g_thread_create (test_thread, GINT_TO_POINTER (20), FALSE, NULL); +#else + pid = get_a_child (10); + g_child_watch_add (pid, (GChildWatchFunc) child_watch_callback, + GINT_TO_POINTER (10)); + pid = get_a_child (20); + g_child_watch_add (pid, (GChildWatchFunc) child_watch_callback, + GINT_TO_POINTER (20)); +#endif g_main_loop_run (main_loop); -#endif + g_main_loop_unref (main_loop); + + if (alive > 0) + { + g_warning ("%d children still alive\n", alive); + return 1; + } + return 0; }