Browse Source

Plan 9 from Bell Labs 2004-09-01

David du Colombier 19 years ago
parent
commit
31d3b73ece

+ 5 - 5
dist/replica/_plan9.db

@@ -3378,7 +3378,7 @@ sys/include/ape/sys/ioctl.h - 664 sys sys 969500381 341
 sys/include/ape/sys/limits.h - 664 sys sys 944948759 494
 sys/include/ape/sys/param.h - 664 sys sys 944948759 243
 sys/include/ape/sys/pty.h - 664 sys sys 944948759 274
-sys/include/ape/sys/resource.h - 664 sys sys 944948759 205
+sys/include/ape/sys/resource.h - 664 sys sys 1093980308 932
 sys/include/ape/sys/select.h - 664 sys sys 1014927751 779
 sys/include/ape/sys/socket.h - 664 sys sys 984696196 5783
 sys/include/ape/sys/stat.h - 664 sys sys 1068478179 2177
@@ -3388,7 +3388,7 @@ sys/include/ape/sys/types.h - 664 sys sys 1068478175 993
 sys/include/ape/sys/uio.h - 664 sys sys 944948759 636
 sys/include/ape/sys/un.h - 664 sys sys 944948759 1011
 sys/include/ape/sys/utsname.h - 664 sys sys 944948759 279
-sys/include/ape/sys/wait.h - 664 sys sys 1087406385 610
+sys/include/ape/sys/wait.h - 664 sys sys 1093980308 672
 sys/include/ape/termios.h - 664 sys sys 944948760 2745
 sys/include/ape/time.h - 664 sys sys 944948760 1016
 sys/include/ape/u.h - 664 sys sys 1038237538 399
@@ -6142,7 +6142,7 @@ sys/src/ape/lib/ap/plan9/umask.c - 664 sys sys 1014921985 182
 sys/src/ape/lib/ap/plan9/uname.c - 664 sys sys 1014921985 408
 sys/src/ape/lib/ap/plan9/unlink.c - 664 sys sys 1038237528 1505
 sys/src/ape/lib/ap/plan9/utime.c - 664 sys sys 1046643007 469
-sys/src/ape/lib/ap/plan9/wait.c - 664 sys sys 1089859817 2162
+sys/src/ape/lib/ap/plan9/wait.c - 664 sys sys 1093980308 2378
 sys/src/ape/lib/ap/plan9/write.c - 664 sys sys 1038237529 348
 sys/src/ape/lib/ap/posix - 20000000775 sys sys 1014921981 0
 sys/src/ape/lib/ap/posix/getgrent.c - 664 sys sys 1014921981 945
@@ -7233,7 +7233,7 @@ sys/src/cmd/cleanname.c - 664 sys sys 944960760 715
 sys/src/cmd/clock.c - 664 sys sys 1014925410 1881
 sys/src/cmd/cmp.c - 664 sys sys 1072145760 2379
 sys/src/cmd/colors.c - 664 sys sys 951763912 3186
-sys/src/cmd/comm.c - 664 sys sys 944961350 2140
+sys/src/cmd/comm.c - 664 sys sys 1093979717 2140
 sys/src/cmd/con - 20000000775 sys sys 944961996 0
 sys/src/cmd/con/con.c - 664 sys sys 1077839879 15213
 sys/src/cmd/con/hayes.c - 664 sys sys 1014925263 3865
@@ -11006,7 +11006,7 @@ sys/src/cmd/venti/sortientry.c - 664 sys sys 1063854195 7447
 sys/src/cmd/venti/stats.c - 664 sys sys 1019678880 2099
 sys/src/cmd/venti/stdinc.h - 664 sys sys 1019678880 139
 sys/src/cmd/venti/sync.c - 664 sys sys 1036470213 674
-sys/src/cmd/venti/syncarena.c - 664 sys sys 1055707444 4116
+sys/src/cmd/venti/syncarena.c - 664 sys sys 1093980087 4198
 sys/src/cmd/venti/syncindex.c - 664 sys sys 1055707433 983
 sys/src/cmd/venti/syncindex0.c - 664 sys sys 1036470283 3044
 sys/src/cmd/venti/unittoull.c - 664 sys sys 1019678881 398

