Coherent4.2.10/include/sys/proc.h
/* (-lgl
* Coherent 386 release 4.2
* Copyright (c) 1982, 1993 by Mark Williams Company.
* All rights reserved. May not be copied without permission.
* For copying permission and licensing info, write licensing@mwc.com
-lgl) */
#ifndef __SYS_PROC_H__
#define __SYS_PROC_H__
/*
* Process information. PROC structs, unlike UPROC structs, are visible
* whether the process is active or not.
*/
#include <common/feature.h>
#include <common/__pid.h>
#include <common/__cred.h>
#include <common/_uid.h>
#include <kernel/timeout.h>
#include <sys/inline.h>
#include <sys/poll.h>
#include <sys/seg.h>
#include <sys/ksynch.h>
#include <sys/signal.h>
#if ! _KERNEL
# error You must be compiling the kernel to use this header
#endif
/*
* In core information about a process.
* The `p_lforw' and `p_lback' entries must not move as they must be
* in the same place as in the `plink' structure.
*/
#define __PROC_VERSION 0x0103
typedef struct proc PROC;
struct proc {
PROC * p_lforw; /* Working forward pointer */
PROC * p_lback; /* Working backward pointer */
PROC * p_nforw; /* Next forward pointer */
PROC * p_nback; /* Next backward pointer */
struct __mcon * p_sysconp; /* System context save */
struct sr p_segl [NUSEG]; /* User segment descriptions */
__pid_t p_pid; /* Process id */
__pid_t p_ppid; /* Process id of parent */
__pid_t p_group; /* Process group ID */
__pid_t p_sid; /* Session ID */
unsigned p_state; /* Scheduling state */
unsigned p_flags; /* Flags */
__cred_t * p_credp; /* user credentials */
char * p_sleep; /* reason for sleeping */
__sigset_t p_pending_signals;
__sigset_t p_ignored_signals;
__sigset_t p_signal_mask;
__sigset_t p_queued_signals;
__sigmiscfl_t p_sigflags; /* General signal flags */
char *p_event; /* Wakeup event channel */
unsigned p_alarm; /* Timer for alarms */
o_dev_t p_ttdev; /* Controlling terminal */
unsigned p_nice; /* Nice value */
int p_schedPri; /* will index into table in sys/ts.h */
long p_utime; /* User time (HZ) */
long p_stime; /* System time */
long p_cutime; /* Sum of childs user time */
long p_cstime; /* Sum of childs system time */
int p_exit; /* Exit status */
event_t *p_polls; /* Enabled polls */
TIM p_polltim; /* Poll timer */
TIM p_alrmtim; /* Alarm timer */
char p_comm [10]; /* Command name */
struct rlock * p_prl; /* Pending record lock */
struct sr p_shmsr[NSHMSEG]; /* Shared Memory Segments */
struct sem_undo * p_semu; /* Sem. undo link list */
struct {
char _space [32];
} p_ddi_space;
long p_foodstamp; /* Starvation inhibitor */
};
/*
* Status of process (p_state).
*/
#define PSSLEEP 1 /* Sleeping, signals do not interrupt */
#define PSRUN 2 /* Running */
#define PSDEAD 3 /* Exiting */
#define PSSLSIG 4 /* Sleeping, signals interrupt */
#define ASLEEP(pp) (pp->p_state == PSSLEEP || pp->p_state == PSSLSIG)
/*
* Flags (p_flags).
*/
#define PFCORE 0x0001 /* Process is in core */
#define PFLOCK 0x0002 /* Process is locked in core */
#define PFSWIO 0x0004 /* Swap I/O in progress */
#define PFSWAP 0x0008 /* Process is swapped out */
#define PFWAIT 0x0010 /* Process is stopped (not waited) */
#define PFSTOP 0x0020 /* Process is stopped (waited on) */
#define PFTRAC 0x0040 /* Process is being traced */
#define PFKERN 0x0080 /* Kernel process */
#define PFAUXM 0x0100 /* Auxiliary segments in memory */
#define PFDISP 0x0200 /* Dispatch at earliest convenience */
#define PFNDMP 0x0400 /* Command mode forbids dump */
#define PFEXEC 0x0800 /* process has done exec () */
/*
* Values of nice.
*/
#define MINNICE 0 /* Minimum value of nice */
#define DEFNICE 20 /* Default nice value */
#define MAXNICE 40 /* Maximum nice value */
#define SELF cprocp
/*
* Global variables.
*/
extern int quantum; /* Current quantum */
extern int disflag; /* Dispatch soon as possible */
extern PROC procq; /* Process queue */
extern PROC *eprocp; /* Init process struct */
extern PROC *cprocp; /* Current process */
/*
* Note that COHERENT so far has used an idle process; this is unsuitable for
* future kernel development, so the notion of whether the system is in fact
* idle should be checked through the following macros.
*/
#if 1
#define _USE_IDLE_PROCESS 1
#define __IS_SYSTEM_IDLE() (SELF == iprocp)
extern PROC *iprocp; /* Idle process struct */
#else
#define __IS_SYSTEM_IDLE() (SELF == NULL)
#endif
/*
* In the case of the global below, introduce some new macros so as not to
* export it everywhere.
*/
extern __DUMB_GATE __pnxgate; /* Gate for p_next */
#define __GLOBAL_LOCK_PROCESS_TABLE(where) \
(__GATE_LOCK (__pnxgate, "lock : pnxgate " where))
#define __GLOBAL_UNLOCK_PROCESS_TABLE() \
(__GATE_UNLOCK (__pnxgate))
/*
* Stubs for the multiprocessor locking functions; it isn't worth doing these
* right until the process-table iterators have been finalized.
*/
#define PROC_STATE_LOCK(proc) splhi ()
#define PROC_STATE_UNLOCK(proc,pl) splx (pl)
#define PROC_ASSERT_LOCKED(proc) ((void) 0)
/*
* To underscore the fact that attempting to access the process table
* ties you to one release of the COHERENT system and one only, we put the
* following into any object file that touches this header.
*/
#define __PROC_V_SYM(v) __CONCAT (__proc_v_, v)
extern char __PROC_V_SYM (__PROC_VERSION) [];
static char * __need_proc = __PROC_V_SYM (__PROC_VERSION);
#endif /* ! defined (__SYS_PROC_H__) */