#define _SYS_USER_H_
#include <sys/appleapiopts.h>
+struct waitq_set;
#ifndef KERNEL
/* stuff that *used* to be included by user.h, or is now needed */
#include <errno.h>
kauth_cred_t vc_ucred; /* per thread credential */
};
-/*
- * struct representing a document "tombstone" that's recorded
- * when a thread manipulates files marked with a document-id.
- * if the thread recreates the same item, this tombstone is
- * used to preserve the document_id on the new file.
- *
- * It is a separate structure because of its size - we want to
- * allocate it on demand instead of just stuffing it into the
- * uthread structure.
- */
-struct doc_tombstone {
- struct vnode *t_lastop_parent;
- struct vnode *t_lastop_item;
- uint32_t t_lastop_parent_vid;
- uint32_t t_lastop_item_vid;
- uint64_t t_lastop_fileid;
- uint64_t t_lastop_document_id;
- unsigned char t_lastop_filename[NAME_MAX+1];
-};
-
#endif /* !__LP64 || XNU_KERNEL_PRIVATE */
#ifdef BSD_KERNEL_PRIVATE
struct uthread {
/* syscall parameters, results and catches */
u_int64_t uu_arg[8]; /* arguments to current system call */
- int *uu_ap; /* pointer to arglist */
int uu_rval[2];
+ unsigned int syscall_code; /* current syscall code */
/* thread exception handling */
mach_exception_code_t uu_code; /* ``code'' to trap */
union {
struct _select_data {
u_int64_t abstime;
- char * wql;
- int poll;
- int error;
+ uint64_t *wqp;
int count;
+ struct select_nocancel_args *args; /* original syscall arguments */
+ int32_t *retval; /* place to store return val */
} ss_select_data;
struct _kqueue_scan {
- kevent_callback_t call; /* per-event callback */
- kqueue_continue_t cont; /* whole call continuation */
- uint64_t deadline; /* computed deadline for operation */
- void *data; /* caller's private data */
- } ss_kqueue_scan; /* saved state for kevent_scan() */
+ kevent_callback_t call; /* per-event callback */
+ kqueue_continue_t cont; /* whole call continuation */
+ filt_process_data_t process_data; /* needed for filter processing */
+ uint8_t servicer_qos_index; /* requested qos index of servicer */
+ uint64_t deadline; /* computed deadline for operation */
+ void *data; /* caller's private data */
+ } ss_kqueue_scan; /* saved state for kevent_scan() */
struct _kevent {
- struct _kqueue_scan scan;/* space for the generic data */
- struct fileproc *fp; /* fileproc we hold iocount on */
- int fd; /* filedescriptor for kq */
- int32_t *retval; /* place to store return val */
- user_addr_t eventlist; /* user-level event list address */
- size_t eventsize; /* kevent or kevent64_s */
- int eventcount; /* user-level event count */
- int eventout; /* number of events output */
+ struct _kqueue_scan scan; /* space for the generic data */
+ struct fileproc *fp; /* fileproc we hold iocount on */
+ int fd; /* filedescriptor for kq */
+ int eventcount; /* user-level event count */
+ int eventout; /* number of events output */
+ struct filt_process_s process_data; /* space for process data fed thru */
+ int32_t *retval; /* place to store return val */
+ user_addr_t eventlist; /* user-level event list address */
+ uint64_t data_available; /* [user/kernel] addr of in/out size */
} ss_kevent; /* saved state for kevent() */
struct _kauth {
} uu_kauth;
struct ksyn_waitq_element uu_kwe; /* user for pthread synch */
+
+ struct _waitid_data {
+ struct waitid_nocancel_args *args; /* original syscall arguments */
+ int32_t *retval; /* place to store return val */
+ } uu_waitid_data;
+
+ struct _wait4_data {
+ struct wait4_nocancel_args *args; /* original syscall arguments */
+ int32_t *retval; /* place to store return val */
+ } uu_wait4_data;
} uu_kevent;
+ /* Persistent memory allocations across system calls */
struct _select {
u_int32_t *ibits, *obits; /* bits to select on */
uint nbytes; /* number of bytes in ibits and obits */
- struct _select_data *data;
} uu_select; /* saved state for select() */
/* internal support for continuation framework */
struct proc * uu_proc;
thread_t uu_thread;
void * uu_userstate;
- wait_queue_set_t uu_wqset; /* cached across select calls */
- size_t uu_allocsize; /* ...size of select cache */
+ struct waitq_set *uu_wqset; /* waitq state cached across select calls */
+ size_t uu_wqstate_sz; /* ...size of uu_wqset buffer */
int uu_flag;
sigset_t uu_siglist; /* signals pending for the thread */
sigset_t uu_sigwait; /* sigwait on this thread*/
lck_mtx_t *uu_mtx;
+ lck_spin_t uu_rethrottle_lock; /* locks was_rethrottled and is_throttled */
TAILQ_ENTRY(uthread) uu_throttlelist; /* List of uthreads currently throttled */
void * uu_throttle_info; /* pointer to throttled I/Os info */
int uu_on_throttlelist;
int uu_lowpri_window;
+ boolean_t uu_was_rethrottled;
+ boolean_t uu_is_throttled;
boolean_t uu_throttle_bc;
u_int32_t uu_network_marks; /* network control flow marks */
struct kern_sigaltstack uu_sigstk;
vnode_t uu_vreclaims;
vnode_t uu_cdir; /* per thread CWD */
- int uu_notrigger; /* XXX - flag for autofs */
int uu_dupfd; /* fd in fdesc_open/dupfdopen */
int uu_defer_reclaims;
+ unsigned int uu_kqueue_bound; /* qos index we are bound to service */
+ unsigned int uu_kqueue_flags; /* if so, the flags being using */
+
#ifdef JOE_DEBUG
int uu_iocount;
int uu_vpindex;
void * uu_vps[32];
void * uu_pcs[32][10];
#endif
+
+#if PROC_REF_DEBUG
+#define NUM_PROC_REFS_TO_TRACK 32
+#define PROC_REF_STACK_DEPTH 10
+ int uu_proc_refcount;
+ int uu_pindex;
+ void * uu_proc_ps[NUM_PROC_REFS_TO_TRACK];
+ uintptr_t uu_proc_pcs[NUM_PROC_REFS_TO_TRACK][PROC_REF_STACK_DEPTH];
+#endif
+
#if CONFIG_DTRACE
uint32_t t_dtrace_errno; /* Most recent errno */
siginfo_t t_dtrace_siginfo;
#endif /* CONFIG_DTRACE */
void * uu_threadlist;
char * pth_name;
- struct label * uu_label; /* MAC label */
/* Document Tracking struct used to track a "tombstone" for a document */
struct doc_tombstone *t_tombstone;
+
+ struct os_reason *uu_exit_reason;
};
typedef struct uthread * uthread_t;