#ifndef _KERN_SYNC_LOCK_H_
#define _KERN_SYNC_LOCK_H_
#include <mach/mach_types.h>
#include <sys/appleapiopts.h>
#ifdef __APPLE_API_PRIVATE
#ifdef MACH_KERNEL_PRIVATE
#include <kern/wait_queue.h>
#include <kern/macro_help.h>
#include <kern/queue.h>
#include <kern/lock.h>
typedef struct ulock {
queue_chain_t thread_link;
queue_chain_t held_link;
queue_chain_t handoff_link;
decl_mutex_data(,lock)
struct lock_set *lock_set;
thread_act_t holder;
unsigned int
blocked:1,
unstable:1,
ho_wait:1,
accept_wait:1,
:0;
struct wait_queue wait_queue;
} Ulock;
typedef struct ulock *ulock_t;
typedef struct lock_set {
queue_chain_t task_link;
decl_mutex_data(,lock)
task_t owner;
ipc_port_t port;
int ref_count;
boolean_t active;
int n_ulocks;
struct ulock ulock_list[1];
} Lock_Set;
#define ULOCK_NULL ((ulock_t) 0)
#define ULOCK_FREE 0
#define ULOCK_HELD 1
#define lock_set_lock_init(ls) mutex_init(&(ls)->lock, \
ETAP_THREAD_LOCK_SET)
#define lock_set_lock(ls) mutex_lock(&(ls)->lock)
#define lock_set_unlock(ls) mutex_unlock(&(ls)->lock)
#define ulock_lock_init(ul) mutex_init(&(ul)->lock, \
ETAP_THREAD_ULOCK)
#define ulock_lock(ul) mutex_lock(&(ul)->lock)
#define ulock_unlock(ul) mutex_unlock(&(ul)->lock)
extern void lock_set_init(void);
extern kern_return_t lock_release_internal (ulock_t ulock,
thread_act_t thr_act);
#endif
#endif
extern kern_return_t lock_set_create (task_t task,
lock_set_t *new_lock_set,
int n_ulocks,
int policy);
extern kern_return_t lock_set_destroy (task_t task,
lock_set_t lock_set);
extern kern_return_t lock_acquire (lock_set_t lock_set,
int lock_id);
extern kern_return_t lock_release (lock_set_t lock_set,
int lock_id);
extern kern_return_t lock_try (lock_set_t lock_set,
int lock_id);
extern kern_return_t lock_make_stable (lock_set_t lock_set,
int lock_id);
extern kern_return_t lock_make_unstable (ulock_t ulock,
thread_act_t thr_act);
extern kern_return_t lock_handoff (lock_set_t lock_set,
int lock_id);
extern kern_return_t lock_handoff_accept (lock_set_t lock_set,
int lock_id);
extern void lock_set_reference (lock_set_t lock_set);
extern void lock_set_dereference (lock_set_t lock_set);
#endif