shithub: qk2

Download patch

ref: 4a09c1b22192e4e7a900daff1fd640bd90dff1da
parent: bf70626bc39f4e2cf8e318423de5eeaeeaa79af5
author: qwx <qwx@sciops.net>
date: Tue Aug 10 03:00:34 EDT 2021

sys: note handling

better handling of crashes: kill all but affected
proc, since they are more or less independent.  mostly,
this adds input and cd procs on the hit list.

still have no idea how it is possible for two of the
procs to get the note and call the handler at the same
time (the second one is a uproc):

	; pstree | grep xatrix
	2844316     │ └games/q2xatrix +set game xatrix
	2844324     │  └q2xatrix

	; lstk 2844316
	acid -l thread 2844316
	/proc/2844316/text:amd64 plan 9 executable
	/sys/lib/acid/port
	/sys/lib/acid/amd64
	/sys/lib/acid/thread
	acid: sleep(a0=0x3e8)+0xe /sys/src/libc/9syscall/sleep.s:6
	lock(lk=0xdd1870)+0xaa /sys/src/libc/port/lock.c:25
		i=0x2c99a9000003e8
	threadxxxgrp(grp=0xffffffff00000003,dokill=0xaeaeaeae00000000)+0x2d /sys/src/libthread/kill.c:16
		p=0xdd1870
		t=0xaeaeaeaeaee61d3b
	threadintgrp()+0x11 /sys/src/libthread/kill.c:70
	NET_Config()+0x17 /usr/qwx/p/qk2/udp.c:531
	NET_Shutdown()+0xb /usr/qwx/p/qk2/udp.c:565
	croak+0x37 /usr/qwx/p/qk2/sys.c:392
	acid:
	echo kill > /proc/2844316/ctl

	; lstk 2844324
	acid -l thread 2844324
	/proc/2844324/text:amd64 plan 9 executable
	/sys/lib/acid/port
	/sys/lib/acid/amd64
	/sys/lib/acid/thread
	acid: sleep(a0=0x3e8)+0xe /sys/src/libc/9syscall/sleep.s:6
	lock(lk=0x5fbb30)+0xaa /sys/src/libc/port/lock.c:25
		i=0x2c998e000003e8
	threadxxxgrp(grp=0x3,dokill=0x0)+0x12 /sys/src/libthread/kill.c:15
		p=0x0
		t=0x0
	threadintgrp()+0x11 /sys/src/libthread/kill.c:70
	NET_Config()+0x17 /usr/qwx/p/qk2/udp.c:531
	NET_Shutdown()+0xb /usr/qwx/p/qk2/udp.c:565
	croak+0x37 /usr/qwx/p/qk2/sys.c:392
	acid:
	echo kill > /proc/2844324/ctl

--- a/cd.c
+++ b/cd.c
@@ -87,6 +87,9 @@
 		}
 		if(write(afd, buf, n) != n)
 			break;
+		/* threadkill requires that a libthread function be used
+		 * somewhere: thread(2), errors notes and resources */
+		yield();
 	}
 }
 
--- a/cl_main.c
+++ b/cl_main.c
@@ -1767,8 +1767,8 @@
 
 	CL_WriteConfiguration (); 
 
+	IN_Shutdown ();
 	CDAudio_Shutdown ();
 	shutsnd();
-	IN_Shutdown ();
 	R_Shutdown();
 }
--- a/dat.h
+++ b/dat.h
@@ -1142,9 +1142,7 @@
 	NUMVERTEXNORMALS = 162,
 
 	/* thread groups */
-	THin = 1,
-	THsnd = 2,
-	THnet = 3
+	THnet = 1,
 };
 
 extern FILE *log_stats_file;
--- a/in.c
+++ b/in.c
@@ -366,8 +366,6 @@
 {
 	int t, ms, n, r;
 
-	threadsetgrp(THin);
-
 	t = ms = 0;
 	for(;;){
 		sleep(1);
--- a/sys.c
+++ b/sys.c
@@ -381,13 +381,22 @@
 	return p;
 }
 
+/* threadnotify does not allow handling sys: notes:
+ * /sys/src/libthread/note.c:93; most important is releasing the
+ * mouse, the rest is essentially killing all children as well
+ * as the parent (in case one of the other procs crashed);
+ * broken procs will remain afterwards, but not if threadexits
+ * et al is called.  for threadkill to work, the proc must be
+ * using a libthread function (at least yield), otherwise it
+ * won't do diddly.  too much could go wrong if going through 
+ * all the shutdown functions. */
 void
 croak(void *, char *note)
 {
 	if(!strncmp(note, "sys:", 4)){
 		IN_Grabm(0);
-		shutsnd();
-		NET_Shutdown();
+		threadkillgrp(THnet);
+		threadkillgrp(0);
 	}
 	noted(NDFLT);
 }