static int single_writer_single_reader (void) { mono_mutex_t mutex; MonoConcurrentHashTable *h; int res = 0; mono_os_mutex_init (&mutex); h = mono_conc_hashtable_new (NULL, NULL); mono_os_mutex_lock (&mutex); mono_conc_hashtable_insert (h, GUINT_TO_POINTER (10), GUINT_TO_POINTER (20)); mono_os_mutex_unlock (&mutex); mono_os_mutex_lock (&mutex); mono_conc_hashtable_insert (h, GUINT_TO_POINTER (30), GUINT_TO_POINTER (40)); mono_os_mutex_unlock (&mutex); mono_os_mutex_lock (&mutex); mono_conc_hashtable_insert (h, GUINT_TO_POINTER (50), GUINT_TO_POINTER (60)); mono_os_mutex_unlock (&mutex); mono_os_mutex_lock (&mutex); mono_conc_hashtable_insert (h, GUINT_TO_POINTER (2), GUINT_TO_POINTER (3)); mono_os_mutex_unlock (&mutex); if (mono_conc_hashtable_lookup (h, GUINT_TO_POINTER (30)) != GUINT_TO_POINTER (40)) res = 1; if (mono_conc_hashtable_lookup (h, GUINT_TO_POINTER (10)) != GUINT_TO_POINTER (20)) res = 2; if (mono_conc_hashtable_lookup (h, GUINT_TO_POINTER (2)) != GUINT_TO_POINTER (3)) res = 3; if (mono_conc_hashtable_lookup (h, GUINT_TO_POINTER (50)) != GUINT_TO_POINTER (60)) res = 4; mono_conc_hashtable_destroy (h); mono_os_mutex_destroy (&mutex); if (res) printf ("SERIAL TEST FAILED %d\n", res); return res; }
static int single_writer_parallel_reader (void) { pthread_t a,b,c; gpointer ra, rb, rc; int i, res = 0; ra = rb = rc = GINT_TO_POINTER (1); mono_os_mutex_init (&global_mutex); hash = mono_conc_hashtable_new (NULL, NULL); pthread_create (&a, NULL, pr_sw_thread, GINT_TO_POINTER (0)); pthread_create (&b, NULL, pr_sw_thread, GINT_TO_POINTER (1)); pthread_create (&c, NULL, pr_sw_thread, GINT_TO_POINTER (2)); for (i = 0; i < 100; ++i) { mono_os_mutex_lock (&global_mutex); mono_conc_hashtable_insert (hash, GINT_TO_POINTER (i + 0 + 1), GINT_TO_POINTER ((i + 0) * 2 + 1)); mono_os_mutex_unlock (&global_mutex); mono_os_mutex_lock (&global_mutex); mono_conc_hashtable_insert (hash, GINT_TO_POINTER (i + 100 + 1), GINT_TO_POINTER ((i + 100) * 2 + 1)); mono_os_mutex_unlock (&global_mutex); mono_os_mutex_lock (&global_mutex); mono_conc_hashtable_insert (hash, GINT_TO_POINTER (i + 200 + 1), GINT_TO_POINTER ((i + 200) * 2 + 1)); mono_os_mutex_unlock (&global_mutex); } pthread_join (a, &ra); pthread_join (b, &rb); pthread_join (c, &rc); res = GPOINTER_TO_INT (ra) + GPOINTER_TO_INT (rb) + GPOINTER_TO_INT (rc); mono_conc_hashtable_destroy (hash); mono_os_mutex_destroy (&global_mutex); if (res) printf ("SINGLE_WRITER_PAR_READER TEST FAILED %d\n", res); return res; }
static void* pw_sr_thread (void *arg) { int i, idx = 1000 * GPOINTER_TO_INT (arg); mono_thread_info_attach (); for (i = 0; i < 1000; ++i) { mono_os_mutex_lock (&global_mutex); mono_conc_hashtable_insert (hash, GINT_TO_POINTER (i + idx), GINT_TO_POINTER (i + 1)); mono_os_mutex_unlock (&global_mutex); } return NULL; }
static void* pw_pr_w_add_thread (void *arg) { int i, idx = 1000 * GPOINTER_TO_INT (arg); mono_thread_info_attach ((gpointer)&arg); for (i = idx; i < idx + 1000; i++) { mono_os_mutex_lock (&global_mutex); mono_conc_hashtable_insert (hash, GINT_TO_POINTER (i + 1), GINT_TO_POINTER (i + 1)); mono_os_mutex_unlock (&global_mutex); } return NULL; }
static void G_GNUC_UNUSED benchmark_conc (void) { MonoConcurrentHashTable *h; int i, j; h = mono_conc_hashtable_new (NULL, NULL); for (i = 1; i < 10 * 1000; ++i) { mono_conc_hashtable_insert (h, GUINT_TO_POINTER (i), GUINT_TO_POINTER (i)); } for (j = 0; j < 100000; ++j) for (i = 1; i < 10 * 105; ++i) mono_conc_hashtable_lookup (h, GUINT_TO_POINTER (i)); mono_conc_hashtable_destroy (h); }