projects
/
userspace-rcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
doc/examples: cds_lfht_add/cds_lfht_del
[userspace-rcu.git]
/
urcu-defer-impl.h
diff --git
a/urcu-defer-impl.h
b/urcu-defer-impl.h
index 34d99c92997641323175c909f13f793fa27df33d..c762400574cdea19947f0fd265d8c2a4fbb81f6e 100644
(file)
--- a/
urcu-defer-impl.h
+++ b/
urcu-defer-impl.h
@@
-48,6
+48,8
@@
#include <urcu/uatomic.h>
#include <urcu/list.h>
#include <urcu/system.h>
#include <urcu/uatomic.h>
#include <urcu/list.h>
#include <urcu/system.h>
+#include <urcu/tls-compat.h>
+#include "urcu-die.h"
/*
* Number of entries in the per-thread defer queue. Must be power of 2.
/*
* Number of entries in the per-thread defer queue. Must be power of 2.
@@
-130,7
+132,7
@@
static int32_t defer_thread_stop;
* Written to only by each individual deferer. Read by both the deferer and
* the reclamation tread.
*/
* Written to only by each individual deferer. Read by both the deferer and
* the reclamation tread.
*/
-static
struct defer_queue __thread defer_queue
;
+static
DEFINE_URCU_TLS(struct defer_queue, defer_queue)
;
static CDS_LIST_HEAD(registry_defer);
static pthread_t tid_defer;
static CDS_LIST_HEAD(registry_defer);
static pthread_t tid_defer;
@@
-140,17
+142,12
@@
static void mutex_lock_defer(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 */
@@
-161,7
+158,7
@@
static void mutex_lock_defer(pthread_mutex_t *mutex)
*/
static void wake_up_defer(void)
{
*/
static void wake_up_defer(void)
{
- if (unlikely(uatomic_read(&defer_thread_futex) == -1)) {
+ if (
caa_
unlikely(uatomic_read(&defer_thread_futex) == -1)) {
uatomic_set(&defer_thread_futex, 0);
futex_noasync(&defer_thread_futex, FUTEX_WAKE, 1,
NULL, NULL, 0);
uatomic_set(&defer_thread_futex, 0);
futex_noasync(&defer_thread_futex, FUTEX_WAKE, 1,
NULL, NULL, 0);
@@
-225,11
+222,11
@@
static void rcu_defer_barrier_queue(struct defer_queue *queue,
for (i = queue->tail; i != head;) {
cmm_smp_rmb(); /* read head before q[]. */
p = CMM_LOAD_SHARED(queue->q[i++ & DEFER_QUEUE_MASK]);
for (i = queue->tail; i != head;) {
cmm_smp_rmb(); /* read head before q[]. */
p = CMM_LOAD_SHARED(queue->q[i++ & DEFER_QUEUE_MASK]);
- if (unlikely(DQ_IS_FCT_BIT(p))) {
+ if (
caa_
unlikely(DQ_IS_FCT_BIT(p))) {
DQ_CLEAR_FCT_BIT(p);
queue->last_fct_out = p;
p = CMM_LOAD_SHARED(queue->q[i++ & DEFER_QUEUE_MASK]);
DQ_CLEAR_FCT_BIT(p);
queue->last_fct_out = p;
p = CMM_LOAD_SHARED(queue->q[i++ & DEFER_QUEUE_MASK]);
- } else if (unlikely(p == DQ_FCT_MARK)) {
+ } else if (
caa_
unlikely(p == DQ_FCT_MARK)) {
p = CMM_LOAD_SHARED(queue->q[i++ & DEFER_QUEUE_MASK]);
queue->last_fct_out = p;
p = CMM_LOAD_SHARED(queue->q[i++ & DEFER_QUEUE_MASK]);
p = CMM_LOAD_SHARED(queue->q[i++ & DEFER_QUEUE_MASK]);
queue->last_fct_out = p;
p = CMM_LOAD_SHARED(queue->q[i++ & DEFER_QUEUE_MASK]);
@@
-245,12
+242,12
@@
static void _rcu_defer_barrier_thread(void)
{
unsigned long head, num_items;
{
unsigned long head, num_items;
- head =
defer_queue
.head;
- num_items = head -
defer_queue
.tail;
- if (unlikely(!num_items))
+ head =
URCU_TLS(defer_queue)
.head;
+ num_items = head -
URCU_TLS(defer_queue)
.tail;
+ if (
caa_
unlikely(!num_items))
return;
synchronize_rcu();
return;
synchronize_rcu();
- rcu_defer_barrier_queue(&
defer_queue
, head);
+ rcu_defer_barrier_queue(&
URCU_TLS(defer_queue)
, head);
}
void rcu_defer_barrier_thread(void)
}
void rcu_defer_barrier_thread(void)
@@
-286,7
+283,7
@@
void rcu_defer_barrier(void)
index->last_head = CMM_LOAD_SHARED(index->head);
num_items += index->last_head - index->tail;
}
index->last_head = CMM_LOAD_SHARED(index->head);
num_items += index->last_head - index->tail;
}
- if (likely(!num_items)) {
+ if (
caa_
likely(!num_items)) {
/*
* We skip the grace period because there are no queued
* callbacks to execute.
/*
* We skip the grace period because there are no queued
* callbacks to execute.
@@
-303,7
+300,7
@@
end:
/*
* _defer_rcu - Queue a RCU callback.
*/
/*
* _defer_rcu - Queue a RCU callback.
*/
-void _defer_rcu(void (*fct)(void *p), void *p)
+
static
void _defer_rcu(void (*fct)(void *p), void *p)
{
unsigned long head, tail;
{
unsigned long head, tail;
@@
-311,17
+308,17
@@
void _defer_rcu(void (*fct)(void *p), void *p)
* Head is only modified by ourself. Tail can be modified by reclamation
* thread.
*/
* Head is only modified by ourself. Tail can be modified by reclamation
* thread.
*/
- head =
defer_queue
.head;
- tail = CMM_LOAD_SHARED(
defer_queue
.tail);
+ head =
URCU_TLS(defer_queue)
.head;
+ tail = CMM_LOAD_SHARED(
URCU_TLS(defer_queue)
.tail);
/*
* If queue is full, or reached threshold. Empty queue ourself.
* Worse-case: must allow 2 supplementary entries for fct pointer.
*/
/*
* If queue is full, or reached threshold. Empty queue ourself.
* Worse-case: must allow 2 supplementary entries for fct pointer.
*/
- if (unlikely(head - tail >= DEFER_QUEUE_SIZE - 2)) {
+ if (
caa_
unlikely(head - tail >= DEFER_QUEUE_SIZE - 2)) {
assert(head - tail <= DEFER_QUEUE_SIZE);
rcu_defer_barrier_thread();
assert(head - tail <= DEFER_QUEUE_SIZE);
rcu_defer_barrier_thread();
- assert(head - CMM_LOAD_SHARED(
defer_queue
.tail) == 0);
+ assert(head - CMM_LOAD_SHARED(
URCU_TLS(defer_queue)
.tail) == 0);
}
/*
}
/*
@@
-340,25
+337,25
@@
void _defer_rcu(void (*fct)(void *p), void *p)
* Decode: see the comments before 'struct defer_queue'
* or the code in rcu_defer_barrier_queue().
*/
* Decode: see the comments before 'struct defer_queue'
* or the code in rcu_defer_barrier_queue().
*/
- if (
unlikely(defer_queue
.last_fct_in != fct
+ if (
caa_unlikely(URCU_TLS(defer_queue)
.last_fct_in != fct
|| DQ_IS_FCT_BIT(p)
|| p == DQ_FCT_MARK)) {
|| DQ_IS_FCT_BIT(p)
|| p == DQ_FCT_MARK)) {
-
defer_queue
.last_fct_in = fct;
- if (unlikely(DQ_IS_FCT_BIT(fct) || fct == DQ_FCT_MARK)) {
- _CMM_STORE_SHARED(
defer_queue
.q[head++ & DEFER_QUEUE_MASK],
+
URCU_TLS(defer_queue)
.last_fct_in = fct;
+ if (
caa_
unlikely(DQ_IS_FCT_BIT(fct) || fct == DQ_FCT_MARK)) {
+ _CMM_STORE_SHARED(
URCU_TLS(defer_queue)
.q[head++ & DEFER_QUEUE_MASK],
DQ_FCT_MARK);
DQ_FCT_MARK);
- _CMM_STORE_SHARED(
defer_queue
.q[head++ & DEFER_QUEUE_MASK],
+ _CMM_STORE_SHARED(
URCU_TLS(defer_queue)
.q[head++ & DEFER_QUEUE_MASK],
fct);
} else {
DQ_SET_FCT_BIT(fct);
fct);
} else {
DQ_SET_FCT_BIT(fct);
- _CMM_STORE_SHARED(
defer_queue
.q[head++ & DEFER_QUEUE_MASK],
+ _CMM_STORE_SHARED(
URCU_TLS(defer_queue)
.q[head++ & DEFER_QUEUE_MASK],
fct);
}
}
fct);
}
}
- _CMM_STORE_SHARED(
defer_queue
.q[head++ & DEFER_QUEUE_MASK], p);
+ _CMM_STORE_SHARED(
URCU_TLS(defer_queue)
.q[head++ & DEFER_QUEUE_MASK], p);
cmm_smp_wmb(); /* Publish new pointer before head */
/* Write q[] before head. */
cmm_smp_wmb(); /* Publish new pointer before head */
/* Write q[] before head. */
- CMM_STORE_SHARED(
defer_queue
.head, head);
+ CMM_STORE_SHARED(
URCU_TLS(defer_queue)
.head, head);
cmm_smp_mb(); /* Write queue head before read futex */
/*
* Wake-up any waiting defer thread.
cmm_smp_mb(); /* Write queue head before read futex */
/*
* Wake-up any waiting defer thread.
@@
-366,7
+363,7
@@
void _defer_rcu(void (*fct)(void *p), void *p)
wake_up_defer();
}
wake_up_defer();
}
-void *thr_defer(void *args)
+
static
void *thr_defer(void *args)
{
for (;;) {
/*
{
for (;;) {
/*
@@
-422,16
+419,16
@@
int rcu_defer_register_thread(void)
{
int was_empty;
{
int was_empty;
- assert(
defer_queue
.last_head == 0);
- assert(
defer_queue
.q == NULL);
-
defer_queue
.q = malloc(sizeof(void *) * DEFER_QUEUE_SIZE);
- if (!
defer_queue
.q)
+ assert(
URCU_TLS(defer_queue)
.last_head == 0);
+ assert(
URCU_TLS(defer_queue)
.q == NULL);
+
URCU_TLS(defer_queue)
.q = malloc(sizeof(void *) * DEFER_QUEUE_SIZE);
+ if (!
URCU_TLS(defer_queue)
.q)
return -ENOMEM;
mutex_lock_defer(&defer_thread_mutex);
mutex_lock_defer(&rcu_defer_mutex);
was_empty = cds_list_empty(®istry_defer);
return -ENOMEM;
mutex_lock_defer(&defer_thread_mutex);
mutex_lock_defer(&rcu_defer_mutex);
was_empty = cds_list_empty(®istry_defer);
- cds_list_add(&
defer_queue
.list, ®istry_defer);
+ cds_list_add(&
URCU_TLS(defer_queue)
.list, ®istry_defer);
mutex_unlock(&rcu_defer_mutex);
if (was_empty)
mutex_unlock(&rcu_defer_mutex);
if (was_empty)
@@
-446,10
+443,10
@@
void rcu_defer_unregister_thread(void)
mutex_lock_defer(&defer_thread_mutex);
mutex_lock_defer(&rcu_defer_mutex);
mutex_lock_defer(&defer_thread_mutex);
mutex_lock_defer(&rcu_defer_mutex);
- cds_list_del(&
defer_queue
.list);
+ cds_list_del(&
URCU_TLS(defer_queue)
.list);
_rcu_defer_barrier_thread();
_rcu_defer_barrier_thread();
- free(
defer_queue
.q);
-
defer_queue
.q = NULL;
+ free(
URCU_TLS(defer_queue)
.q);
+
URCU_TLS(defer_queue)
.q = NULL;
is_empty = cds_list_empty(®istry_defer);
mutex_unlock(&rcu_defer_mutex);
is_empty = cds_list_empty(®istry_defer);
mutex_unlock(&rcu_defer_mutex);
This page took
0.027485 seconds
and
4
git commands to generate.