+ 5 - 5
dist/replica/plan9.db

@@ -3378,7 +3378,7 @@ sys/include/ape/sys/ioctl.h - 664 sys sys 969500381 341
 sys/include/ape/sys/limits.h - 664 sys sys 944948759 494
 sys/include/ape/sys/param.h - 664 sys sys 944948759 243
 sys/include/ape/sys/pty.h - 664 sys sys 944948759 274
-sys/include/ape/sys/resource.h - 664 sys sys 944948759 205
+sys/include/ape/sys/resource.h - 664 sys sys 1093980308 932
 sys/include/ape/sys/select.h - 664 sys sys 1014927751 779
 sys/include/ape/sys/socket.h - 664 sys sys 984696196 5783
 sys/include/ape/sys/stat.h - 664 sys sys 1068478179 2177
@@ -3388,7 +3388,7 @@ sys/include/ape/sys/types.h - 664 sys sys 1068478175 993
 sys/include/ape/sys/uio.h - 664 sys sys 944948759 636
 sys/include/ape/sys/un.h - 664 sys sys 944948759 1011
 sys/include/ape/sys/utsname.h - 664 sys sys 944948759 279
-sys/include/ape/sys/wait.h - 664 sys sys 1087406385 610
+sys/include/ape/sys/wait.h - 664 sys sys 1093980308 672
 sys/include/ape/termios.h - 664 sys sys 944948760 2745
 sys/include/ape/time.h - 664 sys sys 944948760 1016
 sys/include/ape/u.h - 664 sys sys 1038237538 399
@@ -6142,7 +6142,7 @@ sys/src/ape/lib/ap/plan9/umask.c - 664 sys sys 1014921985 182
 sys/src/ape/lib/ap/plan9/uname.c - 664 sys sys 1014921985 408
 sys/src/ape/lib/ap/plan9/unlink.c - 664 sys sys 1038237528 1505
 sys/src/ape/lib/ap/plan9/utime.c - 664 sys sys 1046643007 469
-sys/src/ape/lib/ap/plan9/wait.c - 664 sys sys 1089859817 2162
+sys/src/ape/lib/ap/plan9/wait.c - 664 sys sys 1093980308 2378
 sys/src/ape/lib/ap/plan9/write.c - 664 sys sys 1038237529 348
 sys/src/ape/lib/ap/posix - 20000000775 sys sys 1014921981 0
 sys/src/ape/lib/ap/posix/getgrent.c - 664 sys sys 1014921981 945
@@ -7233,7 +7233,7 @@ sys/src/cmd/cleanname.c - 664 sys sys 944960760 715
 sys/src/cmd/clock.c - 664 sys sys 1014925410 1881
 sys/src/cmd/cmp.c - 664 sys sys 1072145760 2379
 sys/src/cmd/colors.c - 664 sys sys 951763912 3186
-sys/src/cmd/comm.c - 664 sys sys 944961350 2140
+sys/src/cmd/comm.c - 664 sys sys 1093979717 2140
 sys/src/cmd/con - 20000000775 sys sys 944961996 0
 sys/src/cmd/con/con.c - 664 sys sys 1077839879 15213
 sys/src/cmd/con/hayes.c - 664 sys sys 1014925263 3865
@@ -11006,7 +11006,7 @@ sys/src/cmd/venti/sortientry.c - 664 sys sys 1063854195 7447
 sys/src/cmd/venti/stats.c - 664 sys sys 1019678880 2099
 sys/src/cmd/venti/stdinc.h - 664 sys sys 1019678880 139
 sys/src/cmd/venti/sync.c - 664 sys sys 1036470213 674
-sys/src/cmd/venti/syncarena.c - 664 sys sys 1055707444 4116
+sys/src/cmd/venti/syncarena.c - 664 sys sys 1093980087 4198
 sys/src/cmd/venti/syncindex.c - 664 sys sys 1055707433 983
 sys/src/cmd/venti/syncindex0.c - 664 sys sys 1036470283 3044
 sys/src/cmd/venti/unittoull.c - 664 sys sys 1019678881 398

