shithub: riscv

Download patch

ref: 6273bad12d5e1d5bf25c71a53ee5b9163a7db687
parent: 168b9f3de4088ed08987e62da3c593e98bdaab29
author: cinap_lenrek <[email protected]>
date: Tue Jul 22 17:54:26 EDT 2014

ratrace: make multithreaded ratraces less confusing (for mischief)

--- a/sys/src/cmd/ratrace.c
+++ b/sys/src/cmd/ratrace.c
@@ -12,10 +12,10 @@
 Channel *forkc;
 int nread = 0;
 
-typedef struct Str Str;
-struct Str {
+typedef struct Msg Msg;
+struct Msg {
 	char	*buf;
-	int	len;
+	int	pid;
 };
 
 void
@@ -40,7 +40,7 @@
 {
 	int cfd, tfd, forking = 0, pid, newpid;
 	char *ctl, *truss;
-	Str *s;
+	Msg *s;
 
 	pid = (int)(uintptr)v;
 	ctl = smprint("/proc/%d/ctl", pid);
@@ -53,9 +53,10 @@
 	cwrite(cfd, ctl, "stop", 4);
 	cwrite(cfd, truss, "startsyscall", 12);
 
-	s = mallocz(sizeof(Str) + Bufsize, 1);
+	s = mallocz(sizeof(Msg) + Bufsize, 1);
+	s->pid = pid;
 	s->buf = (char *)&s[1];
-	while((s->len = pread(tfd, s->buf, Bufsize - 1, 0)) > 0){
+	while(pread(tfd, s->buf, Bufsize - 1, 0) > 0){
 		if (forking && s->buf[1] == '=' && s->buf[3] != '-') {
 			forking = 0;
 			newpid = strtol(&s->buf[3], 0, 0);
@@ -83,7 +84,8 @@
 		}
 		sendp(out, s);
 		cwrite(cfd, truss, "startsyscall", 12);
-		s = mallocz(sizeof(Str) + Bufsize, 1);
+		s = mallocz(sizeof(Msg) + Bufsize, 1);
+		s->pid = pid;
 		s->buf = (char *)&s[1];
 	}
 	sendp(quit, nil);
@@ -91,12 +93,14 @@
 }
 
 void
-writer(void *)
+writer(void *arg)
 {
-	int newpid;
+	int lastpid;
 	Alt a[4];
-	Str *s;
+	Msg *s;
 
+	lastpid = (int)(uintptr)arg;
+
 	a[0].op = CHANRCV;
 	a[0].c = quit;
 	a[0].v = nil;
@@ -105,7 +109,7 @@
 	a[1].v = &s;
 	a[2].op = CHANRCV;
 	a[2].c = forkc;
-	a[2].v = &newpid;
+	a[2].v = nil;
 	a[3].op = CHANEND;
 
 	for(;;)
@@ -116,12 +120,14 @@
 				goto done;
 			break;
 		case 1:
-			/* it's a nice null terminated thing */
+			if(s->pid != lastpid){
+				lastpid = s->pid;
+				fprint(2, s->buf[1]=='='? "\n%d ...": "\n", lastpid);
+			}
 			fprint(2, "%s", s->buf);
 			free(s);
 			break;
 		case 2:
-			// procrfork(reader, (void*)newpid, Stacksize, 0);
 			nread++;
 			break;
 		}
@@ -183,6 +189,6 @@
 	quit  = chancreate(sizeof(char*), 0);
 	forkc = chancreate(sizeof(ulong *), 0);
 	nread++;
-	procrfork(writer, nil, Stacksize, 0);
+	procrfork(writer, (void*)pid, Stacksize, 0);
 	reader((void*)pid);
 }