diff options
Diffstat (limited to 'seqreader.c')
-rw-r--r-- | seqreader.c | 64 |
1 files changed, 54 insertions, 10 deletions
diff --git a/seqreader.c b/seqreader.c index f2128e2..359f38e 100644 --- a/seqreader.c +++ b/seqreader.c @@ -13,8 +13,13 @@ #define FASTWRITER_SYNCIO_ALIGN 512 +#define SYNC_MODE #define BUFSIZE 2097152 -#define BLOCK_SIZE 2097152 +#ifdef SYNC_MODE +# define BLOCK_SIZE 2097152 +#else /* SYNC_MODE */ +# define BLOCK_SIZE 16384 +#endif /* SYNC_MODE */ #define WRITE_INTERVAL 1 @@ -31,18 +36,29 @@ int main(int argc, char *argv[]) { size_t skip; size_t run; ssize_t res; + size_t max_size = (size_t)-1; char *buffer;//[BUFSIZE]; long double mcoef = 1000000. / (1024 * 1024); + int flags = O_RDONLY|O_NOATIME|O_LARGEFILE; + +#ifdef SYNC_MODE + flags |= O_DIRECT; +#endif posix_memalign((void**)&buffer, FASTWRITER_SYNCIO_ALIGN, BUFSIZE); if (argc < 2) { - printf("Usage: %s <directory|device> [skip]\n", argv[0]); + printf("Usage: %s <directory|device> [skip|size]\n", argv[0]); exit(0); } if (strstr(argv[1], "/dev/")) { - int fd = open(argv[1], O_RDONLY|O_NOATIME|O_LARGEFILE|O_DIRECT, 0); + if (argc > 2) { + max_size = atol(argv[2]); + max_size *= 1024 * 1024 * 1024; + } + + int fd = open(argv[1], flags, 0); if (fd < 0) { printf("Unable to open device %s\n", argv[1]); exit(1); @@ -66,6 +82,12 @@ int main(int argc, char *argv[]) { last_write = us; printf("Reading: %s (%lu GB), Measured speed: %zu MB/s\n", argv[0], total_size / 1024 / 1024 / 1024, (size_t)(mcoef * total_size / us)); } + + if (total_size > max_size) { + printf("Reading: %s (%lu GB), Measured speed: %zu MB/s\n", argv[0], total_size / 1024 / 1024 / 1024, (size_t)(mcoef * total_size / us)); + break; + } + res = read(fd, buffer, size); } @@ -100,9 +122,14 @@ int main(int argc, char *argv[]) { if (stat(ent->d_name, &st)) continue; if (!S_ISREG(st.st_mode)) continue; - + +#ifdef F_MODE FILE *f = fopen(ent->d_name, "r"); if (!f) continue; +#else + int fd = open(ent->d_name, flags, 0); + if (fd < 0) continue; +#endif int size = st.st_blksize; @@ -110,16 +137,33 @@ int main(int argc, char *argv[]) { printf("Buffer too small\n"); exit(1); } - + + +#ifdef F_MODE while (!feof(f)) { err = fread(buffer, 1, size, f); - if (err < 0) { - printf("Read failed\n"); - exit(1); - } + if (err < 0) break; } - +#else +# ifdef SYNC_MODE + if (size < BLOCK_SIZE) size = BLOCK_SIZE; +# endif + err = read(fd, buffer, size); + while (err > 0) { + err = read(fd, buffer, size); + } +#endif + + if (err < 0) { + printf("Read failed\n"); + exit(1); + } + +#ifdef F_MODE fclose(f); +#else + close(fd); +#endif total_size += st.st_size; files++; |