sl@0: #undef G_DISABLE_ASSERT sl@0: #undef G_LOG_DOMAIN sl@0: sl@0: #include sl@0: #include sl@0: sl@0: #ifdef SYMBIAN sl@0: #include sl@0: #include "mrt2_glib2_test.h" sl@0: #endif /*SYMBIAN*/ sl@0: sl@0: #define THREADS 10 sl@0: sl@0: /* GStaticRecMutex */ sl@0: sl@0: GStaticRecMutex test_g_static_rec_mutex_mutex; sl@0: static guint test_g_static_rec_mutex_int = 0; sl@0: static gboolean test_g_static_rec_mutex_thread_ready; sl@0: sl@0: static gpointer sl@0: test_g_static_rec_mutex_thread (gpointer data) sl@0: { sl@0: g_assert (GPOINTER_TO_INT (data) == 42); sl@0: g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex) sl@0: == FALSE); sl@0: test_g_static_rec_mutex_thread_ready = TRUE; sl@0: sl@0: //Testing g_static_rec_mutex_lock_full sl@0: g_static_rec_mutex_lock_full (&test_g_static_rec_mutex_mutex, 10); sl@0: sl@0: g_assert (test_g_static_rec_mutex_int == 42); sl@0: test_g_static_rec_mutex_thread_ready = FALSE; sl@0: sl@0: //Testing g_static_rec_mutex_unlock_full for lock_full sl@0: g_static_rec_mutex_unlock_full (&test_g_static_rec_mutex_mutex); sl@0: sl@0: g_thread_exit (GINT_TO_POINTER (43)); sl@0: sl@0: g_assert_not_reached (); sl@0: return NULL; sl@0: } sl@0: sl@0: static void sl@0: test_g_static_rec_mutex (void) sl@0: { sl@0: GThread *thread; sl@0: sl@0: //Test for g_static_rec_mutex_init sl@0: g_static_rec_mutex_init(&test_g_static_rec_mutex_mutex); sl@0: sl@0: g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex)); sl@0: test_g_static_rec_mutex_thread_ready = FALSE; sl@0: thread = g_thread_create (test_g_static_rec_mutex_thread, sl@0: GINT_TO_POINTER (42), TRUE, NULL); sl@0: /* This busy wait is only for testing purposes and not an example of sl@0: * good code!*/ sl@0: while (!test_g_static_rec_mutex_thread_ready) sl@0: g_usleep (G_USEC_PER_SEC / 5); sl@0: sl@0: g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex)); sl@0: test_g_static_rec_mutex_int = 41; sl@0: g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex); sl@0: test_g_static_rec_mutex_int = 42; sl@0: g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex); sl@0: sl@0: /* This busy wait is only for testing purposes and not an example of sl@0: * good code!*/ sl@0: while (test_g_static_rec_mutex_thread_ready) sl@0: g_usleep (G_USEC_PER_SEC / 5); sl@0: sl@0: g_static_rec_mutex_lock (&test_g_static_rec_mutex_mutex); sl@0: test_g_static_rec_mutex_int = 0; sl@0: sl@0: //Testing g_static_rec_mutex_unlock_full with normal single lock sl@0: g_static_rec_mutex_unlock_full (&test_g_static_rec_mutex_mutex); sl@0: sl@0: g_assert (GPOINTER_TO_INT (g_thread_join (thread)) == 43); sl@0: g_static_rec_mutex_free (&test_g_static_rec_mutex_mutex); sl@0: } sl@0: sl@0: sl@0: /* GStaticRWLock */ sl@0: sl@0: /* -1 = writing; >0 = # of readers */ sl@0: static gint test_g_static_rw_lock_state = 0; sl@0: G_LOCK_DEFINE (test_g_static_rw_lock_state); sl@0: sl@0: static gboolean test_g_static_rw_lock_run = TRUE; sl@0: GStaticRWLock test_g_static_rw_lock_lock;// = G_STATIC_RW_LOCK_INIT; sl@0: sl@0: static gpointer sl@0: test_g_static_rw_lock_thread (gpointer data) sl@0: { sl@0: while (test_g_static_rw_lock_run) sl@0: { sl@0: if (g_random_double() > .2) /* I'm a reader */ sl@0: { sl@0: sl@0: if (g_random_double() > .2) /* I'll block */ sl@0: g_static_rw_lock_reader_lock (&test_g_static_rw_lock_lock); sl@0: else /* I'll only try */ sl@0: if (!g_static_rw_lock_reader_trylock (&test_g_static_rw_lock_lock)) sl@0: continue; sl@0: G_LOCK (test_g_static_rw_lock_state); sl@0: g_assert (test_g_static_rw_lock_state >= 0); sl@0: test_g_static_rw_lock_state++; sl@0: G_UNLOCK (test_g_static_rw_lock_state); sl@0: sl@0: g_usleep (g_random_int_range (20,1000)); sl@0: sl@0: G_LOCK (test_g_static_rw_lock_state); sl@0: test_g_static_rw_lock_state--; sl@0: G_UNLOCK (test_g_static_rw_lock_state); sl@0: sl@0: g_static_rw_lock_reader_unlock (&test_g_static_rw_lock_lock); sl@0: } sl@0: else /* I'm a writer */ sl@0: { sl@0: sl@0: if (g_random_double() > .2) /* I'll block */ sl@0: g_static_rw_lock_writer_lock (&test_g_static_rw_lock_lock); sl@0: else /* I'll only try */ sl@0: if (!g_static_rw_lock_writer_trylock (&test_g_static_rw_lock_lock)) sl@0: continue; sl@0: G_LOCK (test_g_static_rw_lock_state); sl@0: g_assert (test_g_static_rw_lock_state == 0); sl@0: test_g_static_rw_lock_state = -1; sl@0: G_UNLOCK (test_g_static_rw_lock_state); sl@0: sl@0: g_usleep (g_random_int_range (20,1000)); sl@0: sl@0: G_LOCK (test_g_static_rw_lock_state); sl@0: test_g_static_rw_lock_state = 0; sl@0: G_UNLOCK (test_g_static_rw_lock_state); sl@0: sl@0: g_static_rw_lock_writer_unlock (&test_g_static_rw_lock_lock); sl@0: } sl@0: } sl@0: return NULL; sl@0: } sl@0: sl@0: static void sl@0: test_g_static_rw_lock () sl@0: { sl@0: GThread *threads[THREADS]; sl@0: guint i; sl@0: sl@0: g_static_rw_lock_init(&test_g_static_rw_lock_lock); sl@0: sl@0: for (i = 0; i < THREADS; i++) sl@0: { sl@0: threads[i] = g_thread_create (test_g_static_rw_lock_thread, sl@0: NULL, TRUE, NULL); sl@0: } sl@0: g_usleep (G_USEC_PER_SEC * 5); sl@0: test_g_static_rw_lock_run = FALSE; sl@0: for (i = 0; i < THREADS; i++) sl@0: { sl@0: g_thread_join (threads[i]); sl@0: } sl@0: g_assert (test_g_static_rw_lock_state == 0); sl@0: g_static_rw_lock_free(&test_g_static_rw_lock_lock); sl@0: } sl@0: sl@0: void test_g_thread_error_quark() sl@0: { sl@0: GQuark c = g_thread_error_quark(); sl@0: g_assert(c == 1); sl@0: } sl@0: sl@0: sl@0: static void test_g_thread_set_priority (void) sl@0: { sl@0: GThread *thread; sl@0: thread = g_thread_self(); sl@0: g_thread_set_priority (thread, G_THREAD_PRIORITY_HIGH); sl@0: g_assert((thread->priority) == G_THREAD_PRIORITY_HIGH); sl@0: } sl@0: sl@0: sl@0: /* run all the tests */ sl@0: void sl@0: run_all_thread_tests() sl@0: { sl@0: test_g_static_rec_mutex (); sl@0: test_g_static_rw_lock (); sl@0: test_g_thread_error_quark(); sl@0: test_g_thread_set_priority(); sl@0: } sl@0: sl@0: int sl@0: main (int argc, sl@0: char *argv[]) sl@0: { sl@0: #ifdef SYMBIAN sl@0: sl@0: 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: g_set_print_handler(mrtPrintHandler); sl@0: #endif /*SYMBIAN*/ sl@0: sl@0: sl@0: /* Only run the test, if threads are enabled and a default thread sl@0: implementation is available */ sl@0: #if defined(G_THREADS_ENABLED) && ! defined(G_THREADS_IMPL_NONE) sl@0: g_thread_init (NULL); sl@0: run_all_thread_tests (); sl@0: sl@0: /* Now we rerun all tests, but this time we fool the system into sl@0: * thinking, that the available thread system is not native, but sl@0: * userprovided. */ sl@0: sl@0: g_thread_use_default_impl = FALSE; sl@0: run_all_thread_tests (); sl@0: sl@0: #endif sl@0: sl@0: #ifdef SYMBIAN sl@0: testResultXml("tthread"); sl@0: #endif /* EMULATOR */ sl@0: return 0; sl@0: }