projects
/
userspace-rcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
urcu-call-rcu: use wait-free splice return value
[userspace-rcu.git]
/
urcu-bp.c
diff --git
a/urcu-bp.c
b/urcu-bp.c
index bb657d7dc620833d6c7b19cbf0b21e20c3ea78f4..b07a1bbed912a5998c1089a2237825d2801f7032 100644
(file)
--- a/
urcu-bp.c
+++ b/
urcu-bp.c
@@
-36,12
+36,14
@@
#include <unistd.h>
#include <sys/mman.h>
#include <unistd.h>
#include <sys/mman.h>
-#include "urcu/wfqueue.h"
+#include "urcu/wf
c
queue.h"
#include "urcu/map/urcu-bp.h"
#include "urcu/static/urcu-bp.h"
#include "urcu-pointer.h"
#include "urcu/tls-compat.h"
#include "urcu/map/urcu-bp.h"
#include "urcu/static/urcu-bp.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-bp.h"
/* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
#undef _LGPL_SOURCE
#include "urcu-bp.h"
@@
-51,7
+53,14
@@
#define MAP_ANONYMOUS MAP_ANON
#endif
#define MAP_ANONYMOUS MAP_ANON
#endif
-#ifndef __linux__
+#ifdef __linux__
+static
+void *mremap_wrapper(void *old_address, size_t old_size,
+ size_t new_size, int flags)
+{
+ return mremap(old_address, old_size, new_size, flags);
+}
+#else
#define MREMAP_MAYMOVE 1
#define MREMAP_FIXED 2
#define MREMAP_MAYMOVE 1
#define MREMAP_FIXED 2
@@
-60,7
+69,9
@@
* mremap wrapper for non-Linux systems. Maps a RW, anonymous private mapping.
* This is not generic.
*/
* mremap wrapper for non-Linux systems. Maps a RW, anonymous private mapping.
* This is not generic.
*/
-void *mremap(void *old_address, size_t old_size, size_t new_size, int flags)
+static
+void *mremap_wrapper(void *old_address, size_t old_size,
+ size_t new_size, int flags)
{
void *new_address;
{
void *new_address;
@@
-94,8
+105,8
@@
void __attribute__((destructor)) rcu_bp_exit(void);
static pthread_mutex_t rcu_gp_lock = PTHREAD_MUTEX_INITIALIZER;
#ifdef DEBUG_YIELD
static pthread_mutex_t rcu_gp_lock = PTHREAD_MUTEX_INITIALIZER;
#ifdef DEBUG_YIELD
-unsigned int yield_active;
-DEFINE_URCU_TLS(unsigned int, rand_yield);
+unsigned int
rcu_
yield_active;
+DEFINE_URCU_TLS(unsigned int, r
cu_r
and_yield);
#endif
/*
#endif
/*
@@
-133,17
+144,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 */
@@
-154,13
+160,11
@@
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);
}
}
-void update_counter_and_wait(void)
+
static
void update_counter_and_wait(void)
{
CDS_LIST_HEAD(qsreaders);
int wait_loops = 0;
{
CDS_LIST_HEAD(qsreaders);
int wait_loops = 0;
@@
-284,8
+288,8
@@
static void resize_arena(struct registry_arena *arena, size_t len)
MAP_ANONYMOUS | MAP_PRIVATE,
-1, 0);
else
MAP_ANONYMOUS | MAP_PRIVATE,
-1, 0);
else
- new_arena = mremap(arena->p, arena->len,
- len, MREMAP_MAYMOVE);
+ new_arena = mremap
_wrapper
(arena->p, arena->len,
+
len, MREMAP_MAYMOVE);
assert(new_arena != MAP_FAILED);
/*
assert(new_arena != MAP_FAILED);
/*
@@
-430,7
+434,8
@@
void *rcu_dereference_sym_bp(void *p)
void *rcu_set_pointer_sym_bp(void **p, void *v)
{
cmm_wmb();
void *rcu_set_pointer_sym_bp(void **p, void *v)
{
cmm_wmb();
- return uatomic_set(p, v);
+ uatomic_set(p, v);
+ return v;
}
void *rcu_xchg_pointer_sym_bp(void **p, void *v)
}
void *rcu_xchg_pointer_sym_bp(void **p, void *v)
This page took
0.025213 seconds
and
4
git commands to generate.