projects
/
userspace-rcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Version 0.7.11
[userspace-rcu.git]
/
urcu-qsbr.c
diff --git
a/urcu-qsbr.c
b/urcu-qsbr.c
index b20d564c5f6799f3ac42d5e53fe4fc331a322cf7..76aaabb4eac85fbb11aefc487bab627aa241a384 100644
(file)
--- a/
urcu-qsbr.c
+++ b/
urcu-qsbr.c
@@
-42,6
+42,8
@@
#include "urcu-pointer.h"
#include "urcu/tls-compat.h"
#include "urcu-pointer.h"
#include "urcu/tls-compat.h"
+#include "urcu-die.h"
+
/* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
#undef _LGPL_SOURCE
#include "urcu-qsbr.h"
/* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
#undef _LGPL_SOURCE
#include "urcu-qsbr.h"
@@
-67,11
+69,11
@@
unsigned long rcu_gp_ctr = RCU_GP_ONLINE;
* Written to only by each individual reader. Read by both the reader and the
* writers.
*/
* Written to only by each individual reader. Read by both the reader and the
* writers.
*/
-
DEFINE_URCU_TLS
(struct rcu_reader, rcu_reader);
+
__DEFINE_URCU_TLS_GLOBAL
(struct rcu_reader, rcu_reader);
#ifdef DEBUG_YIELD
unsigned int yield_active;
#ifdef DEBUG_YIELD
unsigned int yield_active;
-
DEFINE_URCU_TLS
(unsigned int, rand_yield);
+
__DEFINE_URCU_TLS_GLOBAL
(unsigned int, rand_yield);
#endif
static CDS_LIST_HEAD(registry);
#endif
static CDS_LIST_HEAD(registry);
@@
-82,17
+84,12
@@
static void mutex_lock(pthread_mutex_t *mutex)
#ifndef DISTRUST_SIGNALS_EXTREME
ret = pthread_mutex_lock(mutex);
#ifndef DISTRUST_SIGNALS_EXTREME
ret = pthread_mutex_lock(mutex);
- if (ret) {
- perror("Error in pthread mutex lock");
- exit(-1);
- }
+ if (ret)
+ urcu_die(ret);
#else /* #ifndef DISTRUST_SIGNALS_EXTREME */
while ((ret = pthread_mutex_trylock(mutex)) != 0) {
#else /* #ifndef DISTRUST_SIGNALS_EXTREME */
while ((ret = pthread_mutex_trylock(mutex)) != 0) {
- if (ret != EBUSY && ret != EINTR) {
- printf("ret = %d, errno = %d\n", ret, errno);
- perror("Error in pthread mutex lock");
- exit(-1);
- }
+ if (ret != EBUSY && ret != EINTR)
+ urcu_die(ret);
poll(NULL,0,10);
}
#endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */
poll(NULL,0,10);
}
#endif /* #else #ifndef DISTRUST_SIGNALS_EXTREME */
@@
-103,10
+100,8
@@
static void mutex_unlock(pthread_mutex_t *mutex)
int ret;
ret = pthread_mutex_unlock(mutex);
int ret;
ret = pthread_mutex_unlock(mutex);
- if (ret) {
- perror("Error in pthread mutex unlock");
- exit(-1);
- }
+ if (ret)
+ urcu_die(ret);
}
/*
}
/*
@@
-124,7
+119,7
@@
static void wait_gp(void)
static void update_counter_and_wait(void)
{
CDS_LIST_HEAD(qsreaders);
static void update_counter_and_wait(void)
{
CDS_LIST_HEAD(qsreaders);
- int wait_loops = 0;
+
unsigned
int wait_loops = 0;
struct rcu_reader *index, *tmp;
#if (CAA_BITS_PER_LONG < 64)
struct rcu_reader *index, *tmp;
#if (CAA_BITS_PER_LONG < 64)
@@
-155,7
+150,6
@@
static void update_counter_and_wait(void)
* Wait for each thread rcu_reader_qs_gp count to become 0.
*/
for (;;) {
* Wait for each thread rcu_reader_qs_gp count to become 0.
*/
for (;;) {
- wait_loops++;
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
uatomic_set(&gp_futex, -1);
/*
if (wait_loops >= RCU_QS_ACTIVE_ATTEMPTS) {
uatomic_set(&gp_futex, -1);
/*
@@
-168,6
+162,8
@@
static void update_counter_and_wait(void)
}
/* Write futex before read reader_gp */
cmm_smp_mb();
}
/* Write futex before read reader_gp */
cmm_smp_mb();
+ } else {
+ wait_loops++;
}
cds_list_for_each_entry_safe(index, tmp, ®istry, node) {
if (!rcu_gp_ongoing(&index->ctr))
}
cds_list_for_each_entry_safe(index, tmp, ®istry, node) {
if (!rcu_gp_ongoing(&index->ctr))
This page took
0.024335 seconds
and
4
git commands to generate.