From 1a3c0944bfffe600ad0a09d3244497213f11f619 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sun, 19 Mar 1995 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1995-03-19 --- port/devcons.c | 4 ++++ port/devproc.c | 27 ++++++++++++++++++++++++++- port/portdat.h | 9 +++++---- port/swap.c | 10 +--------- 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/port/devcons.c b/port/devcons.c index 9a876941554b4eb4c6c39de5e9ada9e1846c7f2b..84aa886277eae26f3fe5a1e7f1d32d59ee1115fb 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -216,6 +216,10 @@ echo(Rune r, char *buf, int n) case 'p': procdump(); return; + case 'k': + if(!cpuserver) + killbig(); + break; case 'r': exit(0); break; diff --git a/port/devproc.c b/port/devproc.c index 2348e17b0ff6a2b00ab1ad549e2a6e15330b37a4..5d5574ecc55bc9232ab3445522e4fcafde8e6d66 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -702,11 +702,33 @@ procstopwait(Proc *p, int ctl) error(Eprocdied); } +void +procctlfgrp(Fgrp *f) +{ + int i; + Chan *c; + + lock(f); + f->ref++; + for(i = 0; i < f->maxfd; i++) { + c = f->fd[i]; + if(c != 0) { + f->fd[i] = 0; + unlock(f); + close(c); + lock(f); + } + } + unlock(f); + closefgrp(f); +} + + void procctlreq(Proc *p, char *va, int n) { - char buf[NAMELEN]; int i; + char buf[NAMELEN]; if(n > NAMELEN) n = NAMELEN; @@ -754,6 +776,9 @@ procctlreq(Proc *p, char *va, int n) ready(p); } else + if(strncmp(buf, "closefgrp", 9) == 0) + procctlfgrp(p->fgrp); + else if(strncmp(buf, "pri", 3) == 0){ if(n < 4) error(Ebadctl); diff --git a/port/portdat.h b/port/portdat.h index e6a95bea63752dad41f02f60f591375b641b0f7c..282b3f9d84cb74222d2bd2d5a6dea2b9267180a5 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -297,11 +297,12 @@ struct Swapalloc { Lock; /* Free map lock */ int free; /* currently free swap pages */ - uchar *swmap; /* Base of swap map in memory */ - uchar *alloc; /* Round robin allocator */ - uchar *last; /* Speed swap allocation */ - uchar *top; /* Top of swap map */ + uchar* swmap; /* Base of swap map in memory */ + uchar* alloc; /* Round robin allocator */ + uchar* last; /* Speed swap allocation */ + uchar* top; /* Top of swap map */ Rendez r; /* Pager kproc idle sleep */ + Rendez pause; ulong highwater; /* Pager start threshold */ ulong headroom; /* Space pager frees under highwater */ }swapalloc; diff --git a/port/swap.c b/port/swap.c index 30e51b66f06904d542316c7fe1557044bb9b509b..2f3d5935ac7ad0558f890ecc518bee106c24704c 100644 --- a/port/swap.c +++ b/port/swap.c @@ -97,7 +97,6 @@ void pager(void *junk) { int i; - Image *img; Segment *s; Proc *p, *ep; @@ -120,13 +119,6 @@ loop: if(p->state == Dead || p->kp) continue; - /* don't swap out programs from devroot.c - they - * supply important system services - */ - img = p->seg[TSEG]->image; - if(img && devchar[img->c->type] == '/') - continue; - if(swapimage.c) { for(i = 0; i < NSEG; i++) { if(!needpages(junk)) @@ -161,7 +153,7 @@ loop: /* Emulate the old system if no swap channel */ print("no physical memory\n"); - tsleep(&swapalloc.r, return0, 0, 5000); + tsleep(&swapalloc.pause, return0, 0, 5000); wakeup(&palloc.r); } }