return (trampoline);
}
-static void
-trampoline_put(isc__trampoline_t *trampoline) {
+void
+isc__trampoline_detach(isc__trampoline_t *trampoline) {
LOCK(&isc__trampoline_lock);
REQUIRE(trampoline->tid > 0 &&
(size_t)trampoline->tid < isc__trampoline_max);
return;
}
-isc_threadresult_t
-isc__trampoline_run(isc_threadarg_t arg) {
- isc__trampoline_t *trampoline = (isc__trampoline_t *)arg;
- isc_threadresult_t result;
-
+void
+isc__trampoline_attach(isc__trampoline_t *trampoline) {
REQUIRE(trampoline->tid > 0 &&
(size_t)trampoline->tid < isc__trampoline_max);
REQUIRE(trampoline->self == ISC__TRAMPOLINE_UNUSED);
/* Initialize the trampoline */
isc_tid_v = trampoline->tid;
trampoline->self = isc_thread_self();
+}
+
+isc_threadresult_t
+isc__trampoline_run(isc_threadarg_t arg) {
+ isc__trampoline_t *trampoline = (isc__trampoline_t *)arg;
+ isc_threadresult_t result;
+
+ isc__trampoline_attach(trampoline);
/* Run the main function */
result = (trampoline->start)(trampoline->arg);
- trampoline_put(trampoline);
+ isc__trampoline_detach(trampoline);
return (result);
}
*\li 'start_routine' is a valid non-NULL thread start_routine
*/
+void
+isc__trampoline_attach(isc__trampoline_t *trampoline);
+void
+isc__trampoline_detach(isc__trampoline_t *trampoline);
+/*%<
+ * Attach/detach the trampoline to/from the current thread.
+ *
+ * Requires:
+ * \li 'trampoline' is a valid isc__trampoline_t
+ */
+
isc_threadresult_t
isc__trampoline_run(isc_threadarg_t arg);
/*%<