cleanup
[platform/upstream/glib.git] / gio / tests / contexts.c
index 5ddb54f..60b3d1f 100644 (file)
@@ -2,7 +2,8 @@
 #include <stdlib.h>
 #include <string.h>
 
-#define TEST_FILE (SRCDIR "/Makefile.am")
+static gchar *test_file;
+
 char *test_file_buffer;
 gsize test_file_size;
 static char async_read_buffer[8192];
@@ -52,45 +53,42 @@ opened_for_read (GObject *source, GAsyncResult *result, gpointer loop)
 static gboolean idle_start_test1_thread (gpointer loop);
 static gpointer test1_thread (gpointer user_data);
 
-static GCond *test1_cond;
-static GMutex *test1_mutex;
+static gboolean test1_done;
+static GCond test1_cond;
+static GMutex test1_mutex;
 
 static void
 test_thread_independence (void)
 {
   GMainLoop *loop;
 
-  test1_cond = g_cond_new ();
-  test1_mutex = g_mutex_new ();
-
   loop = g_main_loop_new (NULL, FALSE);
   g_idle_add (idle_start_test1_thread, loop);
   g_main_loop_run (loop);
   g_main_loop_unref (loop);
-
-  g_mutex_free (test1_mutex);
-  g_cond_free (test1_cond);
 }
 
 static gboolean
 idle_start_test1_thread (gpointer loop)
 {
-  GTimeVal time;
+  gint64 time;
   GThread *thread;
   gboolean io_completed;
 
-  g_mutex_lock (test1_mutex);
-  thread = g_thread_create (test1_thread, NULL, TRUE, NULL);
+  g_mutex_lock (&test1_mutex);
+  thread = g_thread_new ("test1", test1_thread, NULL);
 
-  g_get_current_time (&time);
-  time.tv_sec += 2;
-  io_completed = g_cond_timed_wait (test1_cond, test1_mutex, &time);
-  g_assert (io_completed);
+  time = g_get_monotonic_time () + 2 * G_TIME_SPAN_SECOND;
+  while (!test1_done)
+    {
+      io_completed = g_cond_wait_until (&test1_cond, &test1_mutex, time);
+      g_assert (io_completed);
+    }
   g_thread_join (thread);
 
-  g_mutex_unlock (test1_mutex);
+  g_mutex_unlock (&test1_mutex);
   g_main_loop_quit (loop);
-  return FALSE;
+  return G_SOURCE_REMOVE;
 }
 
 static gpointer
@@ -101,15 +99,14 @@ test1_thread (gpointer user_data)
   GFile *file;
 
   /* Wait for main thread to be waiting on test1_cond */
-  g_mutex_lock (test1_mutex);
-  g_mutex_unlock (test1_mutex);
+  g_mutex_lock (&test1_mutex);
 
   context = g_main_context_new ();
   g_assert (g_main_context_get_thread_default () == NULL);
   g_main_context_push_thread_default (context);
   g_assert (g_main_context_get_thread_default () == context);
 
-  file = g_file_new_for_path (TEST_FILE);
+  file = g_file_new_for_path (test_file);
   g_assert (g_file_supports_thread_contexts (file));
 
   loop = g_main_loop_new (context, FALSE);
@@ -119,7 +116,13 @@ test1_thread (gpointer user_data)
   g_main_loop_run (loop);
   g_main_loop_unref (loop);
 
-  g_cond_signal (test1_cond);
+  test1_done = TRUE;
+  g_cond_signal (&test1_cond);
+  g_mutex_unlock (&test1_mutex);
+
+  g_main_context_pop_thread_default (context);
+  g_main_context_unref (context);
+
   return NULL;
 }
 
@@ -144,7 +147,7 @@ test_context_independence (void)
   g_main_context_push_thread_default (context);
   g_assert (g_main_context_get_thread_default () == context);
 
-  file = g_file_new_for_path (TEST_FILE);
+  file = g_file_new_for_path (test_file);
   g_assert (g_file_supports_thread_contexts (file));
 
   /* Add a timeout to the main loop, to fail immediately if it gets run */
@@ -165,6 +168,9 @@ test_context_independence (void)
   g_source_remove (default_timeout);
   g_source_destroy (thread_default_timeout);
   g_source_unref (thread_default_timeout);
+
+  g_main_context_pop_thread_default (context);
+  g_main_context_unref (context);
 }
 
 static gboolean
@@ -178,17 +184,22 @@ int
 main (int argc, char **argv)
 {
   GError *error = NULL;
+  int ret;
 
-  g_thread_init (NULL);
-  g_type_init ();
   g_test_init (&argc, &argv, NULL);
 
-  g_file_get_contents (TEST_FILE, &test_file_buffer,
+  test_file = g_test_build_filename (G_TEST_DIST, "contexts.c", NULL);
+  g_file_get_contents (test_file, &test_file_buffer,
                       &test_file_size, &error);
   g_assert_no_error (error);
 
   g_test_add_func ("/gio/contexts/thread-independence", test_thread_independence);
   g_test_add_func ("/gio/contexts/context-independence", test_context_independence);
 
-  return g_test_run();
+  ret = g_test_run();
+
+  g_free (test_file_buffer);
+  g_free (test_file);
+
+  return ret;
 }