os/ossrv/glib/tsrc/BC/src/tthread.c
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
#undef G_DISABLE_ASSERT
sl@0
     2
#undef G_LOG_DOMAIN
sl@0
     3
sl@0
     4
#include <glib.h>
sl@0
     5
#include <stdio.h>
sl@0
     6
sl@0
     7
#ifdef SYMBIAN
sl@0
     8
#include <glib_global.h>
sl@0
     9
#include "mrt2_glib2_test.h"
sl@0
    10
#endif /*SYMBIAN*/
sl@0
    11
sl@0
    12
#define THREADS 10
sl@0
    13
sl@0
    14
/* GStaticRecMutex */
sl@0
    15
sl@0
    16
GStaticRecMutex test_g_static_rec_mutex_mutex;
sl@0
    17
static guint test_g_static_rec_mutex_int = 0;
sl@0
    18
static gboolean test_g_static_rec_mutex_thread_ready;
sl@0
    19
sl@0
    20
static gpointer
sl@0
    21
test_g_static_rec_mutex_thread (gpointer data)
sl@0
    22
{
sl@0
    23
  g_assert (GPOINTER_TO_INT (data) == 42);
sl@0
    24
  g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex) 
sl@0
    25
	    == FALSE);
sl@0
    26
  test_g_static_rec_mutex_thread_ready = TRUE;
sl@0
    27
  
sl@0
    28
  //Testing g_static_rec_mutex_lock_full
sl@0
    29
  g_static_rec_mutex_lock_full (&test_g_static_rec_mutex_mutex, 10);
sl@0
    30
  
sl@0
    31
  g_assert (test_g_static_rec_mutex_int == 42);
sl@0
    32
  test_g_static_rec_mutex_thread_ready = FALSE;
sl@0
    33
  
sl@0
    34
  //Testing g_static_rec_mutex_unlock_full for lock_full
sl@0
    35
  g_static_rec_mutex_unlock_full (&test_g_static_rec_mutex_mutex);
sl@0
    36
  
sl@0
    37
  g_thread_exit (GINT_TO_POINTER (43));
sl@0
    38
  
sl@0
    39
  g_assert_not_reached ();
sl@0
    40
  return NULL;
sl@0
    41
}
sl@0
    42
sl@0
    43
static void
sl@0
    44
test_g_static_rec_mutex (void)
sl@0
    45
{
sl@0
    46
  GThread *thread;
sl@0
    47
sl@0
    48
  //Test for g_static_rec_mutex_init	
sl@0
    49
  g_static_rec_mutex_init(&test_g_static_rec_mutex_mutex);
sl@0
    50
sl@0
    51
  g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex));
sl@0
    52
  test_g_static_rec_mutex_thread_ready = FALSE;
sl@0
    53
  thread = g_thread_create (test_g_static_rec_mutex_thread, 
sl@0
    54
			    GINT_TO_POINTER (42), TRUE, NULL);
sl@0
    55
  /* This busy wait is only for testing purposes and not an example of
sl@0
    56
   * good code!*/
sl@0
    57
  while (!test_g_static_rec_mutex_thread_ready)
sl@0
    58
    g_usleep (G_USEC_PER_SEC / 5);
sl@0
    59
sl@0
    60
  g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex));
sl@0
    61
  test_g_static_rec_mutex_int = 41;
sl@0
    62
  g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex);
sl@0
    63
  test_g_static_rec_mutex_int = 42;  
sl@0
    64
  g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex);
sl@0
    65
sl@0
    66
  /* This busy wait is only for testing purposes and not an example of
sl@0
    67
   * good code!*/
sl@0
    68
  while (test_g_static_rec_mutex_thread_ready)
sl@0
    69
    g_usleep (G_USEC_PER_SEC / 5);
sl@0
    70
sl@0
    71
  g_static_rec_mutex_lock (&test_g_static_rec_mutex_mutex);
