svn commit: trunk/busybox/miscutils

vda at busybox.net vda at busybox.net
Thu Mar 8 17:52:37 UTC 2007


Author: vda
Date: 2007-03-08 09:52:36 -0800 (Thu, 08 Mar 2007)
New Revision: 18040

Log:
less: yet another attempt to make search better


Modified:
   trunk/busybox/miscutils/less.c


Changeset:
Modified: trunk/busybox/miscutils/less.c
===================================================================
--- trunk/busybox/miscutils/less.c	2007-03-08 16:44:32 UTC (rev 18039)
+++ trunk/busybox/miscutils/less.c	2007-03-08 17:52:36 UTC (rev 18040)
@@ -21,6 +21,8 @@
  *   redirected input has been read from stdin
  */
 
+#include <sched.h>	/* sched_yield() */
+
 #include "busybox.h"
 #if ENABLE_FEATURE_LESS_REGEXP
 #include "xregex.h"
@@ -200,16 +202,30 @@
 			char c;
 			/* if no unprocessed chars left, eat more */
 			if (readpos >= readeof) {
+				smallint yielded = 0;
+
 				ndelay_on(0);
+ read_again:
 				eof_error = safe_read(0, readbuf, sizeof(readbuf));
-				ndelay_off(0);
 				readpos = 0;
 				readeof = eof_error;
 				if (eof_error < 0) {
+					if (errno == EAGAIN && !yielded) {
+			/* We can hit EAGAIN while searching for regexp match.
+			 * Yield is not 100% reliable solution in general,
+			 * but for less it should be good enough.
+			 * We give stdin supplier some CPU time to produce more.
+			 * We do it just once. */
+						sched_yield();
+						yielded = 1;
+						goto read_again;
+					}
 					readeof = 0;
 					if (errno != EAGAIN)
 						print_statusline("read error");
 				}
+				ndelay_off(0);
+
 				if (eof_error <= 0) {
 					goto reached_eof;
 				}




More information about the busybox-cvs mailing list