shithub: riscv

Download patch

ref: 18b8ae56e8f944df3c9078afd294aad03b204557
parent: f97798e710929c0acb2b110c1cc16b1b267039a0
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Mon May 20 19:55:38 EDT 2013

use resrcwait() when waiting for memory to become available

use resrcwait() when waiting for memory to become available. randomize
the sleep time and properly restore old process status in case tsleep()
gets interrupted.

--- a/sys/src/9/port/alloc.c
+++ b/sys/src/9/port/alloc.c
@@ -175,7 +175,7 @@
 		if(v != nil)
 			break;
 		if(!waserror()){
-			tsleep(&up->sleep, return0, 0, 100);
+			resrcwait(0);
 			poperror();
 		}
 	}
--- a/sys/src/9/port/devsd.c
+++ b/sys/src/9/port/devsd.c
@@ -849,7 +849,7 @@
 	}else{
 		while((b = sdmalloc(nb*unit->secsize)) == nil){
 			if(!waserror()){
-				tsleep(&up->sleep, return0, 0, 100);
+				resrcwait("no memory for sdbio");
 				poperror();
 			}
 		}
@@ -934,7 +934,7 @@
 	data = nil;
 	while(n > 0 && (data = sdmalloc(n)) == nil){
 		if(!waserror()){
-			tsleep(&up->sleep, return0, 0, 100);
+			resrcwait("no memory for sdrio");
 			poperror();
 		}
 	}
--- a/sys/src/9/port/pgrp.c
+++ b/sys/src/9/port/pgrp.c
@@ -306,6 +306,10 @@
 
 	p = up->psstate;
 	if(reason) {
+		if(waserror()){
+			up->psstate = p;
+			nexterror();
+		}
 		up->psstate = reason;
 		now = seconds();
 		/* don't tie up the console with complaints */
@@ -314,7 +318,9 @@
 			print("%s\n", reason);
 		}
 	}
-
-	tsleep(&up->sleep, return0, 0, 300);
-	up->psstate = p;
+	tsleep(&up->sleep, return0, 0, 100+nrand(200));
+	if(reason) {
+		up->psstate = p;
+		poperror();
+	}
 }
--