-void *rcu_assign_pointer_sym(void **p, void *v)
-{
- wmb();
- return STORE_SHARED(p, v);
-}
-
-void *rcu_xchg_pointer_sym(void **p, void *v)
-{
- wmb();
- return xchg(p, v);
-}
-
-void *rcu_publish_content_sym(void **p, void *v)
-{
- void *oldptr;
-
- oldptr = _rcu_xchg_pointer(p, v);
- synchronize_rcu();
- return oldptr;
-}
-
-static void rcu_add_reader(pthread_t id)
-{
- struct reader_registry *oldarray;
-
- if (!registry) {
- alloc_readers = INIT_NUM_THREADS;
- num_readers = 0;
- registry =
- malloc(sizeof(struct reader_registry) * alloc_readers);
- }
- if (alloc_readers < num_readers + 1) {
- oldarray = registry;
- registry = malloc(sizeof(struct reader_registry)
- * (alloc_readers << 1));
- memcpy(registry, oldarray,
- sizeof(struct reader_registry) * alloc_readers);
- alloc_readers <<= 1;
- free(oldarray);
- }
- registry[num_readers].tid = id;
- /* reference to the TLS of _this_ reader thread. */
- registry[num_readers].urcu_active_readers = &urcu_active_readers;
- registry[num_readers].need_mb = &need_mb;
- num_readers++;
-}
-
-/*
- * Never shrink (implementation limitation).
- * This is O(nb threads). Eventually use a hash table.
- */
-static void rcu_remove_reader(pthread_t id)