1*b30d1939SAndy Fiddamanref -D_def_map_ast=1 2*b30d1939SAndy Fiddaman 3*b30d1939SAndy Fiddamansys mman 4*b30d1939SAndy Fiddaman 5*b30d1939SAndy Fiddamantst lib_mmap note{ standard mmap interface that works }end execute{ 6*b30d1939SAndy Fiddaman #include <unistd.h> 7*b30d1939SAndy Fiddaman #include <fcntl.h> 8*b30d1939SAndy Fiddaman #include <sys/types.h> 9*b30d1939SAndy Fiddaman #include <sys/mman.h> 10*b30d1939SAndy Fiddaman #include <sys/stat.h> 11*b30d1939SAndy Fiddaman #include <sys/times.h> 12*b30d1939SAndy Fiddaman 13*b30d1939SAndy Fiddaman #define MAPSIZE (64*1024) 14*b30d1939SAndy Fiddaman #define BUFSIZE (8*1024) 15*b30d1939SAndy Fiddaman #define WRITE (64) 16*b30d1939SAndy Fiddaman 17*b30d1939SAndy Fiddaman #define Failed(file) (remove(file),1) 18*b30d1939SAndy Fiddaman 19*b30d1939SAndy Fiddaman int 20*b30d1939SAndy Fiddaman #if _STD_ 21*b30d1939SAndy Fiddaman main(int argc, char** argv) 22*b30d1939SAndy Fiddaman #else 23*b30d1939SAndy Fiddaman main(argc,argv) 24*b30d1939SAndy Fiddaman int argc; 25*b30d1939SAndy Fiddaman char** argv; 26*b30d1939SAndy Fiddaman #endif 27*b30d1939SAndy Fiddaman { 28*b30d1939SAndy Fiddaman caddr_t mm; 29*b30d1939SAndy Fiddaman char *t, *u, *f; 30*b30d1939SAndy Fiddaman int i, fd, okfixed; 31*b30d1939SAndy Fiddaman char file[1024], buf[MAPSIZE]; 32*b30d1939SAndy Fiddaman struct tms stm, etm; 33*b30d1939SAndy Fiddaman clock_t rdtm, mmtm; 34*b30d1939SAndy Fiddaman 35*b30d1939SAndy Fiddaman /* create data file in a local fs if possible */ 36*b30d1939SAndy Fiddaman t = file; 37*b30d1939SAndy Fiddaman if (access(f = "/tmp", 0) == 0 || 38*b30d1939SAndy Fiddaman access(f = "/usr/tmp", 0) == 0) 39*b30d1939SAndy Fiddaman { 40*b30d1939SAndy Fiddaman while (*t = *f++) 41*b30d1939SAndy Fiddaman t++; 42*b30d1939SAndy Fiddaman *t++ = '/'; 43*b30d1939SAndy Fiddaman } 44*b30d1939SAndy Fiddaman u = t; 45*b30d1939SAndy Fiddaman f = argv[0]; 46*b30d1939SAndy Fiddaman while (*t = *f++) 47*b30d1939SAndy Fiddaman if (*t == '/') 48*b30d1939SAndy Fiddaman t = u; 49*b30d1939SAndy Fiddaman else if (*t != '.') 50*b30d1939SAndy Fiddaman t++; 51*b30d1939SAndy Fiddaman *t++ = '.'; *t++ = 'D'; *t = 0; 52*b30d1939SAndy Fiddaman if ((fd = open(file, O_CREAT|O_TRUNC|O_WRONLY, 0666)) < 0) 53*b30d1939SAndy Fiddaman return 1; 54*b30d1939SAndy Fiddaman 55*b30d1939SAndy Fiddaman for (i = 0; i < sizeof(buf); ++i) 56*b30d1939SAndy Fiddaman buf[i] = '0' + (i%10); 57*b30d1939SAndy Fiddaman for (i = 0; i < WRITE; ++i) 58*b30d1939SAndy Fiddaman if (write(fd,buf,sizeof(buf)) != sizeof(buf)) 59*b30d1939SAndy Fiddaman return Failed(file); 60*b30d1939SAndy Fiddaman close(fd); 61*b30d1939SAndy Fiddaman 62*b30d1939SAndy Fiddaman /* see if can overwrite fixed map */ 63*b30d1939SAndy Fiddaman #ifndef MAP_VARIABLE 64*b30d1939SAndy Fiddaman #define MAP_VARIABLE 0 65*b30d1939SAndy Fiddaman #endif 66*b30d1939SAndy Fiddaman if ((fd = open(file, O_RDWR)) < 0) 67*b30d1939SAndy Fiddaman return Failed(file); 68*b30d1939SAndy Fiddaman 69*b30d1939SAndy Fiddaman mm = mmap((caddr_t)0, sizeof(buf), (PROT_READ|PROT_WRITE), 70*b30d1939SAndy Fiddaman (MAP_PRIVATE|MAP_VARIABLE), fd, 0); 71*b30d1939SAndy Fiddaman if(mm == (caddr_t)0 || mm == (caddr_t)(-1)) 72*b30d1939SAndy Fiddaman return Failed(file); 73*b30d1939SAndy Fiddaman mm = mmap(mm, sizeof(buf), (PROT_READ|PROT_WRITE), 74*b30d1939SAndy Fiddaman (MAP_PRIVATE|MAP_FIXED), fd, 0); 75*b30d1939SAndy Fiddaman okfixed = (mm == (caddr_t)0 || mm == (caddr_t)(-1)) ? 0 : 1; 76*b30d1939SAndy Fiddaman munmap(mm, sizeof(buf)); 77*b30d1939SAndy Fiddaman close(fd); 78*b30d1939SAndy Fiddaman 79*b30d1939SAndy Fiddaman /* read time */ 80*b30d1939SAndy Fiddaman if((fd = open(file, O_RDWR)) < 0) 81*b30d1939SAndy Fiddaman return Failed(file); 82*b30d1939SAndy Fiddaman times(&stm); 83*b30d1939SAndy Fiddaman for (i = 0; i < WRITE; ++i) 84*b30d1939SAndy Fiddaman if (read(fd,buf,BUFSIZE) != BUFSIZE) 85*b30d1939SAndy Fiddaman return Failed(file); 86*b30d1939SAndy Fiddaman times(&etm); 87*b30d1939SAndy Fiddaman close(fd); 88*b30d1939SAndy Fiddaman rdtm = (etm.tms_utime-stm.tms_utime) + (etm.tms_stime-stm.tms_stime); 89*b30d1939SAndy Fiddaman 90*b30d1939SAndy Fiddaman /* mmap time */ 91*b30d1939SAndy Fiddaman if ((fd = open(file, O_RDWR)) < 0) 92*b30d1939SAndy Fiddaman return Failed(file); 93*b30d1939SAndy Fiddaman times(&stm); 94*b30d1939SAndy Fiddaman for(i = 0, mm = (caddr_t)0; i < WRITE; ++i) 95*b30d1939SAndy Fiddaman { if(okfixed) 96*b30d1939SAndy Fiddaman { mm = (caddr_t)mmap(mm, MAPSIZE, 97*b30d1939SAndy Fiddaman (PROT_READ|PROT_WRITE), 98*b30d1939SAndy Fiddaman (MAP_PRIVATE | (mm ? MAP_FIXED : MAP_VARIABLE)), 99*b30d1939SAndy Fiddaman fd, i*MAPSIZE ); 100*b30d1939SAndy Fiddaman } 101*b30d1939SAndy Fiddaman else 102*b30d1939SAndy Fiddaman { if(mm) 103*b30d1939SAndy Fiddaman munmap(mm, MAPSIZE); 104*b30d1939SAndy Fiddaman mm = (caddr_t)mmap((caddr_t)0, MAPSIZE, 105*b30d1939SAndy Fiddaman (PROT_READ|PROT_WRITE), 106*b30d1939SAndy Fiddaman (MAP_PRIVATE|MAP_VARIABLE), 107*b30d1939SAndy Fiddaman fd, i*MAPSIZE ); 108*b30d1939SAndy Fiddaman } 109*b30d1939SAndy Fiddaman if(mm == (caddr_t)(-1) || mm == (caddr_t)0) 110*b30d1939SAndy Fiddaman return Failed(file); 111*b30d1939SAndy Fiddaman } 112*b30d1939SAndy Fiddaman times(&etm); 113*b30d1939SAndy Fiddaman close(fd); 114*b30d1939SAndy Fiddaman remove(file); 115*b30d1939SAndy Fiddaman mmtm = (etm.tms_utime-stm.tms_utime) + (etm.tms_stime-stm.tms_stime); 116*b30d1939SAndy Fiddaman 117*b30d1939SAndy Fiddaman return rdtm+60 < mmtm ? 1 : 0; 118*b30d1939SAndy Fiddaman } 119*b30d1939SAndy Fiddaman}end 120*b30d1939SAndy Fiddaman 121*b30d1939SAndy Fiddamantst lib_mmap64 -D_LARGEFILE64_SOURCE note{ mmap64 interface and implementation work }end execute{ 122*b30d1939SAndy Fiddaman #if !_lib_mmap 123*b30d1939SAndy Fiddaman ( 124*b30d1939SAndy Fiddaman #endif 125*b30d1939SAndy Fiddaman 126*b30d1939SAndy Fiddaman #include <unistd.h> 127*b30d1939SAndy Fiddaman #include <fcntl.h> 128*b30d1939SAndy Fiddaman #include <sys/types.h> 129*b30d1939SAndy Fiddaman #include <sys/mman.h> 130*b30d1939SAndy Fiddaman #include <sys/stat.h> 131*b30d1939SAndy Fiddaman 132*b30d1939SAndy Fiddaman int 133*b30d1939SAndy Fiddaman main() 134*b30d1939SAndy Fiddaman { 135*b30d1939SAndy Fiddaman off64_t off; 136*b30d1939SAndy Fiddaman int fd; 137*b30d1939SAndy Fiddaman int n; 138*b30d1939SAndy Fiddaman char* s; 139*b30d1939SAndy Fiddaman struct stat64 st; 140*b30d1939SAndy Fiddaman char file[32] = {'/','t','m','p','/','m','m','X','X','X','X','X','X'}; 141*b30d1939SAndy Fiddaman 142*b30d1939SAndy Fiddaman /* hey, stubs are supposed to fail! */ 143*b30d1939SAndy Fiddaman if (stat64(".", &st) || !st.st_mode || !st.st_mtime) 144*b30d1939SAndy Fiddaman return 1; 145*b30d1939SAndy Fiddaman if (!mktemp(file) || (fd = open64(file, O_CREAT|O_WRONLY, 0600)) < 0) 146*b30d1939SAndy Fiddaman { 147*b30d1939SAndy Fiddaman remove(file); 148*b30d1939SAndy Fiddaman return 1; 149*b30d1939SAndy Fiddaman } 150*b30d1939SAndy Fiddaman off = (1<<8); 151*b30d1939SAndy Fiddaman off *= off; 152*b30d1939SAndy Fiddaman if (lseek64(fd, off, SEEK_SET) != off) 153*b30d1939SAndy Fiddaman { 154*b30d1939SAndy Fiddaman remove(file); 155*b30d1939SAndy Fiddaman return 1; 156*b30d1939SAndy Fiddaman } 157*b30d1939SAndy Fiddaman n = strlen(file) + 1; 158*b30d1939SAndy Fiddaman if (write(fd, file, n) != n) 159*b30d1939SAndy Fiddaman { 160*b30d1939SAndy Fiddaman remove(file); 161*b30d1939SAndy Fiddaman return 1; 162*b30d1939SAndy Fiddaman } 163*b30d1939SAndy Fiddaman if (close(fd) < 0 || (fd = open64(file, O_RDWR)) < 0) 164*b30d1939SAndy Fiddaman { 165*b30d1939SAndy Fiddaman remove(file); 166*b30d1939SAndy Fiddaman return 1; 167*b30d1939SAndy Fiddaman } 168*b30d1939SAndy Fiddaman if (!(s = mmap64((caddr_t)0, (size_t)n, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, off))) 169*b30d1939SAndy Fiddaman { 170*b30d1939SAndy Fiddaman remove(file); 171*b30d1939SAndy Fiddaman return 1; 172*b30d1939SAndy Fiddaman } 173*b30d1939SAndy Fiddaman if (strcmp(s, file)) 174*b30d1939SAndy Fiddaman { 175*b30d1939SAndy Fiddaman remove(file); 176*b30d1939SAndy Fiddaman return 1; 177*b30d1939SAndy Fiddaman } 178*b30d1939SAndy Fiddaman close(fd); 179*b30d1939SAndy Fiddaman remove(file); 180*b30d1939SAndy Fiddaman return 0; 181*b30d1939SAndy Fiddaman } 182*b30d1939SAndy Fiddaman}end 183*b30d1939SAndy Fiddaman 184*b30d1939SAndy Fiddamantst mmap_anon note{ use mmap MAP_ANON to get raw memory }end execute{ 185*b30d1939SAndy Fiddaman #if !_lib_mmap 186*b30d1939SAndy Fiddaman ( 187*b30d1939SAndy Fiddaman #endif 188*b30d1939SAndy Fiddaman #include <unistd.h> 189*b30d1939SAndy Fiddaman #include <fcntl.h> 190*b30d1939SAndy Fiddaman #include <sys/types.h> 191*b30d1939SAndy Fiddaman #include <sys/mman.h> 192*b30d1939SAndy Fiddaman #if defined(MAP_ANONYMOUS) && !defined(MAP_ANON) 193*b30d1939SAndy Fiddaman #define MAP_ANON MAP_ANONYMOUS 194*b30d1939SAndy Fiddaman #endif 195*b30d1939SAndy Fiddaman int 196*b30d1939SAndy Fiddaman main() 197*b30d1939SAndy Fiddaman { void *addr; 198*b30d1939SAndy Fiddaman addr = mmap(0,1024*1024,PROT_READ|PROT_WRITE,MAP_ANON|MAP_PRIVATE,-1,0); 199*b30d1939SAndy Fiddaman return (addr && addr != (void*)(-1)) ? 0 : 1; 200*b30d1939SAndy Fiddaman } 201*b30d1939SAndy Fiddaman}end 202*b30d1939SAndy Fiddaman 203*b30d1939SAndy Fiddamantst mmap_devzero note{ use mmap on /dev/zero to get raw memory }end execute{ 204*b30d1939SAndy Fiddaman #if !_lib_mmap 205*b30d1939SAndy Fiddaman ( 206*b30d1939SAndy Fiddaman #endif 207*b30d1939SAndy Fiddaman #include <unistd.h> 208*b30d1939SAndy Fiddaman #include <fcntl.h> 209*b30d1939SAndy Fiddaman #include <sys/types.h> 210*b30d1939SAndy Fiddaman #include <sys/mman.h> 211*b30d1939SAndy Fiddaman int 212*b30d1939SAndy Fiddaman main() 213*b30d1939SAndy Fiddaman { int fd; 214*b30d1939SAndy Fiddaman void *addr; 215*b30d1939SAndy Fiddaman if((fd = open("/dev/zero", O_RDWR)) < 0) 216*b30d1939SAndy Fiddaman return 1; 217*b30d1939SAndy Fiddaman addr = mmap(0,1024*1024,PROT_READ|PROT_WRITE,MAP_PRIVATE,fd,0); 218*b30d1939SAndy Fiddaman return (addr && addr != (void*)(-1)) ? 0 : 1; 219*b30d1939SAndy Fiddaman } 220*b30d1939SAndy Fiddaman}end 221*b30d1939SAndy Fiddaman 222*b30d1939SAndy Fiddamantst note{ mmap is worth using }end output{ 223*b30d1939SAndy Fiddaman #if !_lib_mmap 224*b30d1939SAndy Fiddaman ( 225*b30d1939SAndy Fiddaman #endif 226*b30d1939SAndy Fiddaman #include <unistd.h> 227*b30d1939SAndy Fiddaman #include <fcntl.h> 228*b30d1939SAndy Fiddaman #include <sys/types.h> 229*b30d1939SAndy Fiddaman #include <sys/mman.h> 230*b30d1939SAndy Fiddaman #include <sys/stat.h> 231*b30d1939SAndy Fiddaman #include <sys/times.h> 232*b30d1939SAndy Fiddaman 233*b30d1939SAndy Fiddaman #define MAPSIZE (64*1024) 234*b30d1939SAndy Fiddaman #define BUFSIZE (MAPSIZE/8) 235*b30d1939SAndy Fiddaman #define WRITE (64) 236*b30d1939SAndy Fiddaman #define RUN (64) 237*b30d1939SAndy Fiddaman 238*b30d1939SAndy Fiddaman #define Failed(file) (remove(file),1) 239*b30d1939SAndy Fiddaman 240*b30d1939SAndy Fiddaman int 241*b30d1939SAndy Fiddaman #if _STD_ 242*b30d1939SAndy Fiddaman main(int argc, char** argv) 243*b30d1939SAndy Fiddaman #else 244*b30d1939SAndy Fiddaman main(argc,argv) 245*b30d1939SAndy Fiddaman int argc; 246*b30d1939SAndy Fiddaman char** argv; 247*b30d1939SAndy Fiddaman #endif 248*b30d1939SAndy Fiddaman { 249*b30d1939SAndy Fiddaman caddr_t mm; 250*b30d1939SAndy Fiddaman char *t, *f; 251*b30d1939SAndy Fiddaman int i, fd, k, run; 252*b30d1939SAndy Fiddaman char file[1024], buf[MAPSIZE]; 253*b30d1939SAndy Fiddaman struct tms stm, etm; 254*b30d1939SAndy Fiddaman clock_t rdtm, mmtm; 255*b30d1939SAndy Fiddaman 256*b30d1939SAndy Fiddaman /* create data file */ 257*b30d1939SAndy Fiddaman f = argv[0]; t = file; 258*b30d1939SAndy Fiddaman while (*t = *f++) 259*b30d1939SAndy Fiddaman t++; 260*b30d1939SAndy Fiddaman *t++ = '.'; *t++ = 'D'; *t = 0; 261*b30d1939SAndy Fiddaman if ((fd = open(file, O_CREAT|O_TRUNC|O_WRONLY, 0666)) < 0) 262*b30d1939SAndy Fiddaman return 1; 263*b30d1939SAndy Fiddaman 264*b30d1939SAndy Fiddaman for (i = 0; i < sizeof(buf); ++i) 265*b30d1939SAndy Fiddaman buf[i] = '0' + (i%10); 266*b30d1939SAndy Fiddaman for (i = 0; i < WRITE; ++i) 267*b30d1939SAndy Fiddaman if (write(fd,buf,sizeof(buf)) != sizeof(buf)) 268*b30d1939SAndy Fiddaman return Failed(file); 269*b30d1939SAndy Fiddaman close(fd); 270*b30d1939SAndy Fiddaman 271*b30d1939SAndy Fiddaman /* read time */ 272*b30d1939SAndy Fiddaman times(&stm); 273*b30d1939SAndy Fiddaman for(run = 0; run < RUN; ++run) 274*b30d1939SAndy Fiddaman { if((fd = open(file, O_RDWR)) < 0) 275*b30d1939SAndy Fiddaman return Failed(file); 276*b30d1939SAndy Fiddaman for (i = 0; i < WRITE; ++i) 277*b30d1939SAndy Fiddaman { for(k = 0; k < MAPSIZE; k += BUFSIZE) 278*b30d1939SAndy Fiddaman if (read(fd,buf,BUFSIZE) != BUFSIZE) 279*b30d1939SAndy Fiddaman return Failed(file); 280*b30d1939SAndy Fiddaman } 281*b30d1939SAndy Fiddaman close(fd); 282*b30d1939SAndy Fiddaman } 283*b30d1939SAndy Fiddaman times(&etm); 284*b30d1939SAndy Fiddaman rdtm = (etm.tms_utime-stm.tms_utime) + (etm.tms_stime-stm.tms_stime); 285*b30d1939SAndy Fiddaman 286*b30d1939SAndy Fiddaman /* mmap time */ 287*b30d1939SAndy Fiddaman times(&stm); 288*b30d1939SAndy Fiddaman for(run = 0; run < RUN; ++run) 289*b30d1939SAndy Fiddaman { if ((fd = open(file, O_RDWR)) < 0) 290*b30d1939SAndy Fiddaman return Failed(file); 291*b30d1939SAndy Fiddaman for(i = 0, mm = (caddr_t)0; i < WRITE; ++i) 292*b30d1939SAndy Fiddaman { if(mm) 293*b30d1939SAndy Fiddaman munmap(mm, MAPSIZE); 294*b30d1939SAndy Fiddaman mm = (caddr_t)mmap((caddr_t)0, MAPSIZE, 295*b30d1939SAndy Fiddaman (PROT_READ|PROT_WRITE), 296*b30d1939SAndy Fiddaman MAP_PRIVATE, fd, i*MAPSIZE ); 297*b30d1939SAndy Fiddaman if(mm == (caddr_t)(-1) || mm == (caddr_t)0) 298*b30d1939SAndy Fiddaman return Failed(file); 299*b30d1939SAndy Fiddaman 300*b30d1939SAndy Fiddaman /* the memcpy is < BUFSIZE to simulate the 301*b30d1939SAndy Fiddaman fact that functions like sfreserve/sfgetr do 302*b30d1939SAndy Fiddaman not do buffer copying. 303*b30d1939SAndy Fiddaman */ 304*b30d1939SAndy Fiddaman t = (char*)mm; 305*b30d1939SAndy Fiddaman for(k = 0; k < MAPSIZE; k += BUFSIZE, t += BUFSIZE) 306*b30d1939SAndy Fiddaman memcpy(buf,t,(3*BUFSIZE)/4); 307*b30d1939SAndy Fiddaman } 308*b30d1939SAndy Fiddaman close(fd); 309*b30d1939SAndy Fiddaman } 310*b30d1939SAndy Fiddaman times(&etm); 311*b30d1939SAndy Fiddaman mmtm = (etm.tms_utime-stm.tms_utime) + (etm.tms_stime-stm.tms_stime); 312*b30d1939SAndy Fiddaman 313*b30d1939SAndy Fiddaman remove(file); 314*b30d1939SAndy Fiddaman 315*b30d1939SAndy Fiddaman if(4*mmtm <= 3*rdtm) 316*b30d1939SAndy Fiddaman printf("#define _mmap_worthy 2 /* mmap is great */\n"); 317*b30d1939SAndy Fiddaman else if(4*mmtm <= 5*rdtm) 318*b30d1939SAndy Fiddaman printf("#define _mmap_worthy 1 /* mmap is good */\n"); 319*b30d1939SAndy Fiddaman 320*b30d1939SAndy Fiddaman else 321*b30d1939SAndy Fiddaman return 1; 322*b30d1939SAndy Fiddaman return 0; 323*b30d1939SAndy Fiddaman } 324*b30d1939SAndy Fiddaman}end 325*b30d1939SAndy Fiddaman 326*b30d1939SAndy Fiddamancat{ 327*b30d1939SAndy Fiddaman 328*b30d1939SAndy Fiddaman /* some systems get it wrong but escape concise detection */ 329*b30d1939SAndy Fiddaman #ifndef _NO_MMAP 330*b30d1939SAndy Fiddaman #if __CYGWIN__ 331*b30d1939SAndy Fiddaman #define _NO_MMAP 1 332*b30d1939SAndy Fiddaman #endif 333*b30d1939SAndy Fiddaman #endif 334*b30d1939SAndy Fiddaman 335*b30d1939SAndy Fiddaman #if _NO_MMAP 336*b30d1939SAndy Fiddaman #undef _lib_mmap 337*b30d1939SAndy Fiddaman #undef _lib_mmap64 338*b30d1939SAndy Fiddaman #undef _mmap_anon 339*b30d1939SAndy Fiddaman #undef _mmap_devzero 340*b30d1939SAndy Fiddaman #undef _mmap_worthy 341*b30d1939SAndy Fiddaman #endif 342*b30d1939SAndy Fiddaman}end 343