darwin-xnu/bsd/sys/proc_internal.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved.
   3 *
   4 * @APPLE_LICENSE_HEADER_START@
   5 * 
   6 * The contents of this file constitute Original Code as defined in and
   7 * are subject to the Apple Public Source License Version 1.1 (the
   8 * "License").  You may not use this file except in compliance with the
   9 * License.  Please obtain a copy of the License at
  10 * http://www.apple.com/publicsource and read it before using this file.
  11 * 
  12 * This Original Code and all software distributed under the License are
  13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
  17 * License for the specific language governing rights and limitations
  18 * under the License.
  19 * 
  20 * @APPLE_LICENSE_HEADER_END@
  21 */
  22/* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */
  23/*-
  24 * Copyright (c) 1986, 1989, 1991, 1993
  25 *      The Regents of the University of California.  All rights reserved.
  26 * (c) UNIX System Laboratories, Inc.
  27 * All or some portions of this file are derived from material licensed
  28 * to the University of California by American Telephone and Telegraph
  29 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
  30 * the permission of UNIX System Laboratories, Inc.
  31 *
  32 * Redistribution and use in source and binary forms, with or without
  33 * modification, are permitted provided that the following conditions
  34 * are met:
  35 * 1. Redistributions of source code must retain the above copyright
  36 *    notice, this list of conditions and the following disclaimer.
  37 * 2. Redistributions in binary form must reproduce the above copyright
  38 *    notice, this list of conditions and the following disclaimer in the
  39 *    documentation and/or other materials provided with the distribution.
  40 * 3. All advertising materials mentioning features or use of this software
  41 *    must display the following acknowledgement:
  42 *      This product includes software developed by the University of
  43 *      California, Berkeley and its contributors.
  44 * 4. Neither the name of the University nor the names of its contributors
  45 *    may be used to endorse or promote products derived from this software
  46 *    without specific prior written permission.
  47 *
  48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  51 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  58 * SUCH DAMAGE.
  59 *
  60 *      @(#)proc_internal.h     8.15 (Berkeley) 5/19/95
  61 */
  62
  63#ifndef _SYS_PROC_INTERNAL_H_
  64#define _SYS_PROC_INTERNAL_H_
  65
  66#include <sys/proc.h>
  67__BEGIN_DECLS
  68#include <kern/locks.h>
  69__END_DECLS
  70
  71/*
  72 * One structure allocated per session.
  73 */
  74struct  session {
  75        int     s_count;                /* Ref cnt; pgrps in session. */
  76        struct  proc *s_leader;         /* Session leader. */
  77        struct  vnode *s_ttyvp;         /* Vnode of controlling terminal. */
  78        struct  tty *s_ttyp;            /* Controlling terminal. */
  79        pid_t   s_sid;          /* Session ID */
  80        char    s_login[MAXLOGNAME];    /* Setlogin() name. */
  81};
  82
  83/*
  84 * One structure allocated per process group.
  85 */
  86struct  pgrp {
  87        LIST_ENTRY(pgrp) pg_hash;       /* Hash chain. */
  88        LIST_HEAD(, proc) pg_members;   /* Pointer to pgrp members. */
  89        struct  session *pg_session;    /* Pointer to session. */
  90        pid_t   pg_id;                  /* Pgrp id. */
  91        int     pg_jobc;        /* # procs qualifying pgrp for job control */
  92};
  93
  94struct proc;
  95
  96#define PROC_NULL (struct proc *)0
  97
  98#define p_session       p_pgrp->pg_session
  99#define p_pgid          p_pgrp->pg_id
 100
 101/*
 102 * Description of a process.
 103 *
 104 * This structure contains the information needed to manage a thread of
 105 * control, known in UN*X as a process; it has references to substructures
 106 * containing descriptions of things that the process uses, but may share
 107 * with related processes.  The process structure and the substructures
 108 * are always addressible except for those marked "(PROC ONLY)" below,
 109 * which might be addressible only on a processor on which the process
 110 * is running.
 111 */
 112struct  proc {
 113        LIST_ENTRY(proc) p_list;        /* List of all processes. */
 114
 115        /* substructures: */
 116        struct  ucred *p_ucred;         /* Process owner's identity. */
 117        struct  filedesc *p_fd;         /* Ptr to open files structure. */
 118        struct  pstats *p_stats;        /* Accounting/statistics (PROC ONLY). */
 119        struct  plimit *p_limit;        /* Process limits. */
 120        struct  sigacts *p_sigacts;     /* Signal actions, state (PROC ONLY). */
 121
 122#define p_rlimit        p_limit->pl_rlimit
 123
 124        int     p_flag;                 /* P_* flags. */
 125        char    p_stat;                 /* S* process status. */
 126        char    p_shutdownstate;
 127        char    p_pad1[2];
 128
 129        pid_t   p_pid;                  /* Process identifier. */
 130        LIST_ENTRY(proc) p_pglist;      /* List of processes in pgrp. */
 131        struct  proc *p_pptr;           /* Pointer to parent process. */
 132        LIST_ENTRY(proc) p_sibling;     /* List of sibling processes. */
 133        LIST_HEAD(, proc) p_children;   /* Pointer to list of children. */
 134
 135/* The following fields are all zeroed upon creation in fork. */
 136#define p_startzero     p_oppid
 137
 138        pid_t   p_oppid;         /* Save parent pid during ptrace. XXX */
 139        int     p_dupfd;         /* Sideways return value from fdopen. XXX */
 140
 141        /* scheduling */
 142        u_int   p_estcpu;        /* Time averaged value of p_cpticks. */
 143        int     p_cpticks;       /* Ticks of cpu time. */
 144        fixpt_t p_pctcpu;        /* %cpu for this process during p_swtime */
 145        void    *p_wchan;        /* Sleep address. */
 146        char    *p_wmesg;        /* Reason for sleep. */
 147        u_int   p_swtime;        /* DEPRECATED (Time swapped in or out.) */
 148#define p_argslen p_swtime       /* Length of process arguments. */
 149        u_int   p_slptime;       /* Time since last blocked. */
 150
 151        struct  itimerval p_realtimer;  /* Alarm timer. */
 152        struct  timeval p_rtime;        /* Real time. */
 153        u_quad_t p_uticks;              /* Statclock hits in user mode. */
 154        u_quad_t p_sticks;              /* Statclock hits in system mode. */
 155        u_quad_t p_iticks;              /* Statclock hits processing intr. */
 156
 157        int     p_traceflag;            /* Kernel trace points. */
 158        struct  vnode *p_tracep;        /* Trace to vnode. */
 159
 160        sigset_t p_siglist;             /* DEPRECATED. */
 161
 162        struct  vnode *p_textvp;        /* Vnode of executable. */
 163
 164/* End area that is zeroed on creation. */
 165#define p_endzero       p_hash.le_next
 166
 167        /*
 168         * Not copied, not zero'ed.
 169         * Belongs after p_pid, but here to avoid shifting proc elements.
 170         */
 171        LIST_ENTRY(proc) p_hash;        /* Hash chain. */
 172        TAILQ_HEAD( ,eventqelt) p_evlist;
 173
 174/* The following fields are all copied upon creation in fork. */
 175#define p_startcopy     p_sigmask
 176
 177        sigset_t p_sigmask;             /* DEPRECATED */
 178        sigset_t p_sigignore;   /* Signals being ignored. */
 179        sigset_t p_sigcatch;    /* Signals being caught by user. */
 180
 181        u_char  p_priority;     /* Process priority. */
 182        u_char  p_usrpri;       /* User-priority based on p_cpu and p_nice. */
 183        char    p_nice;         /* Process "nice" value. */
 184        char    p_comm[MAXCOMLEN+1];
 185
 186        struct  pgrp *p_pgrp;   /* Pointer to process group. */
 187
 188/* End area that is copied on creation. */
 189#define p_endcopy       p_xstat
 190        
 191        u_short p_xstat;        /* Exit status for wait; also stop signal. */
 192        u_short p_acflag;       /* Accounting flags. */
 193        struct  rusage *p_ru;   /* Exit information. XXX */
 194
 195        int     p_debugger;     /* 1: can exec set-bit programs if suser */
 196
 197        void    *task;                  /* corresponding task */
 198        void    *sigwait_thread;        /* 'thread' holding sigwait */
 199        char    signal_lock[72];
 200        boolean_t        sigwait;       /* indication to suspend */
 201        void    *exit_thread;           /* Which thread is exiting? */
 202        user_addr_t user_stack;         /* where user stack was allocated */
 203        void * exitarg;                 /* exit arg for proc terminate */
 204        void * vm_shm;                  /* for sysV shared memory */
 205        int  p_argc;                    /* saved argc for sysctl_procargs() */
 206        int             p_vforkcnt;             /* number of outstanding vforks */
 207    void *  p_vforkact;     /* activation running this vfork proc */
 208        TAILQ_HEAD( , uthread) p_uthlist; /* List of uthreads  */
 209        /* Following fields are info from SIGCHLD */
 210        pid_t   si_pid;
 211        u_short si_status;
 212        u_short si_code;
 213        uid_t   si_uid;
 214        TAILQ_HEAD( , aio_workq_entry ) aio_activeq; /* active async IO requests */
 215        int             aio_active_count;       /* entries on aio_activeq */
 216        TAILQ_HEAD( , aio_workq_entry ) aio_doneq;       /* completed async IO requests */
 217        int             aio_done_count;         /* entries on aio_doneq */
 218
 219        struct klist p_klist;  /* knote list */
 220        lck_mtx_t       p_mlock;        /* proc lock to protect evques */
 221        lck_mtx_t       p_fdmlock;      /* proc lock to protect evques */
 222        unsigned int p_fdlock_pc[4];
 223        unsigned int p_fdunlock_pc[4];
 224        int             p_fpdrainwait;
 225        unsigned int            p_lflag;                /* local flags */
 226        unsigned int            p_ladvflag;             /* local adv flags*/
 227        unsigned int            p_internalref;  /* temp refcount field */
 228#if DIAGNOSTIC
 229#if SIGNAL_DEBUG
 230        unsigned int lockpc[8];
 231        unsigned int unlockpc[8];
 232#endif /* SIGNAL_DEBUG */
 233#endif /* DIAGNOSTIC */
 234};
 235
 236
 237/* local flags */
 238#define P_LDELAYTERM            0x1     /* */
 239#define P_LNOZOMB               0x2     /* */
 240#define P_LLOW_PRI_IO           0x4
 241#define P_LPEXIT                0x8
 242#define P_LBACKGROUND_IO        0x10
 243#define P_LWAITING              0x20
 244#define P_LREFDRAIN             0x40
 245#define P_LREFDRAINWAIT         0x80
 246#define P_LREFDEAD              0x100
 247
 248/* advisory flags in the proc */
 249#define P_LADVLOCK              0x01
 250
 251// LP64todo - should this move?
 252/* LP64 version of extern_proc.  all pointers 
 253 * grow when we're dealing with a 64-bit process.
 254 * WARNING - keep in sync with extern_proc
 255 * but use native alignment of 64-bit process.
 256 */
 257
 258#ifdef KERNEL
 259#include <sys/time.h>   /* user_timeval, user_itimerval */
 260
 261#if __DARWIN_ALIGN_NATURAL
 262#pragma options align=natural
 263#endif
 264
 265struct user_extern_proc {
 266        union {
 267                struct {
 268                        user_addr_t __p_forw;   /* Doubly-linked run/sleep queue. */
 269                        user_addr_t __p_back;
 270                } p_st1;
 271                struct user_timeval __p_starttime;      /* process start time */
 272        } p_un;
 273        user_addr_t     p_vmspace;      /* Address space. */
 274        user_addr_t             p_sigacts;      /* Signal actions, state (PROC ONLY). */
 275        int             p_flag;                 /* P_* flags. */
 276        char    p_stat;                 /* S* process status. */
 277        pid_t   p_pid;                  /* Process identifier. */
 278        pid_t   p_oppid;                /* Save parent pid during ptrace. XXX */
 279        int             p_dupfd;                /* Sideways return value from fdopen. XXX */
 280        /* Mach related  */
 281        user_addr_t user_stack; /* where user stack was allocated */
 282        user_addr_t exit_thread;  /* XXX Which thread is exiting? */
 283        int             p_debugger;             /* allow to debug */
 284        boolean_t       sigwait;        /* indication to suspend */
 285        /* scheduling */
 286        u_int   p_estcpu;        /* Time averaged value of p_cpticks. */
 287        int             p_cpticks;       /* Ticks of cpu time. */
 288        fixpt_t p_pctcpu;        /* %cpu for this process during p_swtime */
 289        user_addr_t     p_wchan;         /* Sleep address. */
 290        user_addr_t     p_wmesg;         /* Reason for sleep. */
 291        u_int   p_swtime;        /* Time swapped in or out. */
 292        u_int   p_slptime;       /* Time since last blocked. */
 293        struct  user_itimerval p_realtimer;     /* Alarm timer. */
 294        struct  user_timeval p_rtime;   /* Real time. */
 295        u_quad_t p_uticks;              /* Statclock hits in user mode. */
 296        u_quad_t p_sticks;              /* Statclock hits in system mode. */
 297        u_quad_t p_iticks;              /* Statclock hits processing intr. */
 298        int             p_traceflag;            /* Kernel trace points. */
 299        user_addr_t     p_tracep;       /* Trace to vnode. */
 300        int             p_siglist;              /* DEPRECATED */
 301        user_addr_t     p_textvp;       /* Vnode of executable. */
 302        int             p_holdcnt;              /* If non-zero, don't swap. */
 303        sigset_t p_sigmask;     /* DEPRECATED. */
 304        sigset_t p_sigignore;   /* Signals being ignored. */
 305        sigset_t p_sigcatch;    /* Signals being caught by user. */
 306        u_char  p_priority;     /* Process priority. */
 307        u_char  p_usrpri;       /* User-priority based on p_cpu and p_nice. */
 308        char    p_nice;         /* Process "nice" value. */
 309        char    p_comm[MAXCOMLEN+1];
 310        user_addr_t     p_pgrp; /* Pointer to process group. */
 311        user_addr_t     p_addr; /* Kernel virtual addr of u-area (PROC ONLY). */
 312        u_short p_xstat;        /* Exit status for wait; also stop signal. */
 313        u_short p_acflag;       /* Accounting flags. */
 314        user_addr_t     p_ru;   /* Exit information. XXX */
 315};
 316
 317#if __DARWIN_ALIGN_NATURAL
 318#pragma options align=reset
 319#endif
 320#endif  /* KERNEL */
 321
 322/*
 323 * We use process IDs <= PID_MAX; PID_MAX + 1 must also fit in a pid_t,
 324 * as it is used to represent "no process group".
 325 */
 326extern int nprocs, maxproc;             /* Current and max number of procs. */
 327__private_extern__ int hard_maxproc;    /* hard limit */
 328
 329#define PID_MAX         30000
 330#define NO_PID          30001
 331
 332#define SESS_LEADER(p)  ((p)->p_session->s_leader == (p))
 333#define SESSHOLD(s)     ((s)->s_count++)
 334#define SESSRELE(s)     sessrele(s)
 335
 336#define PIDHASH(pid)    (&pidhashtbl[(pid) & pidhash])
 337extern LIST_HEAD(pidhashhead, proc) *pidhashtbl;
 338extern u_long pidhash;
 339
 340#define PGRPHASH(pgid)  (&pgrphashtbl[(pgid) & pgrphash])
 341extern LIST_HEAD(pgrphashhead, pgrp) *pgrphashtbl;
 342extern u_long pgrphash;
 343extern lck_grp_t * proc_lck_grp;
 344extern lck_grp_attr_t * proc_lck_grp_attr;
 345extern lck_attr_t * proc_lck_attr;
 346
 347LIST_HEAD(proclist, proc);
 348extern struct proclist allproc;         /* List of all processes. */
 349extern struct proclist zombproc;        /* List of zombie processes. */
 350extern struct proc *initproc;
 351extern void     pgdelete(struct pgrp *pgrp);
 352extern void     sessrele(struct session *sess);
 353extern void     procinit(void);
 354extern void proc_lock(struct proc *);
 355extern void proc_unlock(struct proc *);
 356extern void proc_fdlock(struct proc *);
 357extern void proc_fdunlock(struct proc *);
 358__private_extern__ char *proc_core_name(const char *name, uid_t uid, pid_t pid);
 359extern int isinferior(struct proc *, struct proc *);
 360extern struct   proc *pfind(pid_t);     /* Find process by id. */
 361__private_extern__ struct proc *pzfind(pid_t);  /* Find zombie by id. */
 362extern struct   pgrp *pgfind(pid_t);    /* Find process group by id. */
 363
 364extern int      chgproccnt(uid_t uid, int diff);
 365extern int      enterpgrp(struct proc *p, pid_t pgid, int mksess);
 366extern void     fixjobc(struct proc *p, struct pgrp *pgrp, int entering);
 367extern int      inferior(struct proc *p);
 368extern int      leavepgrp(struct proc *p);
 369extern void     resetpriority(struct proc *);
 370extern void     setrunnable(struct proc *);
 371extern void     setrunqueue(struct proc *);
 372extern int      sleep(void *chan, int pri);
 373extern int      tsleep0(void *chan, int pri, const char *wmesg, int timo, int (*continuation)(int));
 374extern int      tsleep1(void *chan, int pri, const char *wmesg, u_int64_t abstime, int (*continuation)(int));
 375extern int      msleep0(void *chan, lck_mtx_t *mtx, int pri, const char *wmesg, int timo, int (*continuation)(int));
 376extern void     vfork_return(thread_t th_act, struct proc *p, struct proc *p2, register_t *retval);
 377extern struct proc * proc_findref(pid_t pid);
 378extern void  proc_dropref(struct proc *  p);
 379extern struct proc * proc_refinternal(proc_t  p, int funneled);
 380extern void  proc_dropinternal(struct proc *  p, int funneled);
 381
 382#endif  /* !_SYS_PROC_INTERNAL_H_ */
 383
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.