- _rcu_defer_queue(fct, p);
-}
-
-static void rcu_add_deferer(pthread_t id)
-{
- struct deferer_registry *oldarray;
-
- if (!registry) {
- alloc_deferers = INIT_NUM_THREADS;
- num_deferers = 0;
- registry =
- malloc(sizeof(struct deferer_registry) * alloc_deferers);
- }
- if (alloc_deferers < num_deferers + 1) {
- oldarray = registry;
- registry = malloc(sizeof(struct deferer_registry)
- * (alloc_deferers << 1));
- memcpy(registry, oldarray,
- sizeof(struct deferer_registry) * alloc_deferers);
- alloc_deferers <<= 1;
- free(oldarray);
- }
- registry[num_deferers].tid = id;
- /* reference to the TLS of _this_ deferer thread. */
- registry[num_deferers].defer_queue = &defer_queue;
- registry[num_deferers].last_head = 0;
- num_deferers++;
-}
-
-/*
- * Never shrink (implementation limitation).
- * This is O(nb threads). Eventually use a hash table.
- */
-static void rcu_remove_deferer(pthread_t id)
-{
- struct deferer_registry *index;
-
- assert(registry != NULL);
- for (index = registry; index < registry + num_deferers; index++) {
- if (pthread_equal(index->tid, id)) {
- memcpy(index, ®istry[num_deferers - 1],
- sizeof(struct deferer_registry));
- registry[num_deferers - 1].tid = 0;
- registry[num_deferers - 1].defer_queue = NULL;
- registry[num_deferers - 1].last_head = 0;
- num_deferers--;
- return;
- }
- }
- /* Hrm not found, forgot to register ? */
- assert(0);