commit - f35a04866f298aa4b0fa6846da0c0187751ce9b2
commit + faf1fb6c7e14e95e54865b660db7501ed390ea9e
blob - 4e3e473cc4fc64831195320b112b5a34302efc3f
blob + 78c538acd8245e6618d10d47457d6986e440b554
--- src/libthread/thread.c
+++ src/libthread/thread.c
fprint(2, "thread stack overflow: &t=%p tstk=%p n=%d\n", &t, t->stk, 256+n);
abort();
}
+}
+
+static int
+singlethreaded(void)
+{
+ return threadnproc == 1 && _threadprocs->nthread == 1;
}
/*
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);
unlock(&l->l);
return 0;
}
+ if(singlethreaded()){
+ fprint(2, "rlock deadlock\n");
+ abort();
+ }
addthread(&l->rwaiting, (*threadnow)());
unlock(&l->l);
_threadswitch();
if(!block){
unlock(&l->l);
return 0;
+ }
+ if(singlethreaded()){
+ fprint(2, "wlock deadlock\n");
+ abort();
}
addthread(&l->wwaiting, (*threadnow)());
unlock(&l->l);
static void
threadrsleep(Rendez *r, ulong pc)
{
+ if(singlethreaded()){
+ fprint(2, "rsleep deadlock\n");
+ abort();
+ }
addthread(&r->waiting, proc()->thread);
qunlock(r->l);
_threadswitch();