projects
/
userspace-rcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add call_rcu() interface
[userspace-rcu.git]
/
urcu
/
wfqueue-static.h
diff --git
a/urcu/wfqueue-static.h
b/urcu/wfqueue-static.h
index 0f7e68f7a40fea14b208708ae9bd7425b79d35b2..790931bef25db04d2156fe0cd39dd260b31a0474 100644
(file)
--- a/
urcu/wfqueue-static.h
+++ b/
urcu/wfqueue-static.h
@@
-28,6
+28,7
@@
#include <pthread.h>
#include <assert.h>
#include <pthread.h>
#include <assert.h>
+#include <poll.h>
#include <urcu/compiler.h>
#include <urcu/uatomic_arch.h>
#include <urcu/compiler.h>
#include <urcu/uatomic_arch.h>
@@
-47,16
+48,16
@@
extern "C" {
#define WFQ_ADAPT_ATTEMPTS 10 /* Retry if being set */
#define WFQ_WAIT 10 /* Wait 10 ms if being set */
#define WFQ_ADAPT_ATTEMPTS 10 /* Retry if being set */
#define WFQ_WAIT 10 /* Wait 10 ms if being set */
-
void _wfq_node_init(struct
wfq_node *node)
+
static inline void _cds_wfq_node_init(struct cds_
wfq_node *node)
{
node->next = NULL;
}
{
node->next = NULL;
}
-
void _wfq_init(struct
wfq_queue *q)
+
static inline void _cds_wfq_init(struct cds_
wfq_queue *q)
{
int ret;
{
int ret;
- _wfq_node_init(&q->dummy);
+ _
cds_
wfq_node_init(&q->dummy);
/* Set queue head and tail */
q->head = &q->dummy;
q->tail = &q->dummy.next;
/* Set queue head and tail */
q->head = &q->dummy;
q->tail = &q->dummy.next;
@@
-64,9
+65,10
@@
void _wfq_init(struct wfq_queue *q)
assert(!ret);
}
assert(!ret);
}
-void _wfq_enqueue(struct wfq_queue *q, struct wfq_node *node)
+static inline void _cds_wfq_enqueue(struct cds_wfq_queue *q,
+ struct cds_wfq_node *node)
{
{
- struct wfq_node **old_tail;
+ struct
cds_
wfq_node **old_tail;
/*
* uatomic_xchg() implicit memory barrier orders earlier stores to data
/*
* uatomic_xchg() implicit memory barrier orders earlier stores to data
@@
-79,7
+81,7
@@
void _wfq_enqueue(struct wfq_queue *q, struct wfq_node *node)
* that the queue is being appended to. The following store will append
* "node" to the queue from a dequeuer perspective.
*/
* that the queue is being appended to. The following store will append
* "node" to the queue from a dequeuer perspective.
*/
- STORE_SHARED(*old_tail, node);
+
CMM_
STORE_SHARED(*old_tail, node);
}
/*
}
/*
@@
-90,28
+92,28
@@
void _wfq_enqueue(struct wfq_queue *q, struct wfq_node *node)
* thread to be scheduled. The queue appears empty until tail->next is set by
* enqueue.
*/
* thread to be scheduled. The queue appears empty until tail->next is set by
* enqueue.
*/
-st
ruct
wfq_node *
-___
wfq_dequeue_blocking(struct
wfq_queue *q)
+st
atic inline struct cds_
wfq_node *
+___
cds_wfq_dequeue_blocking(struct cds_
wfq_queue *q)
{
{
- struct wfq_node *node, *next;
+ struct
cds_
wfq_node *node, *next;
int attempt = 0;
/*
* Queue is empty if it only contains the dummy node.
*/
int attempt = 0;
/*
* Queue is empty if it only contains the dummy node.
*/
- if (q->head == &q->dummy && LOAD_SHARED(q->tail) == &q->dummy.next)
+ if (q->head == &q->dummy &&
CMM_
LOAD_SHARED(q->tail) == &q->dummy.next)
return NULL;
node = q->head;
/*
* Adaptative busy-looping waiting for enqueuer to complete enqueue.
*/
return NULL;
node = q->head;
/*
* Adaptative busy-looping waiting for enqueuer to complete enqueue.
*/
- while ((next = LOAD_SHARED(node->next)) == NULL) {
+ while ((next =
CMM_
LOAD_SHARED(node->next)) == NULL) {
if (++attempt >= WFQ_ADAPT_ATTEMPTS) {
poll(NULL, 0, WFQ_WAIT); /* Wait for 10ms */
attempt = 0;
} else
if (++attempt >= WFQ_ADAPT_ATTEMPTS) {
poll(NULL, 0, WFQ_WAIT); /* Wait for 10ms */
attempt = 0;
} else
- cpu_relax();
+ c
aa_c
pu_relax();
}
/*
* Move queue head forward.
}
/*
* Move queue head forward.
@@
-121,22
+123,22
@@
___wfq_dequeue_blocking(struct wfq_queue *q)
* Requeue dummy node if we just dequeued it.
*/
if (node == &q->dummy) {
* Requeue dummy node if we just dequeued it.
*/
if (node == &q->dummy) {
- _wfq_node_init(node);
- _wfq_enqueue(q, node);
- return ___wfq_dequeue_blocking(q);
+ _
cds_
wfq_node_init(node);
+ _
cds_
wfq_enqueue(q, node);
+ return ___
cds_
wfq_dequeue_blocking(q);
}
return node;
}
}
return node;
}
-st
ruct
wfq_node *
-_
wfq_dequeue_blocking(struct
wfq_queue *q)
+st
atic inline struct cds_
wfq_node *
+_
cds_wfq_dequeue_blocking(struct cds_
wfq_queue *q)
{
{
- struct wfq_node *retnode;
+ struct
cds_
wfq_node *retnode;
int ret;
ret = pthread_mutex_lock(&q->lock);
assert(!ret);
int ret;
ret = pthread_mutex_lock(&q->lock);
assert(!ret);
- retnode = ___wfq_dequeue_blocking(q);
+ retnode = ___
cds_
wfq_dequeue_blocking(q);
ret = pthread_mutex_unlock(&q->lock);
assert(!ret);
return retnode;
ret = pthread_mutex_unlock(&q->lock);
assert(!ret);
return retnode;
This page took
0.025505 seconds
and
4
git commands to generate.