1 #include "all.h" 2 #include "io.h" 3 4 Mconf mconf; 5 6 static void 7 mconfinit(void) 8 { 9 int nf, pgsize = 0; 10 ulong size, userpgs = 0, userused = 0; 11 char *ln, *sl; 12 char *fields[2]; 13 Biobuf *bp; 14 Mbank *mbp; 15 16 size = 64*MB; 17 bp = Bopen("#c/swap", OREAD); 18 if (bp != nil) { 19 while ((ln = Brdline(bp, '\n')) != nil) { 20 ln[Blinelen(bp)-1] = '\0'; 21 nf = tokenize(ln, fields, nelem(fields)); 22 if (nf != 2) 23 continue; 24 if (strcmp(fields[1], "pagesize") == 0) 25 pgsize = atoi(fields[0]); 26 else if (strcmp(fields[1], "user") == 0) { 27 sl = strchr(fields[0], '/'); 28 if (sl == nil) 29 continue; 30 userpgs = atol(sl+1); 31 userused = atol(fields[0]); 32 } 33 } 34 Bterm(bp); 35 if (pgsize > 0 && userpgs > 0) 36 size = (((userpgs - userused)*3LL)/4)*pgsize; 37 } 38 mconf.memsize = size; 39 mbp = mconf.bank; 40 mbp->base = 0x10000000; /* fake addresses */ 41 mbp->limit = mbp->base + size; 42 mbp++; 43 44 mconf.nbank = mbp - mconf.bank; 45 } 46 47 ulong 48 meminit(void) 49 { 50 conf.nmach = 1; 51 mconfinit(); 52 return mconf.memsize; 53 } 54 55 /* 56 * based on libthread's threadsetname, but drags in less library code. 57 * actually just sets the arguments displayed. 58 */ 59 void 60 procsetname(char *fmt, ...) 61 { 62 int fd; 63 char *cmdname; 64 char buf[128]; 65 va_list arg; 66 67 va_start(arg, fmt); 68 cmdname = vsmprint(fmt, arg); 69 va_end(arg); 70 if (cmdname == nil) 71 return; 72 snprint(buf, sizeof buf, "#p/%d/args", getpid()); 73 if((fd = open(buf, OWRITE)) >= 0){ 74 write(fd, cmdname, strlen(cmdname)+1); 75 close(fd); 76 } 77 free(cmdname); 78 } 79 80 void 81 newproc(void (*f)(void *), void *arg, char *text) 82 { 83 int kid = rfork(RFPROC|RFMEM|RFNOWAIT); 84 85 if (kid < 0) 86 sysfatal("can't fork: %r"); 87 if (kid == 0) { 88 procsetname("%s", text); 89 (*f)(arg); 90 exits("child returned"); 91 } 92 } 93