sl@0
    72
  test_g_static_rec_mutex_int = 0;  
sl@0
    73
  
sl@0
    74
  //Testing g_static_rec_mutex_unlock_full with normal single lock
sl@0
    75
  g_static_rec_mutex_unlock_full (&test_g_static_rec_mutex_mutex);
sl@0
    76
sl@0
    77
  g_assert (GPOINTER_TO_INT (g_thread_join (thread)) == 43);
sl@0
    78
  g_static_rec_mutex_free (&test_g_static_rec_mutex_mutex);
sl@0
    79
}
sl@0
    80
sl@0
    81
sl@0
    82
/* GStaticRWLock */
sl@0
    83
sl@0
    84
/* -1 = writing; >0 = # of readers */
sl@0
    85
static gint test_g_static_rw_lock_state = 0; 
sl@0
    86
G_LOCK_DEFINE (test_g_static_rw_lock_state);
sl@0
    87
sl@0
    88
static gboolean test_g_static_rw_lock_run = TRUE; 
sl@0
    89
GStaticRWLock test_g_static_rw_lock_lock;// = G_STATIC_RW_LOCK_INIT;
sl@0
    90
sl@0
    91
static gpointer
sl@0
    92
test_g_static_rw_lock_thread (gpointer data)
sl@0
    93
{
sl@0
    94
  while (test_g_static_rw_lock_run)
sl@0
    95
    {
sl@0
    96
      if (g_random_double() > .2) /* I'm a reader */
sl@0
    97
	{
sl@0
    98
	  
sl@0
    99
	  if (g_random_double() > .2) /* I'll block */
sl@0
   100
	    g_static_rw_lock_reader_lock (&test_g_static_rw_lock_lock);
sl@0
   101
	  else /* I'll only try */
sl@0
   102
	    if (!g_static_rw_lock_reader_trylock (&test_g_static_rw_lock_lock))
sl@0
   103
	      continue;
sl@0
   104
	  G_LOCK (test_g_static_rw_lock_state);
sl@0
   105
	  g_assert (test_g_static_rw_lock_state >= 0);
sl@0
   106
	  test_g_static_rw_lock_state++;
sl@0
   107
	  G_UNLOCK (test_g_static_rw_lock_state);
sl@0
   108
sl@0
   109
	  g_usleep (g_random_int_range (20,1000));
sl@0
   110
sl@0
   111
	  G_LOCK (test_g_static_rw_lock_state);
sl@0
   112
	  test_g_static_rw_lock_state--;
sl@0
   113
	  G_UNLOCK (test_g_static_rw_lock_state);
sl@0
   114
sl@0
   115
	  g_static_rw_lock_reader_unlock (&test_g_static_rw_lock_lock);
sl@0
   116
	}
sl@0
   117
      else /* I'm a writer */
sl@0
   118
	{
sl@0
   119
	  
sl@0
   120
	  if (g_random_double() > .2) /* I'll block */ 
sl@0
   121
	    g_static_rw_lock_writer_lock (&test_g_static_rw_lock_lock);
sl@0
   122
	  else /* I'll only try */
sl@0
   123
	    if (!g_static_rw_lock_writer_trylock (&test_g_static_rw_lock_lock))
sl@0
   124
	      continue;
sl@0
   125
	  G_LOCK (test_g_static_rw_lock_state);
sl@0
   126
	  g_assert (test_g_static_rw_lock_state == 0);
sl@0
   127
	  test_g_static_rw_lock_state = -1;
sl@0
   128
	  G_UNLOCK (test_g_static_rw_lock_state);
sl@0
   129
sl@0
   130
	  g_usleep (g_random_int_range (20,1000));
sl@0
   131
sl@0
   132
	  G_LOCK (test_g_static_rw_lock_state);
sl@0
   133
	  test_g_static_rw_lock_state = 0;
sl@0
   134
	  G_UNLOCK (test_g_static_rw_lock_state);
sl@0
   135
sl@0
   136
	  g_static_rw_lock_writer_unlock (&test_g_static_rw_lock_lock);
sl@0
   137
	}
sl@0
   138
    }
sl@0
   139
  return NULL;
sl@0
   140
}
sl@0
   141
