1 /* 2 * Copyright (c) 2008 Bret S. Lambert <blambert@openbsd.org> 3 * 4 * Permission to use, copy, modify, and distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #include <stdio.h> 18 #include <pthread.h> 19 #include "local.h" 20 21 void 22 fread_thread(void *v) 23 { 24 char buf[sizeof(TEXT)]; 25 FILE *file = v; 26 int i; 27 28 for (i = 0; i < 4096; i++) { 29 if (fread(buf, sizeof(char), strlen(TEXT), file) == 0) { 30 31 if (feof(file)) 32 break; 33 34 printf("OMG!!!\n"); 35 fflush(stdout); 36 break; 37 } 38 if (strncmp(buf, TEXT, sizeof(TEXT))) 39 err(1, "Read not atomic!!!"); 40 } 41 } 42 43 int 44 main(void) 45 { 46 char sfn[24]; 47 char buf[sizeof(TEXT)]; 48 FILE *sfp; 49 int fd, i; 50 51 strlcpy(sfn, "/tmp/barnacles.XXXXXXXX", sizeof(sfn)); 52 if ((fd = mkstemp(sfn)) == -1 || 53 (sfp = fdopen(fd, "w+")) == NULL) { 54 if (fd != -1) { 55 unlink(sfn); 56 close(fd); 57 } 58 err(1, "could not open temporary file"); 59 } 60 61 for (i = 0; i < 4096 * THREAD_COUNT; i++) 62 if (fwrite(TEXT, sizeof(char), strlen(TEXT), sfp) == 0) 63 err(1, "Could not populate test file"); 64 65 run_threads(fread_thread, sfp); 66 67 unlink(sfn); 68 close(fd); 69 70 exit(0); 71 } 72