aboutsummaryrefslogtreecommitdiff
path: root/shells/ksh93/files/patch-src_lib_libast_features_mmap
diff options
context:
space:
mode:
Diffstat (limited to 'shells/ksh93/files/patch-src_lib_libast_features_mmap')
-rw-r--r--shells/ksh93/files/patch-src_lib_libast_features_mmap191
1 files changed, 191 insertions, 0 deletions
diff --git a/shells/ksh93/files/patch-src_lib_libast_features_mmap b/shells/ksh93/files/patch-src_lib_libast_features_mmap
new file mode 100644
index 000000000000..920291f31c18
--- /dev/null
+++ b/shells/ksh93/files/patch-src_lib_libast_features_mmap
@@ -0,0 +1,191 @@
+--- src/lib/libast/features/mmap.orig 2016-02-28 17:09:23 UTC
++++ src/lib/libast/features/mmap
+@@ -16,14 +16,7 @@ tst lib_mmap note{ standard mmap interfa
+
+ #define Failed(file) (remove(file),1)
+
+- int
+- #if _STD_
+- main(int argc, char** argv)
+- #else
+- main(argc,argv)
+- int argc;
+- char** argv;
+- #endif
++ int main(int argc, char** argv)
+ {
+ caddr_t mm;
+ char *file;
+@@ -165,169 +158,18 @@ tst lib_mmap64 -D_LARGEFILE64_SOURCE not
+ }
+ }end
+
+-tst mmap_anon note{ use mmap MAP_ANON to get raw memory }end execute{
+- #if !_lib_mmap
+- (
+- #endif
+- #include <unistd.h>
+- #include <fcntl.h>
+- #include <sys/types.h>
+- #include <sys/mman.h>
+- #if defined(MAP_ANONYMOUS) && !defined(MAP_ANON)
+- #define MAP_ANON MAP_ANONYMOUS
+- #endif
+- int
+- main()
+- { void *addr;
+- addr = mmap(0,1024*1024,PROT_READ|PROT_WRITE,MAP_ANON|MAP_PRIVATE,-1,0);
+- return (addr && addr != (void*)(-1)) ? 0 : 1;
+- }
+-}end
+-
+-tst mmap_devzero note{ use mmap on /dev/zero to get raw memory }end execute{
+- #if !_lib_mmap
+- (
+- #endif
+- #include <unistd.h>
+- #include <fcntl.h>
+- #include <sys/types.h>
+- #include <sys/mman.h>
+- int
+- main()
+- { int fd;
+- void *addr;
+- if((fd = open("/dev/zero", O_RDWR)) < 0)
+- return 1;
+- addr = mmap(0,1024*1024,PROT_READ|PROT_WRITE,MAP_PRIVATE,fd,0);
+- return (addr && addr != (void*)(-1)) ? 0 : 1;
+- }
+-}end
+-
+-tst -D_LARGEFILE64_SOURCE note{ mmap is worth using }end output{
+- #if !_lib_mmap
+- (
+- #endif
+- #include <unistd.h>
+- #include <fcntl.h>
+- #include <string.h>
+- #include <sys/types.h>
+- #include <sys/mman.h>
+- #include <sys/stat.h>
+- #include <sys/times.h>
+-
+- #if _lib_mmap64
+- #undef mmap
+- #define mmap mmap64
+- #endif
+-
+- #if _lib_munmap64
+- #undef munmap
+- #define munmap munmap64
+- #endif
+-
+- #define MAPSIZE (64*1024)
+- #define BUFSIZE (MAPSIZE/8)
+- #define WRITE (64)
+- #define RUN (64)
+-
+- #define Failed(file) (remove(file),1)
+-
+- int
+- #if _STD_
+- main(int argc, char** argv)
+- #else
+- main(argc,argv)
+- int argc;
+- char** argv;
+- #endif
+- {
+- caddr_t mm;
+- char *file, *t;
+- int i, fd, k, run;
+- char buf[MAPSIZE];
+- struct tms stm, etm;
+- clock_t rdtm, mmtm;
+-
+- file = argv[1];
+- if ((fd = open(file, O_CREAT|O_TRUNC|O_WRONLY, 0666)) < 0)
+- return 1;
+-
+- for (i = 0; i < sizeof(buf); ++i)
+- buf[i] = '0' + (i%10);
+- for (i = 0; i < WRITE; ++i)
+- if (write(fd,buf,sizeof(buf)) != sizeof(buf))
+- return Failed(file);
+- close(fd);
+-
+- /* read time */
+- times(&stm);
+- for(run = 0; run < RUN; ++run)
+- { if((fd = open(file, O_RDWR)) < 0)
+- return Failed(file);
+- for (i = 0; i < WRITE; ++i)
+- { for(k = 0; k < MAPSIZE; k += BUFSIZE)
+- if (read(fd,buf,BUFSIZE) != BUFSIZE)
+- return Failed(file);
+- }
+- close(fd);
+- }
+- times(&etm);
+- rdtm = (etm.tms_utime-stm.tms_utime) + (etm.tms_stime-stm.tms_stime);
+-
+- /* mmap time */
+- times(&stm);
+- for(run = 0; run < RUN; ++run)
+- { if ((fd = open(file, O_RDWR)) < 0)
+- return Failed(file);
+- for(i = 0, mm = (caddr_t)0; i < WRITE; ++i)
+- { if(mm)
+- munmap(mm, MAPSIZE);
+- mm = (caddr_t)mmap((caddr_t)0, MAPSIZE,
+- (PROT_READ|PROT_WRITE),
+- MAP_PRIVATE, fd, i*MAPSIZE );
+- if(mm == (caddr_t)(-1) || mm == (caddr_t)0)
+- return Failed(file);
+-
+- /* the memcpy is < BUFSIZE to simulate the
+- fact that functions like sfreserve/sfgetr do
+- not do buffer copying.
+- */
+- t = (char*)mm;
+- for(k = 0; k < MAPSIZE; k += BUFSIZE, t += BUFSIZE)
+- memcpy(buf,t,(3*BUFSIZE)/4);
+- }
+- close(fd);
+- }
+- times(&etm);
+- mmtm = (etm.tms_utime-stm.tms_utime) + (etm.tms_stime-stm.tms_stime);
+-
+- remove(file);
+-
+- if(4*mmtm <= 3*rdtm)
+- printf("#define _mmap_worthy 2 /* mmap outperforms read on 64Ki buffers -- use it */\n");
+- else if(4*mmtm <= 5*rdtm)
+- printf("#define _mmap_worthy 2 /* mmap is slightly better than read on 64Ki buffers -- use it */\n");
+- else
+- printf("#define _mmap_worthy 2 /* mmap worse than read on 64Ki buffers -- use it anyway */\n");
+-
+- return 0;
+- }
+-}end
+-
+ cat{
++ /* assume MAP_ANON works */
++ #define _mmap_anon 1
+
+ /* some systems get it wrong but escape concise detection */
+- #ifndef _NO_MMAP
+ #if __CYGWIN__
+ #define _NO_MMAP 1
+ #endif
+- #endif
+
+ #if _NO_MMAP
+ #undef _lib_mmap
+ #undef _lib_mmap64
+- #undef _mmap_anon
+- #undef _mmap_devzero
+- #undef _mmap_worthy
++ #undef _mmap_anon
+ #endif
+ }end