libthread: abort on single-threaded lock contention
diff --git a/src/libthread/thread.c b/src/libthread/thread.c
index 4e3e473..78c538a 100644
--- a/src/libthread/thread.c
+++ b/src/libthread/thread.c
@@ -463,6 +463,12 @@
 	}
 }
 
+static int
+singlethreaded(void)
+{
+	return threadnproc == 1 && _threadprocs->nthread == 1;
+}
+
 /*
  * locking
  */
@@ -481,6 +487,12 @@
 		unlock(&l->l);
 		return 0;
 	}
+
+	if(singlethreaded()){
+		fprint(2, "qlock deadlock\n");
+		abort();
+	}
+
 /*print("qsleep %p @%#x by %p\n", l, pc, (*threadnow)()); */
 	addthread(&l->waiting, (*threadnow)());
 	unlock(&l->l);
@@ -537,6 +549,10 @@
 		unlock(&l->l);
 		return 0;
 	}
+	if(singlethreaded()){
+		fprint(2, "rlock deadlock\n");
+		abort();
+	}
 	addthread(&l->rwaiting, (*threadnow)());
 	unlock(&l->l);
 	_threadswitch();
@@ -558,6 +574,10 @@
 		unlock(&l->l);
 		return 0;
 	}
+	if(singlethreaded()){
+		fprint(2, "wlock deadlock\n");
+		abort();
+	}
 	addthread(&l->wwaiting, (*threadnow)());
 	unlock(&l->l);
 	_threadswitch();
@@ -613,6 +633,10 @@
 static void
 threadrsleep(Rendez *r, ulong pc)
 {
+	if(singlethreaded()){
+		fprint(2, "rsleep deadlock\n");
+		abort();
+	}
 	addthread(&r->waiting, proc()->thread);
 	qunlock(r->l);
 	_threadswitch();