Home | History | Annotate | Download | only in tests
      1 #undef G_DISABLE_ASSERT
      2 #undef G_LOG_DOMAIN
      3 #define G_ERRORCHECK_MUTEXES
      4 
      5 #include <glib.h>
      6 #include <stdio.h>
      7 #include <string.h>
      8 
      9 static gpointer
     10 locking_thread (gpointer mutex)
     11 {
     12   g_mutex_lock ((GMutex*)mutex);
     13 
     14   return NULL;
     15 }
     16 
     17 static void
     18 lock_locked_mutex (void)
     19 {
     20   GMutex* mutex = g_mutex_new ();
     21   g_mutex_lock (mutex);
     22   g_mutex_lock (mutex);
     23 }
     24 
     25 static void
     26 trylock_locked_mutex (void)
     27 {
     28   GMutex* mutex = g_mutex_new ();
     29   g_mutex_lock (mutex);
     30   g_mutex_trylock (mutex);
     31 }
     32 
     33 static void
     34 unlock_unlocked_mutex (void)
     35 {
     36   GMutex* mutex = g_mutex_new ();
     37   g_mutex_lock (mutex);
     38   g_mutex_unlock (mutex);
     39   g_mutex_unlock (mutex);
     40 }
     41 
     42 static void
     43 free_locked_mutex (void)
     44 {
     45   GMutex* mutex = g_mutex_new ();
     46   g_mutex_lock (mutex);
     47   g_mutex_free (mutex);
     48 }
     49 
     50 static void
     51 wait_on_unlocked_mutex (void)
     52 {
     53   GMutex* mutex = g_mutex_new ();
     54   GCond* cond = g_cond_new ();
     55   g_cond_wait (cond, mutex);
     56 }
     57 
     58 static void
     59 wait_on_otherwise_locked_mutex (void)
     60 {
     61   GMutex* mutex = g_mutex_new ();
     62   GCond* cond = g_cond_new ();
     63   GThread* thread = g_thread_create (locking_thread, mutex, TRUE, NULL);
     64   g_assert (thread != NULL);
     65   g_usleep (G_USEC_PER_SEC);
     66   g_cond_wait (cond, mutex);
     67 }
     68 
     69 static void
     70 timed_wait_on_unlocked_mutex (void)
     71 {
     72   GMutex* mutex = g_mutex_new ();
     73   GCond* cond = g_cond_new ();
     74   g_cond_timed_wait (cond, mutex, NULL);
     75 }
     76 
     77 static void
     78 timed_wait_on_otherwise_locked_mutex (void)
     79 {
     80   GMutex* mutex = g_mutex_new ();
     81   GCond* cond = g_cond_new ();
     82   GThread* thread = g_thread_create (locking_thread, mutex, TRUE, NULL);
     83   g_assert (thread != NULL);
     84   g_usleep (G_USEC_PER_SEC);
     85   g_cond_timed_wait (cond, mutex, NULL);
     86 }
     87 
     88 struct
     89 {
     90   char *name;
     91   void (*func)();
     92 } func_table[] =
     93 {
     94   {"lock_locked_mutex", lock_locked_mutex},
     95   {"trylock_locked_mutex", trylock_locked_mutex},
     96   {"unlock_unlocked_mutex", unlock_unlocked_mutex},
     97   {"free_locked_mutex", free_locked_mutex},
     98   {"wait_on_unlocked_mutex", wait_on_unlocked_mutex},
     99   {"wait_on_otherwise_locked_mutex", wait_on_otherwise_locked_mutex},
    100   {"timed_wait_on_unlocked_mutex", timed_wait_on_unlocked_mutex},
    101   {"timed_wait_on_otherwise_locked_mutex",
    102    timed_wait_on_otherwise_locked_mutex}
    103 };
    104 
    105 int
    106 main (int argc, char* argv[])
    107 {
    108   int i;
    109 
    110   if (argc == 2)
    111     {
    112       for (i = 0; i < G_N_ELEMENTS (func_table); i++)
    113         {
    114           if (strcmp (func_table[i].name, argv[1]) == 0)
    115             {
    116               g_thread_init (NULL);
    117               func_table[i].func ();
    118               g_assert_not_reached ();
    119             }
    120         }
    121     }
    122 
    123   fprintf (stderr, "Usage: errorcheck-mutex-test [TEST]\n\n");
    124   fprintf (stderr, "   where TEST can be one of:\n\n");
    125   for (i = 0; i < G_N_ELEMENTS (func_table); i++)
    126     {
    127       fprintf (stderr, "      %s\n", func_table[i].name);
    128     }
    129 
    130   return 0;
    131 }
    132