#ifndef _KERN_WORK_INTERVAL_H_
#define _KERN_WORK_INTERVAL_H_
#include <sys/cdefs.h>
#include <stdint.h>
#include <kern/kern_types.h>
#include <kern/thread_group.h>
__BEGIN_DECLS
struct work_interval;
struct kern_work_interval_args {
uint64_t work_interval_id;
uint64_t start;
uint64_t finish;
uint64_t deadline;
uint64_t next_start;
uint32_t notify_flags;
uint32_t create_flags;
uint16_t urgency;
};
struct kern_work_interval_create_args {
uint64_t wica_id;
mach_port_name_t wica_port;
uint32_t wica_create_flags;
};
extern kern_return_t
kern_work_interval_create(thread_t thread, struct kern_work_interval_create_args *create_params);
extern kern_return_t
kern_work_interval_get_flags_from_port(mach_port_name_t port_name, uint32_t*flags);
extern kern_return_t
kern_work_interval_destroy(thread_t thread, uint64_t work_interval_id);
extern kern_return_t
kern_work_interval_join(thread_t thread, mach_port_name_t port_name);
extern kern_return_t
kern_work_interval_notify(thread_t thread, struct kern_work_interval_args* kwi_args);
#ifdef MACH_KERNEL_PRIVATE
extern void work_interval_port_notify(mach_msg_header_t *msg);
void work_interval_subsystem_init(void);
bool work_interval_port_type_render_server(mach_port_name_t port_name);
#if CONFIG_SCHED_AUTO_JOIN
bool work_interval_should_propagate(thread_t cthread, thread_t thread);
void work_interval_auto_join_propagate(thread_t from, thread_t to);
void work_interval_auto_join_unwind(thread_t thread);
void work_interval_auto_join_demote(thread_t thread);
#endif
extern kern_return_t work_interval_thread_terminate(thread_t thread);
#endif
__END_DECLS
#endif