From 74c43b6ec832dc947037eb61661c82ea91815b31 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 23 Nov 1993 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1993-11-23 --- port/portfns.h | 1 + port/proc.c | 30 ++++++++++++++++++++++++++++++ port/swap.c | 2 ++ 3 files changed, 33 insertions(+) diff --git a/port/portfns.h b/port/portfns.h index beea71666ee8463da8d3a8744190c14c8b2830a7..d8abdce25c71dba877558290b6594a58d1d12e71 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -107,6 +107,7 @@ void kbdrepeat(int); long keyread(char*, int, long); long keywrite(char*, int); void kickpager(void); +void killbig(void); int kprint(char*, ...); void kproc(char*, void(*)(void*), void*); void kprocchild(Proc*, void (*)(void*), void*); diff --git a/port/proc.c b/port/proc.c index 5938e8902c6185546b4b5f268d26270555ed6360..26d3820923a3850e52221418fe4e7c999bee4e4d 100644 --- a/port/proc.c +++ b/port/proc.c @@ -798,3 +798,33 @@ exhausted(char *resource) sprint(buf, "no free %s", resource); error(buf); } + +void +killbig(void) +{ + int i; + Segment *s; + ulong l, max; + Proc *p, *ep, *kp; + + max = 0; + kp = 0; + ep = procalloc.arena+conf.nproc; + for(p = procalloc.arena; p < ep; p++) { + if(p->state == Dead || p->kp) + continue; + l = 0; + for(i=1; iseg[i]; + if(s) + l += s->top - s->base; + } + if(l > max) { + kp = p; + max = l; + } + } + print("%d: %s killed because no swap configured", kp->pid, kp->text); + kp->procctl = Proc_exitme; + postnote(kp, 1, "killed: proc too big", NExit); +} diff --git a/port/swap.c b/port/swap.c index 3dd2b669d7fc2739acb116fa850167d8f04e3848..d235a1a0d09dd5cdebb805ab15bd071e5db42da1 100644 --- a/port/swap.c +++ b/port/swap.c @@ -154,6 +154,8 @@ loop: else { if(!cpuserver) freebroken(); /* can use the memory */ + else + killbig(); /* Emulate the old system if no swap channel */ print("no physical memory\n");