diff --git a/ksh93-fdstatus.dif b/ksh93-fdstatus.dif index 75baa4e..a7264f9 100644 --- a/ksh93-fdstatus.dif +++ b/ksh93-fdstatus.dif @@ -2258,94 +2258,3 @@ a=0$(vmstate --format='+%(size)u') for ((i=0; i < 500; i++)) do print -r -- "$data" ---- src/lib/libast/include/sfio_t.h -+++ src/lib/libast/include/sfio_t.h 2013-10-11 09:22:41.000000000 +0000 -@@ -34,7 +34,7 @@ - #define _SFIO_PRIVATE \ - Sfoff_t extent; /* current file size */ \ - Sfoff_t here; /* current physical location */ \ -- unsigned char unused_1;/* unused #1 */ \ -+ unsigned char ngetr; /* sfgetr count */ \ - unsigned char tiny[1];/* for unbuffered read stream */ \ - unsigned short bits; /* private flags */ \ - unsigned int mode; /* current io mode */ \ -@@ -82,7 +82,7 @@ - (ssize_t)(-1), /* val */ \ - (Sfoff_t)0, /* extent */ \ - (Sfoff_t)0, /* here */ \ -- 0, /* getr */ \ -+ 0, /* ngetr */ \ - {0}, /* tiny */ \ - 0, /* bits */ \ - (unsigned int)(((type)&(SF_RDWR))|SF_INIT), /* mode */ \ -@@ -93,7 +93,8 @@ - (mutex), /* mutex */ \ - (Void_t*)0, /* stdio */ \ - (Sfoff_t)0, /* lpos */ \ -- (size_t)0 /* iosz */ \ -+ (size_t)0, /* iosz */ \ -+ 0 /* getr */ \ - } - - /* function to clear an Sfio_t structure */ -@@ -110,7 +111,7 @@ - (f)->val = (ssize_t)(-1), /* val */ \ - (f)->extent = (Sfoff_t)(-1), /* extent */ \ - (f)->here = (Sfoff_t)0, /* here */ \ -- (f)->getr = 0, /* getr */ \ -+ (f)->ngetr = 0, /* ngetr */ \ - (f)->tiny[0] = 0, /* tiny */ \ - (f)->bits = 0, /* bits */ \ - (f)->mode = 0, /* mode */ \ -@@ -121,7 +122,8 @@ - (f)->mutex = (mtx), /* mutex */ \ - (f)->stdio = (Void_t*)0, /* stdio */ \ - (f)->lpos = (Sfoff_t)0, /* lpos */ \ -- (f)->iosz = (size_t)0 /* iosz */ \ -+ (f)->iosz = (size_t)0, /* iosz */ \ -+ (f)->getr = 0 /* getr */ \ - ) - - /* expose next stream inside discipline function; state saved in int f */ ---- src/lib/libast/sfio/sfmode.c -+++ src/lib/libast/sfio/sfmode.c 2013-10-11 09:26:43.000000000 +0000 -@@ -258,7 +258,7 @@ reg Sfio_t* f; /* stream to close */ - #endif - { - Sfproc_t* p; -- int pid, status; -+ int status; - - if(!(p = f->proc)) - return -1; -@@ -279,7 +279,7 @@ reg Sfio_t* f; /* stream to close */ - sigcritical(SIG_REG_EXEC|SIG_REG_PROC); - #endif - status = -1; -- while ((pid = waitpid(p->pid,&status,0)) == -1 && errno == EINTR) -+ while (waitpid(p->pid,&status,0) == -1 && errno == EINTR) - ; - #if _PACKAGE_ast - status = status == -1 ? -@@ -405,12 +405,16 @@ reg int local; /* a local call */ - if(f->mode&SF_GETR) - { f->mode &= ~SF_GETR; - #ifdef MAP_TYPE -- if((f->bits&SF_MMAP) && (f->tiny[0] += 1) >= (4*SF_NMAP) ) -- { /* turn off mmap to avoid page faulting */ -- sfsetbuf(f,(Void_t*)f->tiny,(size_t)SF_UNBOUND); -- f->tiny[0] = 0; -+ if(f->bits&SF_MMAP) -+ { -+ if (!++f->ngetr) -+ f->tiny[0]++; -+ if(((f->tiny[0]<<8)|f->ngetr) >= (4*SF_NMAP) ) -+ { /* turn off mmap to avoid page faulting */ -+ sfsetbuf(f,(Void_t*)f->tiny,(size_t)SF_UNBOUND); -+ f->ngetr = f->tiny[0] = 0; -+ } - } -- else - #endif - if(f->getr) - { f->next[-1] = f->getr; diff --git a/ksh93-sfio.dif b/ksh93-sfio.dif index 4cdba10..6d29a3d 100644 --- a/ksh93-sfio.dif +++ b/ksh93-sfio.dif @@ -1,3 +1,52 @@ +--- src/lib/libast/include/sfio_t.h ++++ src/lib/libast/include/sfio_t.h 2013-10-11 09:22:41.000000000 +0000 +@@ -34,7 +34,7 @@ + #define _SFIO_PRIVATE \ + Sfoff_t extent; /* current file size */ \ + Sfoff_t here; /* current physical location */ \ +- unsigned char unused_1;/* unused #1 */ \ ++ unsigned char ngetr; /* sfgetr count */ \ + unsigned char tiny[1];/* for unbuffered read stream */ \ + unsigned short bits; /* private flags */ \ + unsigned int mode; /* current io mode */ \ +@@ -82,7 +82,7 @@ + (ssize_t)(-1), /* val */ \ + (Sfoff_t)0, /* extent */ \ + (Sfoff_t)0, /* here */ \ +- 0, /* getr */ \ ++ 0, /* ngetr */ \ + {0}, /* tiny */ \ + 0, /* bits */ \ + (unsigned int)(((type)&(SF_RDWR))|SF_INIT), /* mode */ \ +@@ -93,7 +93,8 @@ + (mutex), /* mutex */ \ + (Void_t*)0, /* stdio */ \ + (Sfoff_t)0, /* lpos */ \ +- (size_t)0 /* iosz */ \ ++ (size_t)0, /* iosz */ \ ++ 0 /* getr */ \ + } + + /* function to clear an Sfio_t structure */ +@@ -110,7 +111,7 @@ + (f)->val = (ssize_t)(-1), /* val */ \ + (f)->extent = (Sfoff_t)(-1), /* extent */ \ + (f)->here = (Sfoff_t)0, /* here */ \ +- (f)->getr = 0, /* getr */ \ ++ (f)->ngetr = 0, /* ngetr */ \ + (f)->tiny[0] = 0, /* tiny */ \ + (f)->bits = 0, /* bits */ \ + (f)->mode = 0, /* mode */ \ +@@ -121,7 +122,8 @@ + (f)->mutex = (mtx), /* mutex */ \ + (f)->stdio = (Void_t*)0, /* stdio */ \ + (f)->lpos = (Sfoff_t)0, /* lpos */ \ +- (f)->iosz = (size_t)0 /* iosz */ \ ++ (f)->iosz = (size_t)0, /* iosz */ \ ++ (f)->getr = 0 /* getr */ \ + ) + + /* expose next stream inside discipline function; state saved in int f */ --- src/lib/libast/sfio/sfflsbuf.c +++ src/lib/libast/sfio/sfflsbuf.c 2013-10-18 11:50:01.866235555 +0000 @@ -96,7 +96,7 @@ int c; /* if c>=0, c is also written out @@ -9,6 +58,48 @@ written += w; f->next = f->data+n; if(c < 0 && (!isall || n == 0)) +--- src/lib/libast/sfio/sfmode.c ++++ src/lib/libast/sfio/sfmode.c 2013-10-11 09:26:43.000000000 +0000 +@@ -258,7 +258,7 @@ reg Sfio_t* f; /* stream to close */ + #endif + { + Sfproc_t* p; +- int pid, status; ++ int status; + + if(!(p = f->proc)) + return -1; +@@ -279,7 +279,7 @@ reg Sfio_t* f; /* stream to close */ + sigcritical(SIG_REG_EXEC|SIG_REG_PROC); + #endif + status = -1; +- while ((pid = waitpid(p->pid,&status,0)) == -1 && errno == EINTR) ++ while (waitpid(p->pid,&status,0) == -1 && errno == EINTR) + ; + #if _PACKAGE_ast + status = status == -1 ? +@@ -405,12 +405,16 @@ reg int local; /* a local call */ + if(f->mode&SF_GETR) + { f->mode &= ~SF_GETR; + #ifdef MAP_TYPE +- if((f->bits&SF_MMAP) && (f->tiny[0] += 1) >= (4*SF_NMAP) ) +- { /* turn off mmap to avoid page faulting */ +- sfsetbuf(f,(Void_t*)f->tiny,(size_t)SF_UNBOUND); +- f->tiny[0] = 0; ++ if(f->bits&SF_MMAP) ++ { ++ if (!++f->ngetr) ++ f->tiny[0]++; ++ if(((f->tiny[0]<<8)|f->ngetr) >= (4*SF_NMAP) ) ++ { /* turn off mmap to avoid page faulting */ ++ sfsetbuf(f,(Void_t*)f->tiny,(size_t)SF_UNBOUND); ++ f->ngetr = f->tiny[0] = 0; ++ } + } +- else + #endif + if(f->getr) + { f->next[-1] = f->getr; --- src/lib/libast/sfio/sfmove.c +++ src/lib/libast/sfio/sfmove.c 2013-10-18 12:04:03.194735625 +0000 @@ -113,7 +113,11 @@ reg int rc; /* record separator */