+extern kern_return_t machine_thread_set_state(
+ thread_act_t act,
+ thread_flavor_t flavor,
+ thread_state_t state,
+ mach_msg_type_number_t count);
+
+extern kern_return_t machine_thread_get_state(
+ thread_act_t act,
+ thread_flavor_t flavor,
+ thread_state_t state,
+ mach_msg_type_number_t *count);
+
+extern kern_return_t machine_thread_dup(
+ thread_act_t self,
+ thread_act_t target);
+
+extern void machine_thread_init(void);
+
+extern kern_return_t machine_thread_create(
+ thread_t thread,
+ task_t task);
+
+extern void machine_thread_destroy(
+ thread_t thread);
+
+extern void machine_thread_set_current(
+ thread_t thread);
+
+extern void machine_thread_terminate_self(void);
+
+/*
+ * XXX Funnel locks XXX
+ */
+
+struct funnel_lock {
+ int fnl_type; /* funnel type */
+ mutex_t *fnl_mutex; /* underlying mutex for the funnel */
+ void * fnl_mtxholder; /* thread (last)holdng mutex */
+ void * fnl_mtxrelease; /* thread (last)releasing mutex */
+ mutex_t *fnl_oldmutex; /* Mutex before collapsing split funnel */
+};
+
+typedef struct funnel_lock funnel_t;
+
+extern void funnel_lock(
+ funnel_t *lock);
+
+extern void funnel_unlock(
+ funnel_t *lock);
+
+typedef struct ReturnHandler ReturnHandler;
+
+#define act_lock(act) mutex_lock(&(act)->lock)
+#define act_lock_try(act) mutex_try(&(act)->lock)
+#define act_unlock(act) mutex_unlock(&(act)->lock)
+
+#define act_reference_locked(act) \
+MACRO_BEGIN \
+ (act)->act_ref_count++; \
+MACRO_END
+
+#define act_deallocate_locked(act) \
+MACRO_BEGIN \
+ if (--(act)->act_ref_count == 0) \
+ panic("act_deallocate_locked"); \
+MACRO_END
+
+extern void act_reference(
+ thread_act_t act);
+
+extern void act_deallocate(
+ thread_act_t act);
+
+extern void act_attach(
+ thread_act_t act,
+ thread_t thread);
+
+extern void act_detach(
+ thread_act_t act);
+
+extern thread_t act_lock_thread(
+ thread_act_t act);
+
+extern void act_unlock_thread(
+ thread_act_t act);
+
+extern thread_act_t thread_lock_act(
+ thread_t thread);