+ 5 - 0
dist/replica/plan9.log

@@ -16615,3 +16615,8 @@
 1093491055 2 c 386/bin/aux/listen1 - 775 sys sys 1093489557 91380
 1093491055 3 c 386/bin/ip/tftpd - 775 sys sys 1093489558 127405
 1093491055 4 c 386/bin/upas/nedmail - 775 sys sys 1093489559 153913
+1093980627 0 c sys/include/ape/sys/resource.h - 664 sys sys 1093980308 932
+1093980627 1 c sys/include/ape/sys/wait.h - 664 sys sys 1093980308 672
+1093980627 2 c sys/src/ape/lib/ap/plan9/wait.c - 664 sys sys 1093980308 2378
+1093980627 3 c sys/src/cmd/comm.c - 664 sys sys 1093979717 2140
+1093980627 4 c sys/src/cmd/venti/syncarena.c - 664 sys sys 1093980087 4198

+ 20 - 1
sys/include/ape/sys/resource.h

@@ -5,6 +5,25 @@
     This header file is an extension to ANSI/POSIX
 #endif
 
-/* Empty file, included by some X programs */
+struct rusage {
+	struct timeval ru_utime;	/* user time used */
+	struct timeval ru_stime;	/* system time used */
+	long	ru_maxrss;		/* max resident set size */
+#define	ru_first	ru_ixrss
+	long	ru_ixrss;		/* integral shared memory size */
+	long	ru_idrss;		/* integral unshared data " */
+	long	ru_isrss;		/* integral unshared stack " */
+	long	ru_minflt;		/* page reclaims */
+	long	ru_majflt;		/* page faults */
+	long	ru_nswap;		/* swaps */
+	long	ru_inblock;		/* block input operations */
+	long	ru_oublock;		/* block output operations */
+	long	ru_msgsnd;		/* messages sent */
+	long	ru_msgrcv;		/* messages received */
+	long	ru_nsignals;		/* signals received */
+	long	ru_nvcsw;		/* voluntary context switches */
+	long	ru_nivcsw;		/* involuntary " */
+#define	ru_last		ru_nivcsw
+};
 
 #endif /* !__RESOURCE_H__ */

+ 5 - 2
sys/include/ape/sys/wait.h

@@ -20,8 +20,11 @@ extern "C" {
 
 pid_t wait(int *);
 pid_t waitpid(pid_t, int *, int);
-pid_t wait3(int *, int, void *);
-pid_t wait4(pid_t, int *, int, void *);
+#ifdef _BSD_EXTENSION
+struct rusage;
+pid_t wait3(int *, int, struct rusage *);
+pid_t wait4(pid_t, int *, int, struct rusage *);
+#endif
 
 #ifdef __cplusplus
 }

+ 109 - 93
sys/src/ape/lib/ap/plan9/wait.c

@@ -1,134 +1,150 @@
 #include "lib.h"
 #include <stdlib.h>
 #include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/resource.h>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <string.h>
 #include <errno.h>
 #include <stdio.h>
 #include "sys9.h"