sl@0
   142
static void
sl@0
   143
test_g_static_rw_lock ()
sl@0
   144
{
sl@0
   145
  GThread *threads[THREADS];
sl@0
   146
  guint i;
sl@0
   147
  
sl@0
   148
  g_static_rw_lock_init(&test_g_static_rw_lock_lock);
sl@0
   149
  
sl@0
   150
  for (i = 0; i < THREADS; i++)
sl@0
   151
    {
sl@0
   152
      threads[i] = g_thread_create (test_g_static_rw_lock_thread, 
sl@0
   153
				    NULL, TRUE, NULL);      
sl@0
   154
    }
sl@0
   155
  g_usleep (G_USEC_PER_SEC * 5);
sl@0
   156
  test_g_static_rw_lock_run = FALSE;
sl@0
   157
  for (i = 0; i < THREADS; i++)
sl@0
   158
    {
sl@0
   159
      g_thread_join (threads[i]);
sl@0
   160
    }
sl@0
   161
  g_assert (test_g_static_rw_lock_state == 0);
sl@0
   162
  g_static_rw_lock_free(&test_g_static_rw_lock_lock);
sl@0
   163
}
sl@0
   164
sl@0
   165
void test_g_thread_error_quark()
sl@0
   166
{
sl@0
   167
	GQuark c = g_thread_error_quark();
sl@0
   168
	g_assert(c == 1);
sl@0
   169
}
sl@0
   170
sl@0
   171
sl@0
   172
static void test_g_thread_set_priority (void)
sl@0
   173
{
sl@0
   174
  GThread *thread;
sl@0
   175
  thread = g_thread_self();
sl@0
   176
  g_thread_set_priority (thread, G_THREAD_PRIORITY_HIGH);
sl@0
   177
  g_assert((thread->priority) == G_THREAD_PRIORITY_HIGH);
sl@0
   178
}
sl@0
   179
sl@0
   180
sl@0
   181
/* run all the tests */
sl@0
   182
void
sl@0
   183
run_all_thread_tests()
sl@0
   184
{
sl@0
   185
  test_g_static_rec_mutex ();
sl@0
   186
  test_g_static_rw_lock ();
sl@0
   187
  test_g_thread_error_quark();
sl@0
   188
  test_g_thread_set_priority();
sl@0
   189
}
sl@0
   190
sl@0
   191
int 
sl@0
   192
main (int   argc,
sl@0
   193
      char *argv[])
sl@0
   194
{
sl@0
   195
  #ifdef SYMBIAN
sl@0
   196
  
sl@0
   197
  g_log_set_handler (NULL,  G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL);
sl@0
   198
  g_set_print_handler(mrtPrintHandler);
sl@0
   199
  #endif /*SYMBIAN*/
sl@0
   200
	  
sl@0
   201
sl@0
   202
  /* Only run the test, if threads are enabled and a default thread
sl@0
   203
     implementation is available */
sl@0
   204
#if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE)
sl@0
   205
  g_thread_init (NULL);
sl@0
   206
  run_all_thread_tests ();
sl@0
   207
sl@0
   208
  /* Now we rerun all tests, but this time we fool the system into
sl@0
   209
   * thinking, that the available thread system is not native, but
sl@0
   210
   * userprovided. */
sl@0
   211
sl@0
   212
  g_thread_use_default_impl = FALSE;
sl@0
   213
  run_all_thread_tests ();
sl@0
   214
  
sl@0
   215
#endif
sl@0
   216
sl@0
   217
#ifdef SYMBIAN
sl@0
   218
  testResultXml("tthread");
sl@0
   219
#endif /* EMULATOR */
sl@0
   220
  return 0;
sl@0
   221
}