$NetBSD: patch-ac,v 1.6 2013/09/10 14:12:38 joerg Exp $ - ... - cope with 64-bit off_t --- bonnie.c.orig 1996-08-28 16:23:49.000000000 +0000 +++ bonnie.c @@ -25,8 +25,10 @@ #include #include +#include #include #include +#include #include #include #if defined(SysV) @@ -34,6 +36,7 @@ #include #else #include +#include #endif #define IntSize (sizeof(int)) @@ -49,7 +52,8 @@ #define Seeks (4000) #define UpdateSeek (10) #define SeekProcCount (3) -#define Chunk (16384) + +unsigned int Chunk = 16384; /* labels for the tests, used as an array index */ typedef enum @@ -87,11 +91,12 @@ static double delta[(int) TestCount][2]; static double last_cpustamp = 0.0; /* for computing delta-t */ static double last_timestamp = 0.0; /* for computing delta-t */ +int main( int argc, char * argv[]) { - int buf[Chunk / IntSize]; + int *buf; int bufindex; int chars[256]; int child; @@ -122,6 +127,8 @@ main( for (next = 1; next < argc; next++) if (strcmp(argv[next], "-d") == 0) dir = argv[++next]; + else if (strcmp(argv[next], "-c") == 0) + Chunk = atoi(argv[++next]); else if (strcmp(argv[next], "-s") == 0) size = atol(argv[++next]); else if (strcmp(argv[next], "-m") == 0) @@ -146,7 +153,12 @@ main( /* size is in meg, rounded down to multiple of Chunk */ size *= (1024 * 1024); size = Chunk * (size / Chunk); - fprintf(stderr, "File '%s', size: %ld\n", name, size); + fprintf(stderr, "File '%s', size: %llu\n", name, (unsigned long long) size); + + if (!(buf = (int *) malloc(Chunk))) { + fprintf(stderr, "Error allocating buffer memory: %s\n", strerror(errno)); + exit(1); + } /* Fill up a file, writing it a char at a time with the stdio putc() call */ fprintf(stderr, "Writing with putc()..."); @@ -288,6 +300,7 @@ main( { /* child process */ /* set up and wait for the go-ahead */ + close(0); /* From FreeBSD */ close(seek_feedback[0]); close(seek_control[1]); newfile(name, &fd, &stream, 0); @@ -303,7 +316,13 @@ main( /* loop until we read a 0 ticket back from our parent */ while(seek_tickets[0]) { /* until Mom says stop */ - doseek((long) (random() % (size / Chunk)), fd, + off_t seekto; + + if (size < ((off_t)1 << 32)) /* From FreeBSD */ + seekto = random() % (size / Chunk); + else + seekto = (((off_t)random() << 32) + random()) % (size / Chunk); + doseek(seekto, fd, ((lseek_count++ % UpdateSeek) == 0)); if (read(seek_control[0], seek_tickets, 1) != 1) io_error("read ticket"); @@ -380,7 +399,7 @@ write_html( off_t size) { - printf("%s%d", machine, size / (1024 * 1024)); + printf("%s%lld", machine, (long long) (size / (1024 * 1024))); printf("%d%4.1f%d%4.1f%d%4.1f", (int) (((double) size) / (delta[(int) Putc][Elapsed] * 1024.0)), delta[(int) Putc][CPU] / delta[(int) Putc][Elapsed] * 100.0, @@ -413,7 +432,7 @@ report( printf("K/sec %%CPU K/sec %%CPU K/sec %%CPU K/sec %%CPU K/sec "); printf("%%CPU /sec %%CPU\n"); - printf("%-8.8s %4d ", machine, size / (1024 * 1024)); + printf("%-8.8s %4llu ", machine, (unsigned long long) size / (1024 * 1024)); printf("%5d %4.1f %5d %4.1f %5d %4.1f ", (int) (((double) size) / (delta[(int) Putc][Elapsed] * 1024.0)), delta[(int) Putc][CPU] / delta[(int) Putc][Elapsed] * 100.0, @@ -458,7 +477,7 @@ static void usage() { fprintf(stderr, - "usage: Bonnie [-d scratch-dir] [-s size-in-Mb] [-html] [-m machine-label]\n"); + "usage: bonnie [-c chunk-size] [-d scratch-dir] [-s size-in-Mb] [-html] [-m machine-label]\n"); exit(1); } @@ -529,7 +548,7 @@ io_error(char * message) { char buf[Chunk]; - sprintf(buf, "Bonnie: drastic I/O error (%s)", message); + sprintf(buf, "\nBonnie: drastic I/O error (%s)", message); perror(buf); exit(1); } @@ -568,7 +587,7 @@ doseek( /* touch a word */ buf[((int) random() % (size/IntSize - 2)) + 1]--; - if (lseek(fd, (long) probe, 0) != probe) + if (lseek(fd, probe, 0) != probe) io_error("lseek in doseek update"); if (write(fd, (char *) buf, size) == -1) io_error("write in doseek");