+/*
+ * This unregistration function is deprecated, meant only for internal
+ * use by rculfhash.
+ */
+__attribute__((__noreturn__))
+void urcu_unregister_rculfhash_atfork(struct urcu_atfork *atfork __attribute__((unused)))
+{
+ urcu_die(EPERM);
+}
+
+/*
+ * Teardown the default call_rcu worker thread if there are no queued
+ * callbacks on process exit. This prevents leaking memory.
+ *
+ * Here is how an application can ensure graceful teardown of this
+ * worker thread:
+ *
+ * - An application queuing call_rcu callbacks should invoke
+ * rcu_barrier() before it exits.
+ * - When chaining call_rcu callbacks, the number of calls to
+ * rcu_barrier() on application exit must match at least the maximum
+ * number of chained callbacks.
+ * - If an application chains callbacks endlessly, it would have to be
+ * modified to stop chaining callbacks when it detects an application
+ * exit (e.g. with a flag), and wait for quiescence with rcu_barrier()
+ * after setting that flag.
+ * - The statements above apply to a library which queues call_rcu
+ * callbacks, only it needs to invoke rcu_barrier in its library
+ * destructor.
+ *
+ * Note that this function does not presume it is being called when the
+ * application is single-threaded even though this is invoked from a
+ * destructor: this function synchronizes against concurrent calls to
+ * get_default_call_rcu_data().
+ */
+static void urcu_call_rcu_exit(void)