X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=src%2Frculfhash.c;h=fed33e4574806969a768b01a777bc3c91a9eee03;hp=0bd138486d8d74a21edc46f8b9c74e0873b1a925;hb=5ffcaeef59b55dbb6d3a0d952f87d8a7387edca3;hpb=d0ec0ed2fcb5d67a28587dcb778606e64f5b7b83 diff --git a/src/rculfhash.c b/src/rculfhash.c index 0bd1384..fed33e4 100644 --- a/src/rculfhash.c +++ b/src/rculfhash.c @@ -585,6 +585,37 @@ static void cds_lfht_resize_lazy_count(struct cds_lfht *ht, unsigned long size, unsigned long count); +static void mutex_lock(pthread_mutex_t *mutex) +{ + int ret; + +#ifndef DISTRUST_SIGNALS_EXTREME + ret = pthread_mutex_lock(mutex); + if (ret) + urcu_die(ret); +#else /* #ifndef DISTRUST_SIGNALS_EXTREME */ + while ((ret = pthread_mutex_trylock(mutex)) != 0) { + if (ret != EBUSY && ret != EINTR) + urcu_die(ret); + if (CMM_LOAD_SHARED(URCU_TLS(rcu_reader).need_mb)) { + cmm_smp_mb(); + _CMM_STORE_SHARED(URCU_TLS(rcu_reader).need_mb, 0); + cmm_smp_mb(); + } + (void) poll(NULL, 0, 10); + } +#endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */ +} + +static void mutex_unlock(pthread_mutex_t *mutex) +{ + int ret; + + ret = pthread_mutex_unlock(mutex); + if (ret) + urcu_die(ret); +} + static long nr_cpus_mask = -1; static long split_count_mask = -1; static int split_count_order = -1; @@ -1947,9 +1978,9 @@ void cds_lfht_resize(struct cds_lfht *ht, unsigned long new_size) { resize_target_update_count(ht, new_size); CMM_STORE_SHARED(ht->resize_initiated, 1); - pthread_mutex_lock(&ht->resize_mutex); + mutex_lock(&ht->resize_mutex); _do_cds_lfht_resize(ht); - pthread_mutex_unlock(&ht->resize_mutex); + mutex_unlock(&ht->resize_mutex); } static @@ -1960,9 +1991,9 @@ void do_resize_cb(struct urcu_work *work) struct cds_lfht *ht = resize_work->ht; ht->flavor->register_thread(); - pthread_mutex_lock(&ht->resize_mutex); + mutex_lock(&ht->resize_mutex); _do_cds_lfht_resize(ht); - pthread_mutex_unlock(&ht->resize_mutex); + mutex_unlock(&ht->resize_mutex); ht->flavor->unregister_thread(); poison_free(work); } @@ -2037,37 +2068,6 @@ void cds_lfht_resize_lazy_count(struct cds_lfht *ht, unsigned long size, __cds_lfht_resize_lazy_launch(ht); } -static void mutex_lock(pthread_mutex_t *mutex) -{ - int ret; - -#ifndef DISTRUST_SIGNALS_EXTREME - ret = pthread_mutex_lock(mutex); - if (ret) - urcu_die(ret); -#else /* #ifndef DISTRUST_SIGNALS_EXTREME */ - while ((ret = pthread_mutex_trylock(mutex)) != 0) { - if (ret != EBUSY && ret != EINTR) - urcu_die(ret); - if (CMM_LOAD_SHARED(URCU_TLS(rcu_reader).need_mb)) { - cmm_smp_mb(); - _CMM_STORE_SHARED(URCU_TLS(rcu_reader).need_mb, 0); - cmm_smp_mb(); - } - (void) poll(NULL, 0, 10); - } -#endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */ -} - -static void mutex_unlock(pthread_mutex_t *mutex) -{ - int ret; - - ret = pthread_mutex_unlock(mutex); - if (ret) - urcu_die(ret); -} - static void cds_lfht_before_fork(void *priv) { if (cds_lfht_workqueue_atfork_nesting++)