Files
retrobsd/sys/include/proc.h
Serge Vakulenko d1f1e614f0 Kernel sources reformated with 4 space indent, no tabs.
Unused file include/trace.h deleted.
2015-06-23 19:00:24 -07:00

308 lines
8.8 KiB
C

/*
* Copyright (c) 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifndef _SYS_PROC_H_
#define _SYS_PROC_H_
/*
* One structure allocated per active
* process. It contains all data needed
* about the process while the
* process may be swapped out.
* Other per process data (user.h)
* is swapped with the process.
*/
struct proc {
struct proc *p_nxt; /* linked list of allocated proc slots */
struct proc **p_prev; /* also zombies, and free proc's */
struct proc *p_pptr; /* pointer to process structure of parent */
short p_flag;
short p_uid; /* user id, used to direct tty signals */
short p_pid; /* unique process id */
short p_ppid; /* process id of parent */
long p_sig; /* signals pending to this process */
int p_stat;
/*
* Union to overwrite information no longer needed by ZOMBIED
* process with exit information for the parent process. The
* two structures have been carefully set up to use the same
* amount of memory. Must be very careful that any values in
* p_alive are not used for zombies (zombproc).
*/
union {
struct {
char P_pri; /* priority, negative is high */
char P_cpu; /* cpu usage for scheduling */
char P_time; /* resident time for scheduling */
char P_nice; /* nice for cpu usage */
char P_slptime; /* secs sleeping */
char P_ptracesig; /* used between parent & traced child */
struct proc *P_hash; /* hashed based on p_pid */
long P_sigmask; /* current signal mask */
long P_sigignore; /* signals being ignored */
long P_sigcatch; /* signals being caught by user */
short P_pgrp; /* name of process group leader */
struct proc *P_link; /* linked list of running processes */
size_t P_addr; /* address of u. area */
size_t P_daddr; /* address of data area */
size_t P_saddr; /* address of stack area */
size_t P_dsize; /* size of data area (clicks) */
size_t P_ssize; /* size of stack segment (clicks) */
caddr_t P_wchan; /* event process is awaiting */
struct k_itimerval P_realtimer;
} p_alive;
struct {
int P_xstat; /* exit status for wait */
struct k_rusage P_ru; /* exit information */
} p_dead;
} p_un;
};
#define p_pri p_un.p_alive.P_pri
#define p_cpu p_un.p_alive.P_cpu
#define p_time p_un.p_alive.P_time
#define p_nice p_un.p_alive.P_nice
#define p_slptime p_un.p_alive.P_slptime
#define p_hash p_un.p_alive.P_hash
#define p_ptracesig p_un.p_alive.P_ptracesig
#define p_sigmask p_un.p_alive.P_sigmask
#define p_sigignore p_un.p_alive.P_sigignore
#define p_sigcatch p_un.p_alive.P_sigcatch
#define p_pgrp p_un.p_alive.P_pgrp
#define p_link p_un.p_alive.P_link
#define p_addr p_un.p_alive.P_addr
#define p_daddr p_un.p_alive.P_daddr
#define p_saddr p_un.p_alive.P_saddr
#define p_dsize p_un.p_alive.P_dsize
#define p_ssize p_un.p_alive.P_ssize
#define p_wchan p_un.p_alive.P_wchan
#define p_realtimer p_un.p_alive.P_realtimer
#define p_clktim p_realtimer.it_value
#define p_xstat p_un.p_dead.P_xstat
#define p_ru p_un.p_dead.P_ru
#define PIDHSZ 16
#define PIDHASH(pid) ((pid) & (PIDHSZ - 1))
/* arguments to swapout: */
#define X_OLDSIZE (-1) /* the old size is the same as current */
#define X_DONTFREE 0 /* save core image (for parent in newproc) */
#define X_FREECORE 1 /* free core space after swap */
#ifdef KERNEL
struct proc *pidhash [PIDHSZ];
extern struct proc proc[]; /* the proc table itself */
struct proc *freeproc, *zombproc, *allproc, *qs;
/* lists of procs in various states */
extern int nproc;
/*
* Init the process queues.
*/
void pqinit (void);
/*
* Find a process by pid.
*/
struct proc *pfind (int pid);
/*
* Set user priority.
*/
int setpri (struct proc *pp);
/*
* Send the specified signal to the specified process.
*/
void psignal (struct proc *p, int sig);
/*
* Send the specified signal to a process group.
*/
void gsignal (int pgrp, int sig);
/*
* Take the action for the specified signal.
*/
void postsig (int sig);
/*
* If the current process has received a signal, return the signal number.
*/
int issignal (struct proc *p);
/*
* Initialize signal state for process 0;
* set to ignore signals that are ignored by default.
*/
void siginit (struct proc *p);
/*
* Remove a process from its wait queue
*/
void unsleep (struct proc *p);
void selwakeup (struct proc *p, long coll);
/*
* Set the process running;
* arrange for it to be swapped in if necessary.
*/
void setrun (struct proc *p);
/*
* Reschedule the CPU.
*/
void swtch (void);
/*
* Recompute process priorities, once a second.
*/
void schedcpu (caddr_t arg);
/*
* The main loop of the scheduling process. No return.
*/
void sched (void);
/*
* Create a new process -- the internal version of system call fork.
*/
int newproc (int isvfork);
/*
* Notify parent that vfork child is finished with parent's data.
*/
void endvfork (void);
/*
* Put the process into the run queue.
*/
void setrq (struct proc *p);
/*
* Remove runnable job from run queue.
*/
void remrq (struct proc *p);
/*
* Exit the process.
*/
void exit (int rv);
/*
* Swap I/O.
*/
void swap (size_t blkno, size_t coreaddr, int count, int rdflg);
/*
* Kill a process when ran out of swap space.
*/
void swkill (struct proc *p, char *name);
/*
* Give up the processor till a wakeup occurs on chan, at which time the
* process enters the scheduling queue at priority pri.
*/
void sleep (caddr_t chan, int pri);
/*
* Give up the processor till a wakeup occurs on ident or a timeout expires.
* Then the process enters the scheduling queue at given priority.
*/
int tsleep (caddr_t ident, int priority, u_int timo);
/*
* Arrange that given function is called in t/hz seconds.
*/
void timeout (void (*fun) (caddr_t), caddr_t arg, int t);
/*
* Remove a function timeout call from the callout structure.
*/
void untimeout (void (*fun) (caddr_t), caddr_t arg);
/*
* Handler for hardware clock interrupt.
*/
void hardclock (caddr_t pc, int ps);
/*
* Swap out a process.
*/
void swapout (struct proc *p, int freecore, u_int odata, u_int ostack);
/*
* Swap a process in.
*/
void swapin (struct proc *p);
/*
* Is p an inferior of the current process?
*/
int inferior (struct proc *p);
/*
* Test if the current user is the super user.
*/
int suser (void);
/*
* Load from user area (probably swapped out): real uid,
* controlling terminal device, and controlling terminal pointer.
*/
struct tty;
void fill_from_u (struct proc *p, uid_t *rup, struct tty **ttp, dev_t *tdp);
/*
* Grow the stack to include the SP.
*/
int grow (unsigned sp);
/*
* Kill current process with the specified signal in an uncatchable manner.
*/
void fatalsig (int signum);
/*
* Parent controlled tracing.
*/
int procxmt (void);
void execsigs(register struct proc *p);
#endif /* KERMEL */
/* stat codes */
#define SSLEEP 1 /* awaiting an event */
#define SWAIT 2 /* (abandoned state) */
#define SRUN 3 /* running */
#define SIDL 4 /* intermediate state in process creation */
#define SZOMB 5 /* intermediate state in process termination */
#define SSTOP 6 /* process being traced */
/* flag codes */
#define SLOAD 0x0001 /* in core */
#define SSYS 0x0002 /* swapper or pager process */
#define SLOCK 0x0004 /* process being swapped out */
#define SSWAP 0x0008 /* save area flag */
#define P_TRACED 0x0010 /* process is being traced */
#define P_WAITED 0x0020 /* another tracing flag */
#define P_SINTR 0x0080 /* sleeping interruptibly */
#define SVFORK 0x0100 /* process resulted from vfork() */
#define SVFPRNT 0x0200 /* parent in vfork, waiting for child */
#define SVFDONE 0x0400 /* parent has released child in vfork */
/* 0x0800 unused */
#define P_TIMEOUT 0x1000 /* tsleep timeout expired */
#define P_NOCLDSTOP 0x2000 /* no SIGCHLD signal to parent */
#define P_SELECT 0x4000 /* selecting; wakeup/waiting danger */
/* 0x8000 unused */
#define S_DATA 0 /* specified segment */
#define S_STACK 1
#endif /* !_SYS_PROC_H_ */