+/*
+ * urcu.c
+ *
+ * Userspace RCU library
+ *
+ * Copyright February 2009 - Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
+ *
+ * Distributed under GPLv2
+ */
+
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
/*
* BUSY-LOOP.
*/
- while (*index->urcu_active_readers != 0)
+ while (index->urcu_active_readers[parity] != 0)
barrier();
}
/*
*/
void *urcu_publish_content(void **ptr, void *new)
{
- int ret, prev_parity;
+ int prev_parity;
void *oldptr;
/*
*/
oldptr = *ptr;
*ptr = new;
- wmb(); /* Write ptr before changing the qparity */
/* All threads should read qparity before ptr */
+ /* Write ptr before changing the qparity */
force_mb_all_threads();
prev_parity = switch_next_urcu_qparity();
assert(reader_data != NULL);
for (index = reader_data; index < reader_data + num_readers; index++) {
- if (index->tid == id) {
+ if (pthread_equal(index->tid, id)) {
memcpy(index, &reader_data[num_readers - 1],
sizeof(struct reader_data));
reader_data[num_readers - 1].tid = 0;
void urcu_unregister_thread(void)
{
- pthread_t self = pthread_self();
rcu_write_lock();
urcu_remove_reader(pthread_self());
rcu_write_unlock();