[kdbus] sync with kdbus (kdbus.h - commit: 5ae1ecac44cb)
[platform/upstream/glib.git] / tests / asyncqueue-test.c
index 8dbe94b..84d7810 100644 (file)
@@ -1,15 +1,16 @@
 #undef G_DISABLE_ASSERT
 #undef G_LOG_DOMAIN
-
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-#include <glib.h>
+#undef G_DISABLE_DEPRECATED
 
 #include <time.h>
 #include <stdlib.h>
 
-#define d(x) x
+#include <glib.h>
+
+#define DEBUG_MSG(args)
+/* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n");  */
+#define PRINT_MSG(args)
+/* #define PRINT_MSG(args) g_print args ; g_print ("\n"); */
 
 #define MAX_THREADS            50
 #define MAX_SORTS              5    /* only applies if
@@ -29,7 +30,7 @@
 #endif
 
 
-static GMainLoop *main_loop = NULL;
+static GMainLoop   *main_loop = NULL;
 static GThreadPool *thread_pool = NULL;
 static GAsyncQueue *async_queue = NULL;
 
@@ -43,7 +44,7 @@ sort_compare (gconstpointer p1, gconstpointer p2, gpointer user_data)
   id1 = GPOINTER_TO_INT (p1);
   id2 = GPOINTER_TO_INT (p2);
 
