#ifndef _KERN_SCHED_PRIM_H_
#define _KERN_SCHED_PRIM_H_
#include <mach/boolean.h>
#include <mach/machine/vm_types.h>
#include <mach/kern_return.h>
#include <kern/clock.h>
#include <kern/kern_types.h>
#include <kern/thread.h>
#include <sys/cdefs.h>
#ifdef MACH_KERNEL_PRIVATE
extern void sched_init(void);
extern void sched_startup(void);
extern void sched_timebase_init(void);
extern boolean_t thread_stop(
thread_t thread);
extern void thread_unstop(
thread_t thread);
extern void thread_wait(
thread_t thread);
extern thread_t thread_select(
processor_t myprocessor);
extern boolean_t thread_unblock(
thread_t thread,
wait_result_t wresult);
extern kern_return_t thread_go(
thread_t thread,
wait_result_t wresult);
extern boolean_t thread_invoke(
thread_t old_thread,
thread_t new_thread,
ast_t reason);
extern void thread_done(
thread_t old_thread,
thread_t new_thread,
processor_t processor);
extern void thread_begin(
thread_t thread,
processor_t processor);
extern void thread_dispatch(
thread_t thread);
extern int thread_run(
thread_t self,
thread_continue_t continuation,
void *parameter,
thread_t new_thread);
extern void thread_continue(
thread_t old_thread);
extern void call_continuation(
thread_continue_t continuation,
void *parameter,
wait_result_t wresult);
extern void set_sched_pri(
thread_t thread,
int priority);
extern void set_priority(
thread_t thread,
int priority);
extern void compute_priority(
thread_t thread,
boolean_t override_depress);
extern void compute_my_priority(
thread_t thread);
extern void sched_tick_thread(void);
extern void update_priority(
thread_t thread);
extern void idle_thread(void);
extern kern_return_t idle_thread_create(
processor_t processor);
extern void thread_bootstrap_return(void);
extern void thread_syscall_return(
kern_return_t ret);
extern wait_result_t thread_block_reason(
thread_continue_t continuation,
void *parameter,
ast_t reason);
extern void thread_setrun(
thread_t thread,
integer_t options);
#define SCHED_TAILQ 0
#define SCHED_HEADQ 1
#define SCHED_PREEMPT 2
extern processor_t thread_bind(
thread_t thread,
processor_t processor);
extern void thread_timer_expire(
void *thread,
void *p1);
__private_extern__ wait_interrupt_t thread_interrupt_level(
wait_interrupt_t interruptible);
__private_extern__ wait_result_t thread_mark_wait_locked(
thread_t thread,
wait_interrupt_t interruptible);
__private_extern__ kern_return_t clear_wait_internal(
thread_t thread,
wait_result_t result);
#endif
__BEGIN_DECLS
#ifdef XNU_KERNEL_PRIVATE
extern boolean_t assert_wait_possible(void);
extern kern_return_t clear_wait(
thread_t thread,
wait_result_t result);
extern void thread_exception_return(void);
#endif
extern wait_result_t thread_block(
thread_continue_t continuation);
extern wait_result_t thread_block_parameter(
thread_continue_t continuation,
void *parameter);
extern wait_result_t assert_wait(
event_t event,
wait_interrupt_t interruptible);
extern wait_result_t assert_wait_timeout(
event_t event,
wait_interrupt_t interruptible,
uint32_t interval,
uint32_t scale_factor);
extern wait_result_t assert_wait_deadline(
event_t event,
wait_interrupt_t interruptible,
uint64_t deadline);
extern kern_return_t thread_wakeup_prim(
event_t event,
boolean_t one_thread,
wait_result_t result);
#define thread_wakeup(x) \
thread_wakeup_prim((x), FALSE, THREAD_AWAKENED)
#define thread_wakeup_with_result(x, z) \
thread_wakeup_prim((x), FALSE, (z))
#define thread_wakeup_one(x) \
thread_wakeup_prim((x), TRUE, THREAD_AWAKENED)
extern boolean_t preemption_enabled(void);
#ifdef KERNEL_PRIVATE
extern void thread_set_timer(
uint32_t interval,
uint32_t scale_factor);
extern void thread_set_timer_deadline(
uint64_t deadline);
extern void thread_cancel_timer(void);
#ifndef MACH_KERNEL_PRIVATE
#ifndef ABSOLUTETIME_SCALAR_TYPE
#define thread_set_timer_deadline(a) \
thread_set_timer_deadline(__OSAbsoluteTime(a))
#endif
#endif
#endif
__END_DECLS
#endif