Commit | Line | Data |
---|---|---|
da7c5cc6 | 1 | /* |
b7d51c53 | 2 | * Copyright (c) 1982, 1986, 1989 Regents of the University of California. |
da7c5cc6 KM |
3 | * All rights reserved. The Berkeley software License Agreement |
4 | * specifies the terms and conditions for redistribution. | |
5 | * | |
1c15e888 | 6 | * @(#)proc.h 7.20 (Berkeley) 7/27/90 |
da7c5cc6 | 7 | */ |
5cb51551 | 8 | |
0cc0777f MT |
9 | /* |
10 | * One structure allocated per session. | |
11 | */ | |
12 | struct session { | |
76191717 MT |
13 | int s_count; /* ref cnt; pgrps in session */ |
14 | struct proc *s_leader; /* session leader */ | |
15 | struct vnode *s_ttyvp; /* vnode of controlling terminal */ | |
16 | struct tty *s_ttyp; /* controlling terminal */ | |
0cc0777f MT |
17 | }; |
18 | ||
19 | /* | |
20 | * One structure allocated per process group. | |
21 | */ | |
22 | struct pgrp { | |
23 | struct pgrp *pg_hforw; /* forward link in hash bucket */ | |
24 | struct proc *pg_mem; /* pointer to pgrp members */ | |
25 | struct session *pg_session; /* pointer to session */ | |
26 | pid_t pg_id; /* pgrp id */ | |
644518b1 | 27 | int pg_jobc; /* # procs qualifying pgrp for job control */ |
0cc0777f MT |
28 | }; |
29 | ||
5cb51551 BJ |
30 | /* |
31 | * One structure allocated per active | |
32 | * process. It contains all data needed | |
33 | * about the process while the | |
34 | * process may be swapped out. | |
35 | * Other per process data (user.h) | |
36 | * is swapped with the process. | |
5cb51551 | 37 | */ |
67febcaf | 38 | |
f9094bc4 | 39 | struct proc { |
5cb51551 BJ |
40 | struct proc *p_link; /* linked list of running processes */ |
41 | struct proc *p_rlink; | |
40e2c1d3 SL |
42 | struct proc *p_nxt; /* linked list of allocated proc slots */ |
43 | struct proc **p_prev; /* also zombies, and free proc's */ | |
1c15e888 | 44 | struct pte *p_addr; /* u-area kernel map address */ |
5cb51551 BJ |
45 | char p_usrpri; /* user-priority based on p_cpu and p_nice */ |
46 | char p_pri; /* priority, negative is high */ | |
47 | char p_cpu; /* cpu usage for scheduling */ | |
48 | char p_stat; | |
49 | char p_time; /* resident time for scheduling */ | |
50 | char p_nice; /* nice for cpu usage */ | |
51 | char p_slptime; /* time since last block */ | |
1c15e888 | 52 | u_char p_dupfd; /* sideways return value from fdopen XXX */ |
40dc6933 SL |
53 | int p_sig; /* signals pending to this process */ |
54 | int p_sigmask; /* current signal mask */ | |
55 | int p_sigignore; /* signals being ignored */ | |
56 | int p_sigcatch; /* signals being caught by user */ | |
36c28aee | 57 | int p_flag; |
b7d51c53 MK |
58 | uid_t p_uid; /* effective user id */ |
59 | uid_t p_ruid; /* real user id */ | |
60 | uid_t p_svuid; /* saved effective user id */ | |
61 | gid_t p_rgid; /* real group id */ | |
62 | gid_t p_svgid; /* saved effective group id */ | |
0cc0777f MT |
63 | pid_t p_pid; /* unique process id */ |
64 | pid_t p_ppid; /* process id of parent */ | |
37c6610f | 65 | u_short p_xstat; /* Exit status for wait; also stop signal */ |
b7d51c53 | 66 | struct rusage *p_ru; /* exit information */ |
1c15e888 C |
67 | short p_poip; /* page outs in progress */ |
68 | short p_szpt; /* copy of page table size */ | |
69 | segsz_t p_tsize; /* size of text (clicks) */ | |
70 | segsz_t p_dsize; /* size of data space (clicks) */ | |
71 | segsz_t p_mmsize; /* size of mapmem beyond p_dsize (clicks) */ | |
72 | segsz_t p_ssize; /* copy of stack size (clicks) */ | |
f56a0ff7 KM |
73 | segsz_t p_rssize; /* current resident set size in clicks */ |
74 | segsz_t p_maxrss; /* copy of u.u_limit[MAXRSS] */ | |
75 | segsz_t p_swrss; /* resident set size before last swap */ | |
5cb51551 BJ |
76 | swblk_t p_swaddr; /* disk address of u area when swapped */ |
77 | caddr_t p_wchan; /* event process is awaiting */ | |
1c15e888 C |
78 | struct text *p_textp; /* pointer to text structure */ |
79 | struct pte *p_p0br; /* page table base P0BR */ | |
80 | struct proc *p_xlink; /* linked list of procs sharing same text */ | |
b7d51c53 | 81 | int p_cpticks; /* ticks of cpu time */ |
80b6b780 | 82 | fixpt_t p_pctcpu; /* %cpu for this process during p_time */ |
5cb51551 | 83 | short p_ndx; /* proc index for memall (because of vfork) */ |
644518b1 | 84 | struct proc *p_hash; /* hashed based on p_pid for kill+exit+... */ |
36c28aee | 85 | struct proc *p_pptr; /* pointer to process structure of parent */ |
7a5bb6a6 RE |
86 | struct proc *p_cptr; /* pointer to youngest living child */ |
87 | struct proc *p_osptr; /* pointer to older sibling processes */ | |
88 | struct proc *p_ysptr; /* pointer to younger siblings */ | |
0cc0777f MT |
89 | struct pgrp *p_pgrp; /* pointer to process group */ |
90 | #define p_session p_pgrp->pg_session | |
91 | #define p_pgid p_pgrp->pg_id | |
92 | struct proc *p_pgrpnxt; /* pointer to next process in process group */ | |
af0b24db | 93 | struct itimerval p_realtimer; |
76191717 | 94 | int p_traceflag; /* kernel trace points */ |
5921d41a | 95 | struct vnode *p_tracep;/* trace to vnode */ |
67febcaf MT |
96 | char p_comm[MAXCOMLEN+1]; |
97 | char p_logname[MAXLOGNAME]; | |
98 | char *p_wmesg; | |
04053799 MK |
99 | struct timeval p_utime; /* user time */ |
100 | struct timeval p_stime; /* system time */ | |
22a22bd0 MK |
101 | #if defined(tahoe) |
102 | int p_ckey; /* code cache key */ | |
103 | int p_dkey; /* data cache key */ | |
104 | #endif | |
5cb51551 BJ |
105 | }; |
106 | ||
67febcaf MT |
107 | /* |
108 | * proc ops return arrays of augmented proc structures | |
109 | */ | |
110 | struct kinfo_proc { | |
111 | struct proc kp_proc; /* proc structure */ | |
112 | struct eproc { | |
113 | struct proc *e_paddr; /* address of proc */ | |
114 | struct session *e_sess; /* session pointer */ | |
115 | pid_t e_pgid; /* process group id */ | |
116 | short e_jobc; /* job control counter */ | |
ca869585 | 117 | dev_t e_tdev; /* controlling tty dev */ |
67febcaf MT |
118 | pid_t e_tpgid; /* tty process group id */ |
119 | struct session *e_tsess; /* tty session pointer */ | |
120 | #define WMESGLEN 7 | |
121 | char e_wmesg[WMESGLEN+1]; /* wchan message */ | |
f56a0ff7 | 122 | segsz_t e_xsize; /* text size */ |
67febcaf MT |
123 | short e_xrssize; /* text rss */ |
124 | short e_xccount; /* text references */ | |
125 | short e_xswrss; | |
ca869585 MT |
126 | long e_flag; |
127 | #define EPROC_CTTY 0x01 /* controlling tty vnode active */ | |
128 | #define EPROC_SLEADER 0x02 /* session leader */ | |
129 | long e_spare[7]; | |
67febcaf MT |
130 | } kp_eproc; |
131 | }; | |
132 | ||
5cb51551 | 133 | #ifdef KERNEL |
27ed98f2 MK |
134 | /* |
135 | * We use process IDs <= PID_MAX; | |
136 | * PID_MAX + 1 must also fit in a pid_t | |
137 | * (used to represent "no process group"). | |
138 | */ | |
139 | #define PID_MAX 30000 | |
140 | #define NO_PID 30001 | |
644518b1 MT |
141 | #define PIDHASH(pid) ((pid) & pidhashmask) |
142 | extern int pidhashmask; /* in param.c */ | |
143 | extern struct proc *pidhash[]; /* in param.c */ | |
144 | struct proc *pfind(); /* find process by id */ | |
145 | extern struct pgrp *pgrphash[]; /* in param.c */ | |
146 | struct pgrp *pgfind(); /* find process group by id */ | |
147 | struct proc *proc, *procNPROC; /* the proc table itself */ | |
40e2c1d3 | 148 | struct proc *freeproc, *zombproc, *allproc; |
644518b1 | 149 | /* lists of procs in various states */ |
a0eab615 | 150 | int nproc; |
5cb51551 | 151 | |
5cb51551 BJ |
152 | #define NQS 32 /* 32 run queues */ |
153 | struct prochd { | |
154 | struct proc *ph_link; /* linked list of running processes */ | |
155 | struct proc *ph_rlink; | |
156 | } qs[NQS]; | |
157 | int whichqs; /* bit mask summarizing non-empty qs's */ | |
0cc0777f MT |
158 | |
159 | #define SESS_LEADER(p) ((p)->p_session->s_leader == (p)) | |
24c43af0 MT |
160 | #define SESSHOLD(s) ((s)->s_count++) |
161 | #define SESSRELE(s) { \ | |
162 | if (--(s)->s_count == 0) \ | |
163 | FREE(s, M_SESSION); \ | |
164 | } | |
5cb51551 BJ |
165 | #endif |
166 | ||
167 | /* stat codes */ | |
168 | #define SSLEEP 1 /* awaiting an event */ | |
169 | #define SWAIT 2 /* (abandoned state) */ | |
170 | #define SRUN 3 /* running */ | |
171 | #define SIDL 4 /* intermediate state in process creation */ | |
172 | #define SZOMB 5 /* intermediate state in process termination */ | |
173 | #define SSTOP 6 /* process being traced */ | |
174 | ||
175 | /* flag codes */ | |
7a5bb6a6 RE |
176 | #define SLOAD 0x0000001 /* in core */ |
177 | #define SSYS 0x0000002 /* swapper or pager process */ | |
178 | #define SLOCK 0x0000004 /* process being swapped out */ | |
179 | #define SSWAP 0x0000008 /* save area flag */ | |
180 | #define STRC 0x0000010 /* process is being traced */ | |
181 | #define SWTED 0x0000020 /* another tracing flag */ | |
04053799 | 182 | #define SSINTR 0x0000040 /* sleep is interruptible */ |
7a5bb6a6 RE |
183 | #define SPAGE 0x0000080 /* process in page wait state */ |
184 | #define SKEEP 0x0000100 /* another flag to prevent swap out */ | |
40dc6933 | 185 | #define SOMASK 0x0000200 /* restore old mask after taking signal */ |
7a5bb6a6 | 186 | #define SWEXIT 0x0000400 /* working on exiting */ |
b7d51c53 | 187 | #define SPHYSIO 0x0000800 /* doing physical i/o */ |
7a5bb6a6 RE |
188 | #define SVFORK 0x0001000 /* process resulted from vfork() */ |
189 | #define SVFDONE 0x0002000 /* another vfork flag */ | |
190 | #define SNOVM 0x0004000 /* no vm, parent in a vfork() */ | |
5921d41a | 191 | #define SPAGV 0x0008000 /* init data space on demand, from vnode */ |
7a5bb6a6 RE |
192 | #define SSEQL 0x0010000 /* user warned of sequential vm behavior */ |
193 | #define SUANOM 0x0020000 /* user warned of random vm behavior */ | |
194 | #define STIMO 0x0040000 /* timing out during sleep */ | |
b7d51c53 | 195 | #define SNOCLDSTOP 0x0080000 /* no SIGCHLD when children stop */ |
76191717 | 196 | #define SCTTY 0x0100000 /* has a controlling terminal */ |
ded22f45 | 197 | #define SOWEUPC 0x0200000 /* owe process an addupc() call at next ast */ |
7a5bb6a6 | 198 | #define SSEL 0x0400000 /* selecting; wakeup/waiting danger */ |
67febcaf | 199 | #define SEXEC 0x0800000 /* process called exec */ |
fa06582e KM |
200 | #define SHPUX 0x1000000 /* HP-UX process (HPUXCOMPAT) */ |
201 | #define SULOCK 0x2000000 /* locked in core after swap error XXX */ | |
202 | #define SPTECHG 0x4000000 /* pte's for process have changed XXX */ |