projects
/
urcu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix typo in README.md
[urcu.git]
/
src
/
urcu.c
diff --git
a/src/urcu.c
b/src/urcu.c
index c47f51b53330322468cd5a6b870eab612907fb68..f6ca5f829db62b92d56a0c0ae184b1908b0539a5 100644
(file)
--- a/
src/urcu.c
+++ b/
src/urcu.c
@@
-23,6
+23,7
@@
* IBM's contributions to this file may be relicensed under LGPLv2 or later.
*/
* IBM's contributions to this file may be relicensed under LGPLv2 or later.
*/
+#define URCU_NO_COMPAT_IDENTIFIERS
#define _BSD_SOURCE
#define _LGPL_SOURCE
#define _DEFAULT_SOURCE
#define _BSD_SOURCE
#define _LGPL_SOURCE
#define _DEFAULT_SOURCE
@@
-37,19
+38,21
@@
#include <stdbool.h>
#include <poll.h>
#include <stdbool.h>
#include <poll.h>
-#include
"urcu/arch.h"
-#include
"urcu/wfcqueue.h"
-#include
"urcu/map/urcu.h"
-#include
"urcu/static/urcu.h"
-#include
"urcu-pointer.h"
-#include
"urcu/tls-compat.h"
+#include
<urcu/arch.h>
+#include
<urcu/wfcqueue.h>
+#include
<urcu/map/urcu.h>
+#include
<urcu/static/urcu.h>
+#include
<urcu/pointer.h>
+#include
<urcu/tls-compat.h>
#include "urcu-die.h"
#include "urcu-wait.h"
#include "urcu-die.h"
#include "urcu-wait.h"
+#include "urcu-utils.h"
+#define URCU_API_MAP
/* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
#undef _LGPL_SOURCE
/* Do not #define _LGPL_SOURCE to ensure we can emit the wrapper symbols */
#undef _LGPL_SOURCE
-#include
"urcu.h"
+#include
<urcu/urcu.h>
#define _LGPL_SOURCE
/*
#define _LGPL_SOURCE
/*
@@
-82,10
+85,16
@@
enum membarrier_cmd {
#ifdef RCU_MEMBARRIER
static int init_done;
#ifdef RCU_MEMBARRIER
static int init_done;
-static int has_sys_membarrier_private_expedited;
+static int
urcu_memb_
has_sys_membarrier_private_expedited;
#ifndef CONFIG_RCU_FORCE_SYS_MEMBARRIER
#ifndef CONFIG_RCU_FORCE_SYS_MEMBARRIER
-int rcu_has_sys_membarrier_memb;
+/*
+ * Explicitly initialize to zero because we can't alias a non-static
+ * uninitialized variable.
+ */
+int urcu_memb_has_sys_membarrier = 0;
+URCU_ATTR_ALIAS("urcu_memb_has_sys_membarrier")
+extern int rcu_has_sys_membarrier_memb;
#endif
void __attribute__((constructor)) rcu_init(void);
#endif
void __attribute__((constructor)) rcu_init(void);
@@
-95,6
+104,8
@@
void __attribute__((constructor)) rcu_init(void);
void rcu_init(void)
{
}
void rcu_init(void)
{
}
+URCU_ATTR_ALIAS(urcu_stringify(rcu_init))
+void alias_rcu_init(void);
#endif
#ifdef RCU_SIGNAL
#endif
#ifdef RCU_SIGNAL
@@
-119,13
+130,16
@@
static pthread_mutex_t rcu_gp_lock = PTHREAD_MUTEX_INITIALIZER;
* rcu_registry_lock may nest inside rcu_gp_lock.
*/
static pthread_mutex_t rcu_registry_lock = PTHREAD_MUTEX_INITIALIZER;
* rcu_registry_lock may nest inside rcu_gp_lock.
*/
static pthread_mutex_t rcu_registry_lock = PTHREAD_MUTEX_INITIALIZER;
-struct rcu_gp rcu_gp = { .ctr = RCU_GP_COUNT };
+struct urcu_gp rcu_gp = { .ctr = URCU_GP_COUNT };
+URCU_ATTR_ALIAS(urcu_stringify(rcu_gp))
+extern struct urcu_gp alias_rcu_gp;
/*
* 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(struct urcu_reader, rcu_reader);
+DEFINE_URCU_TLS_ALIAS(struct urcu_reader, rcu_reader, alias_rcu_reader);
static CDS_LIST_HEAD(registry);
static CDS_LIST_HEAD(registry);
@@
-169,8
+183,8
@@
static void mutex_unlock(pthread_mutex_t *mutex)
#ifdef RCU_MEMBARRIER
static void smp_mb_master(void)
{
#ifdef RCU_MEMBARRIER
static void smp_mb_master(void)
{
- if (caa_likely(
rcu_has_sys_membarrier_memb
)) {
- if (membarrier(has_sys_membarrier_private_expedited ?
+ if (caa_likely(
urcu_memb_has_sys_membarrier
)) {
+ if (membarrier(
urcu_memb_
has_sys_membarrier_private_expedited ?
MEMBARRIER_CMD_PRIVATE_EXPEDITED :
MEMBARRIER_CMD_SHARED, 0))
urcu_die(errno);
MEMBARRIER_CMD_PRIVATE_EXPEDITED :
MEMBARRIER_CMD_SHARED, 0))
urcu_die(errno);
@@
-190,7
+204,7
@@
static void smp_mb_master(void)
#ifdef RCU_SIGNAL
static void force_mb_all_readers(void)
{
#ifdef RCU_SIGNAL
static void force_mb_all_readers(void)
{
- struct rcu_reader *index;
+ struct
u
rcu_reader *index;
/*
* Ask for each threads to execute a cmm_smp_mb() so we can consider the
/*
* Ask for each threads to execute a cmm_smp_mb() so we can consider the
@@
-283,7
+297,7
@@
static void wait_for_readers(struct cds_list_head *input_readers,
struct cds_list_head *qsreaders)
{
unsigned int wait_loops = 0;
struct cds_list_head *qsreaders)
{
unsigned int wait_loops = 0;
- struct rcu_reader *index, *tmp;
+ struct
u
rcu_reader *index, *tmp;
#ifdef HAS_INCOHERENT_CACHES
unsigned int wait_gp_loops = 0;
#endif /* HAS_INCOHERENT_CACHES */
#ifdef HAS_INCOHERENT_CACHES
unsigned int wait_gp_loops = 0;
#endif /* HAS_INCOHERENT_CACHES */
@@
-303,18
+317,18
@@
static void wait_for_readers(struct cds_list_head *input_readers,
}
cds_list_for_each_entry_safe(index, tmp, input_readers, node) {
}
cds_list_for_each_entry_safe(index, tmp, input_readers, node) {
- switch (
rcu_reader_state(
&index->ctr)) {
- case RCU_READER_ACTIVE_CURRENT:
+ switch (
urcu_common_reader_state(&rcu_gp,
&index->ctr)) {
+ case
U
RCU_READER_ACTIVE_CURRENT:
if (cur_snap_readers) {
cds_list_move(&index->node,
cur_snap_readers);
break;
}
/* Fall-through */
if (cur_snap_readers) {
cds_list_move(&index->node,
cur_snap_readers);
break;
}
/* Fall-through */
- case RCU_READER_INACTIVE:
+ case
U
RCU_READER_INACTIVE:
cds_list_move(&index->node, qsreaders);
break;
cds_list_move(&index->node, qsreaders);
break;
- case RCU_READER_ACTIVE_OLD:
+ case
U
RCU_READER_ACTIVE_OLD:
/*
* Old snapshot. Leaving node in
* input_readers will make us busy-loop
/*
* Old snapshot. Leaving node in
* input_readers will make us busy-loop
@@
-454,7
+468,7
@@
void synchronize_rcu(void)
cmm_smp_mb();
/* Switch parity: 0 -> 1, 1 -> 0 */
cmm_smp_mb();
/* Switch parity: 0 -> 1, 1 -> 0 */
- CMM_STORE_SHARED(rcu_gp.ctr, rcu_gp.ctr ^ RCU_GP_CTR_PHASE);
+ CMM_STORE_SHARED(rcu_gp.ctr, rcu_gp.ctr ^
U
RCU_GP_CTR_PHASE);
/*
* Must commit rcu_gp.ctr update to memory before waiting for quiescent
/*
* Must commit rcu_gp.ctr update to memory before waiting for quiescent
@@
-501,6
+515,8
@@
out:
*/
urcu_wake_all_waiters(&waiters);
}
*/
urcu_wake_all_waiters(&waiters);
}
+URCU_ATTR_ALIAS(urcu_stringify(synchronize_rcu))
+void alias_synchronize_rcu();
/*
* library wrappers to be used by non-LGPL compatible source code.
/*
* library wrappers to be used by non-LGPL compatible source code.
@@
-510,22
+526,28
@@
void rcu_read_lock(void)
{
_rcu_read_lock();
}
{
_rcu_read_lock();
}
+URCU_ATTR_ALIAS(urcu_stringify(rcu_read_lock))
+void alias_rcu_read_lock();
void rcu_read_unlock(void)
{
_rcu_read_unlock();
}
void rcu_read_unlock(void)
{
_rcu_read_unlock();
}
+URCU_ATTR_ALIAS(urcu_stringify(rcu_read_unlock))
+void alias_rcu_read_unlock();
int rcu_read_ongoing(void)
{
return _rcu_read_ongoing();
}
int rcu_read_ongoing(void)
{
return _rcu_read_ongoing();
}
+URCU_ATTR_ALIAS(urcu_stringify(rcu_read_ongoing))
+void alias_rcu_read_ongoing();
void rcu_register_thread(void)
{
URCU_TLS(rcu_reader).tid = pthread_self();
assert(URCU_TLS(rcu_reader).need_mb == 0);
void rcu_register_thread(void)
{
URCU_TLS(rcu_reader).tid = pthread_self();
assert(URCU_TLS(rcu_reader).need_mb == 0);
- assert(!(URCU_TLS(rcu_reader).ctr & RCU_GP_CTR_NEST_MASK));
+ assert(!(URCU_TLS(rcu_reader).ctr &
U
RCU_GP_CTR_NEST_MASK));
mutex_lock(&rcu_registry_lock);
assert(!URCU_TLS(rcu_reader).registered);
mutex_lock(&rcu_registry_lock);
assert(!URCU_TLS(rcu_reader).registered);
@@
-534,6
+556,8
@@
void rcu_register_thread(void)
cds_list_add(&URCU_TLS(rcu_reader).node, ®istry);
mutex_unlock(&rcu_registry_lock);
}
cds_list_add(&URCU_TLS(rcu_reader).node, ®istry);
mutex_unlock(&rcu_registry_lock);
}
+URCU_ATTR_ALIAS(urcu_stringify(rcu_register_thread))
+void alias_rcu_register_thread();
void rcu_unregister_thread(void)
{
void rcu_unregister_thread(void)
{
@@
-543,6
+567,8
@@
void rcu_unregister_thread(void)
cds_list_del(&URCU_TLS(rcu_reader).node);
mutex_unlock(&rcu_registry_lock);
}
cds_list_del(&URCU_TLS(rcu_reader).node);
mutex_unlock(&rcu_registry_lock);
}
+URCU_ATTR_ALIAS(urcu_stringify(rcu_unregister_thread))
+void alias_rcu_unregister_thread();
#ifdef RCU_MEMBARRIER
#ifdef RCU_MEMBARRIER
@@
-559,7
+585,7
@@
void rcu_sys_membarrier_status(bool available)
{
if (!available)
return;
{
if (!available)
return;
-
rcu_has_sys_membarrier_memb
= 1;
+
urcu_memb_has_sys_membarrier
= 1;
}
#endif
}
#endif
@@
-574,7
+600,7
@@
void rcu_sys_membarrier_init(void)
if (mask & MEMBARRIER_CMD_PRIVATE_EXPEDITED) {
if (membarrier(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0))
urcu_die(errno);
if (mask & MEMBARRIER_CMD_PRIVATE_EXPEDITED) {
if (membarrier(MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED, 0))
urcu_die(errno);
- has_sys_membarrier_private_expedited = 1;
+
urcu_memb_
has_sys_membarrier_private_expedited = 1;
available = true;
} else if (mask & MEMBARRIER_CMD_SHARED) {
available = true;
available = true;
} else if (mask & MEMBARRIER_CMD_SHARED) {
available = true;
@@
-590,6
+616,8
@@
void rcu_init(void)
init_done = 1;
rcu_sys_membarrier_init();
}
init_done = 1;
rcu_sys_membarrier_init();
}
+URCU_ATTR_ALIAS(urcu_stringify(rcu_init))
+void alias_rcu_init(void);
#endif
#ifdef RCU_SIGNAL
#endif
#ifdef RCU_SIGNAL
@@
-629,6
+657,8
@@
void rcu_init(void)
if (ret)
urcu_die(errno);
}
if (ret)
urcu_die(errno);
}
+URCU_ATTR_ALIAS(urcu_stringify(rcu_init))
+void alias_rcu_init(void);
void rcu_exit(void)
{
void rcu_exit(void)
{
@@
-641,10
+671,13
@@
void rcu_exit(void)
* assert(cds_list_empty(®istry));
*/
}
* assert(cds_list_empty(®istry));
*/
}
+URCU_ATTR_ALIAS(urcu_stringify(rcu_exit))
+void alias_rcu_exit(void);
#endif /* #ifdef RCU_SIGNAL */
DEFINE_RCU_FLAVOR(rcu_flavor);
#endif /* #ifdef RCU_SIGNAL */
DEFINE_RCU_FLAVOR(rcu_flavor);
+DEFINE_RCU_FLAVOR_ALIAS(rcu_flavor, alias_rcu_flavor);
#include "urcu-call-rcu-impl.h"
#include "urcu-defer-impl.h"
#include "urcu-call-rcu-impl.h"
#include "urcu-defer-impl.h"
This page took
0.026081 seconds
and
4
git commands to generate.