-  d(g_print ("comparing #1:%d and #2:%d, returning %d\n", 
+  DEBUG_MSG (("comparing #1:%d and #2:%d, returning %d", 
             id1, id2, (id1 > id2 ? +1 : id1 == id2 ? 0 : -1)));
 
   return (id1 > id2 ? +1 : id1 == id2 ? 0 : -1);
@@ -52,16 +53,18 @@ sort_compare (gconstpointer p1, gconstpointer p2, gpointer user_data)
 static gboolean
 sort_queue (gpointer user_data)
 {
-  static gint sorts = 0;
-  gboolean can_quit = FALSE;
-  gint sort_multiplier;
-  gint len;
-  gint i;
+  static gint     sorts = 0;
+  static gpointer last_p = NULL;
+  gpointer        p;
+  gboolean        can_quit = FALSE;
+  gint            sort_multiplier;
+  gint            len;
+  gint            i;
 
   sort_multiplier = GPOINTER_TO_INT (user_data);
 
   if (SORT_QUEUE_AFTER) {
-    d(g_print ("sorting async queue...\n")); 
+    PRINT_MSG (("sorting async queue...")); 
     g_async_queue_sort (async_queue, sort_compare, NULL);
 
     sorts++;
@@ -73,18 +76,22 @@ sort_queue (gpointer user_data)
     g_async_queue_sort (async_queue, sort_compare, NULL);
     len = g_async_queue_length (async_queue);
 
-    d(g_print ("sorted queue (for %d/%d times, size:%d)...\n", sorts, MAX_SORTS, len)); 
+    PRINT_MSG (("sorted queue (for %d/%d times, size:%d)...", sorts, MAX_SORTS, len)); 
   } else {
     can_quit = TRUE;
     len = g_async_queue_length (async_queue);
-    d(g_print ("printing queue (size:%d)...\n", len)); 
+    DEBUG_MSG (("printing queue (size:%d)...", len)); 
   }
 
-  for (i = 0; i < len; i++) {
-    gpointer p;
-    
+  for (i = 0, last_p = NULL; i < len; i++) {
     p = g_async_queue_pop (async_queue);
-    d(g_print ("item %d ---> %d\n", i, GPOINTER_TO_INT (p))); 
+    DEBUG_MSG (("item %d ---> %d", i, GPOINTER_TO_INT (p))); 
+
+    if (last_p) {
+      g_assert (GPOINTER_TO_INT (last_p) <= GPOINTER_TO_INT (p));
+    }
+
+    last_p = p;
   }
   
   if (can_quit && QUIT_WHEN_DONE) {
@@ -97,14 +104,14 @@ sort_queue (gpointer user_data)
 static void
 enter_thread (gpointer data, gpointer user_data)
 {
-  gint   len;
+  gint   len G_GNUC_UNUSED;
   gint   id;
   gulong ms;
 
   id = GPOINTER_TO_INT (data);
   
   ms = g_random_int_range (MIN_TIME * 1000, MAX_TIME * 1000);
-  d(g_print ("entered thread with id:%d, adding to queue in:%ld ms\n", id, ms));
+  DEBUG_MSG (("entered thread with id:%d, adding to queue in:%ld ms", id, ms));
 
   g_usleep (ms * 1000);
 
@@ -116,27 +123,76 @@ enter_thread (gpointer data, gpointer user_data)
 
   len = g_async_queue_length (async_queue);
 
-  d(g_print ("thread id:%d added to async queue (size:%d)\n", 
+  DEBUG_MSG (("thread id:%d added to async queue (size:%d)", 
             id, len));
 }
 
-int main (int argc, char *argv[])
+static gint destroy_count = 0;
+
+static void
+counting_destroy (gpointer item)
+{
+  destroy_count++;
+}
+
+static void
+basic_tests (void)
 {
-#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
-  gint i;
-  gint max_threads = MAX_THREADS;
-  gint max_unused_threads = MAX_THREADS;
-  gint sort_multiplier = MAX_SORTS;
-  gint sort_interval;
+  GAsyncQueue *q;
+  gpointer item;
+
+  destroy_count = 0;
+
+  q = g_async_queue_new_full (counting_destroy);
+  g_async_queue_lock (q);
+  g_async_queue_ref (q);
+  g_async_queue_unlock (q);
+  g_async_queue_lock (q);
+  g_async_queue_ref_unlocked (q);
+  g_async_queue_unref_and_unlock (q);
 
-  g_thread_init (NULL);
+  item = g_async_queue_try_pop (q);
+  g_assert (item == NULL);
 
-  d(g_print ("creating async queue...\n"));
+  g_async_queue_lock (q);
+  item = g_async_queue_try_pop_unlocked (q);
+  g_async_queue_unlock (q);
+  g_assert (item == NULL);
+
+  g_async_queue_push (q, GINT_TO_POINTER (1));
+  g_async_queue_push (q, GINT_TO_POINTER (2));
+  g_async_queue_push (q, GINT_TO_POINTER (3));
+  g_assert_cmpint (destroy_count, ==, 0);
+
+  g_async_queue_unref (q);
+  g_assert_cmpint (destroy_count, ==, 0);
+
+  item = g_async_queue_pop (q);
+  g_assert_cmpint (GPOINTER_TO_INT (item), ==, 1);
+  g_assert_cmpint (destroy_count, ==, 0);
+
+  g_async_queue_unref (q);
+  g_assert_cmpint (destroy_count, ==, 2);
+}
+
+int 
+main (int argc, char *argv[])
+{
+  gint   i;
+  gint   max_threads = MAX_THREADS;
+  gint   max_unused_threads = MAX_THREADS;
+  gint   sort_multiplier = MAX_SORTS;
+  gint   sort_interval;
+  gchar *msg G_GNUC_UNUSED;
+
+  basic_tests ();
+
+  PRINT_MSG (("creating async queue..."));
   async_queue = g_async_queue_new ();
 
   g_return_val_if_fail (async_queue != NULL, EXIT_FAILURE);
 
-  d(g_print ("creating thread pool with max threads:%d, max unused threads:%d...\n",
+  PRINT_MSG (("creating thread pool with max threads:%d, max unused threads:%d...",
             max_threads, max_unused_threads));
   thread_pool = g_thread_pool_new (enter_thread,
                                   async_queue,
@@ -148,15 +204,13 @@ int main (int argc, char *argv[])
 
   g_thread_pool_set_max_unused_threads (max_unused_threads);
 
-  d(g_print ("creating threads...\n"));
-  for (i = 0; i <= max_threads; i++) {
+  PRINT_MSG (("creating threads..."));
+  for (i = 1; i <= max_threads; i++) {
     GError *error = NULL;
   
     g_thread_pool_push (thread_pool, GINT_TO_POINTER (i), &error);
     
-    if (!error) {
-      g_assert_not_reached ();
-    }
+    g_assert_no_error (error);
   }
 
   if (!SORT_QUEUE_AFTER) {
@@ -164,19 +218,28 @@ int main (int argc, char *argv[])
   }
   
   sort_interval = ((MAX_TIME / sort_multiplier) + 2)  * 1000;
-  d(g_print ("adding timeout of %d seconds to sort %d times\n", 
-            sort_interval, sort_multiplier));
   g_timeout_add (sort_interval, sort_queue, GINT_TO_POINTER (sort_multiplier));
 
   if (SORT_QUEUE_ON_PUSH) {
-    d(g_print ("sorting when pushing into the queue...\n")); 
+    msg = "sorting when pushing into the queue, checking queue is sorted";
+  } else {
+    msg = "sorting";
   }
 
-  d(g_print ("entering main event loop\n"));
+  PRINT_MSG (("%s %d %s %d ms",
+             msg,
+             sort_multiplier, 
+             sort_multiplier == 1 ? "time in" : "times, once every",
+             sort_interval));
+
+  DEBUG_MSG (("entering main event loop"));
 
   main_loop = g_main_loop_new (NULL, FALSE);
   g_main_loop_run (main_loop);
-#endif
-  
+
+  g_main_loop_unref (main_loop);
+  g_thread_pool_free (thread_pool, TRUE, TRUE);
+  g_async_queue_unref (async_queue);
+
   return EXIT_SUCCESS;
 }