+#include "dir.h"
 
 /*
-**	PID cache
-*/
-typedef struct wdesc wdesc;
-struct wdesc {
-	pid_t w_pid;
-	Waitmsg *w_msg;
-	wdesc *w_next;
+ * status not yet collected for processes that have exited
+ */
+typedef struct Waited Waited;
+struct Waited {
+	Waitmsg*	msg;
+	Waited*	next;
 };
-static wdesc *wd = 0;
+static Waited *wd;
 
 static Waitmsg *
-lookpid (pid_t pid) {
-	wdesc **wp0 = &wd, *wp;
+lookpid(int pid)
+{
+	Waited **wl, *w;
 	Waitmsg *msg;
 
-	if (pid == -1) {
-		if (wd == 0)
-			return 0;
-		pid = wd->w_pid;
-	}
-	for (wp = wd; wp; wp = wp->w_next) {
-		if (wp->w_pid == pid) {
-			msg = wp->w_msg;
-			*wp0 = wp->w_next;
-			free (wp);
+	for(wl = &wd; (w = *wl) != nil; wl = &w->next)
+		if(pid <= 0 || w->msg->pid == pid){
+			msg = w->msg;
+			*wl = w->next;
+			free(w);
 			return msg;
 		}
-		wp0 = &(wp->w_next);
-	}
 	return 0;
 }
 
 static void
-addpid (Waitmsg *msg) {
-	wdesc *wp = malloc (sizeof (wdesc));
+addpid(Waitmsg *msg)
+{
+	Waited *w;
+
+	w = malloc(sizeof(*w));
+	if(w == nil){
+		/* lost it; what can we do? */
+		free(msg);
+		return;
+	}
+	w->msg = msg;
+	w->next = wd;
+	wd = w;
+}
+
+static int
+waitstatus(Waitmsg *w)
+{
+	int r, t;
+	char *bp, *ep;
+
+	r = 0;
+	t = 0;
+	if(w->msg[0]){
+		/* message is 'prog pid:string' */
+		bp = w->msg;
+		while(*bp){
+			if(*bp++ == ':')
+				break;
+		}
+		if(*bp == 0)
+			bp = w->msg;
+		r = strtol(bp, &ep, 10);
+		if(*ep == 0){
+			if(r < 0 || r >= 256)
+				r = 1;
+		}else{
+			t = _stringsig(bp);
+			if(t == 0)
+				r = 1;
+		}
+	}
+	return (r<<8) | t;
+}
 
-	wp->w_msg = msg;
-	wp->w_pid = msg->pid;
-	wp->w_next = wd;
-	wd = wp;
+static void
+waitresource(struct rusage *ru, Waitmsg *w)
+{
+	memset(ru, 0, sizeof(*ru));
+	ru->ru_utime.tv_sec = w->time[0]/1000;
+	ru->ru_utime.tv_usec = (w->time[0]%1000)*1000;
+	ru->ru_stime.tv_sec = w->time[1]/1000;
+	ru->ru_stime.tv_usec = (w->time[1]%1000)*1000;
 }
 
 pid_t
-wait (int *status) {
-	return wait4(-1, status, 0, 0);
+wait(int *status)
+{
+	return wait4(-1, status, 0, nil);
 }
 
 pid_t
-waitpid (pid_t wpid, int *status, int options) {
-	return wait4(wpid, status, options, 0);
+waitpid(pid_t wpid, int *status, int options)
+{
+	return wait4(wpid, status, options, nil);
 }
 
 pid_t
-wait3 (int *status, int options, Waitmsg *waitmsg) {
-	return wait4(-1, status, options, waitmsg);
+wait3(int *status, int options, struct rusage *res)
+{
+	return wait4(-1, status, options, res);
 }
 
 pid_t
-wait4 (pid_t wpid, int *status, int options, Waitmsg *waitmsg) {
+wait4(pid_t wpid, int *status, int options, struct rusage *res)
+{
+	char pname[50];
+	Dir *d;
 	Waitmsg *w;
 
-	if (options & WNOHANG) {
-		char pname[128];
-		int i;
-		struct stat buf;
-
-		snprintf (pname, sizeof (pname), "/proc/%d/wait", getpid());
-		i = stat (pname, &buf);
-		if (i >= 0 && buf.st_size == 0)
-			return 0;
-	}
-	if (w = lookpid (wpid)) {
-		waitmsg = w;
-		wpid = w->pid;
-		return wpid;
-	}
-	w = _WAIT();
-	while (w) {
-		if (wpid <= 0) {
-			waitmsg = w;
-			wpid = w->pid;
-			if(status)
-				*status = 0;
-			return wpid;
+	w = lookpid(wpid);
+	if(w == nil){
+		if(options & WNOHANG){
+			snprintf(pname, sizeof(pname), "/proc/%d/wait", getpid());
+			d = _dirstat(pname);
+			if(d != nil && d->length == 0){
+				free(d);
+				return 0;
+			}
+			free(d);
 		}
-		if (w->pid == wpid) {
-			if (status) {
-				int r = 0;
-				int t = 0;
-				char *bp, *ep;
-
-				if (w->msg[0]) {
-					/* message is 'prog pid:string' */
-					bp = w->msg;
-					while (*bp) {
-						if (*bp++ == ':')
-							break;
-					}
-					if (*bp == 0)
-						bp = w->msg;
-					r = strtol (bp, &ep, 10);
-					if (*ep == 0) {
-						if (r < 0 || r >= 256)
-							r = 1;
-					} else {
-						t = _stringsig (bp);
-						if (t == 0)
-							r = 1;
-					}
-				}
-				*status = (r << 8) | t;
+		for(;;){
+			w = _WAIT();
+			if(w == nil){
+				_syserrno();
+				return -1;
 			}
-			waitmsg = w;
-			wpid = w->pid;
-			return wpid;
-		} else {
-			addpid (w);
+			if(wpid <= 0 || w->pid == wpid)
+				break;
+			addpid(w);
 		}
-		w = _WAIT();
-	}
-	if (w == 0) {
-		_syserrno ();
 	}
+	if(res != nil)
+		waitresource(res, w);
+	if(status != nil)
+		*status = waitstatus(w);
+	wpid = w->pid;
+	free(w);
+	return wpid;
 }

+ 1 - 1
sys/src/cmd/comm.c

@@ -26,7 +26,7 @@ main(int argc, char *argv[])
 	ldr[0] = "";
 	ldr[1] = "\t";
 	ldr[2] = "\t\t";
-	l = 2;
+	l = 1;
 	ARGBEGIN{
 	case '1':
 		if(!one) {

+ 7 - 4
sys/src/cmd/venti/syncarena.c

@@ -34,7 +34,7 @@ syncArena(Arena *arena, u32int n, int zok, int fix)
 	u8int score[VtScoreSize];
 	u64int uncsize, used, aa;
 	u32int clump, clumps, cclumps, magic;
-	int err, flush, broken;
+	int err, flush, broken, cierr;
 
 	used = arena->used;
 	clumps = arena->clumps;
@@ -62,6 +62,7 @@ syncArena(Arena *arena, u32int n, int zok, int fix)
 		arena->clumps++;
 
 		broken = 0;
+		cierr = 0;
 		lump = loadClump(arena, aa, 0, &cl, score, 0);
 		if(lump == nil){
 			fprint(2, "clump=%d failed to read correctly: %R\n", clump);
@@ -93,14 +94,14 @@ syncArena(Arena *arena, u32int n, int zok, int fix)
 			broken = 1;
 		}else if(!broken && !clumpInfoEq(&ci, &cl.info)){
 			if(clumpInfoEq(&ci, &zci)){
-				err |= SyncCIZero;
+				cierr |= SyncCIZero;
 				if(!zok){
 					fprint(2, "unwritten clump info for clump=%d ", clump);
 					fprint(2, "score=%V type=%d\n",
 						cl.info.score, cl.info.type);
 				}
 			}else{
-				err |= SyncCIErr;
+				cierr |= SyncCIErr;
 				fprint(2, "bad clump info for clump=%d\n", clump);
 				fprint(2, "\texpected score=%V type=%d size=%d uncsize=%d\n",
 					cl.info.score, cl.info.type, cl.info.size, cl.info.uncsize);
@@ -115,8 +116,10 @@ syncArena(Arena *arena, u32int n, int zok, int fix)
 			if(!writeClumpInfo(arena, clump, &ci)){
 				fprint(2, "can't write correct clump directory: %R\n");
 				err |= SyncFixErr;
-			}
+			}else
+				cierr &= ~(SyncCIZero|SyncCIErr);
 		}
+		err |= cierr;
 
 		arena->uncsize += cl.info.uncsize;
 		if(cl.info.size < cl.info.uncsize)