-
-#ifndef DEBUG_FULL_MB
-static void sigurcu_handler(int signo, siginfo_t *siginfo, void *context)
-{
- /*
- * Executing this smp_mb() is the only purpose of this signal handler.
- * It punctually promotes barrier() into smp_mb() on every thread it is
- * executed on.
- */
- smp_mb();
- need_mb = 0;
- smp_mb();
-}
-
-/*
- * urcu_init constructor. Called when the library is linked, but also when
- * reader threads are calling rcu_register_thread().
- * Should only be called by a single thread at a given time. This is ensured by
- * holing the internal_urcu_lock() from rcu_register_thread() or by running at
- * library load time, which should not be executed by multiple threads nor
- * concurrently with rcu_register_thread() anyway.
- */
-void urcu_init(void)
-{
- struct sigaction act;
- int ret;
-
- if (init_done)
- return;
- init_done = 1;
-
- act.sa_sigaction = sigurcu_handler;
- ret = sigaction(SIGURCU, &act, NULL);
- if (ret) {
- perror("Error in sigaction");
- exit(-1);
- }
-}
-
-void urcu_exit(void)
-{
- struct sigaction act;
- int ret;
-
- ret = sigaction(SIGURCU, NULL, &act);
- if (ret) {
- perror("Error in sigaction");
- exit(-1);
- }
- assert(act.sa_sigaction == sigurcu_handler);
- free(registry);
-}
-#endif /* #ifndef DEBUG_FULL_MB */