/*
* Copyright 2011 Steven Gribble
*
* This file is part of the UW CSE 333 course project sequence
* (333proj).
*
* 333proj is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 333proj is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with 333proj. If not, see .
*/
#include
#include
#include
#include
#include
#include
#include
#include
void PrintBandwidth(struct timeval start_t,
struct timeval stop_t,
int numbytes);
#define BUFSIZE 65536
#define WRITELEN (65536*4096)
#define FILENAME "writefile.bin"
int main(int argc, char **argv) {
int fd_out;
char buf[BUFSIZE];
ssize_t writelen;
int writecount;
struct timeval start_t, stop_t;
// Open the output file
while (1) {
fd_out = open(FILENAME,
O_WRONLY | O_TRUNC | O_CREAT,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if (fd_out == -1) {
if ((errno == EINTR) || (errno == EWOULDBLOCK)) {
// Try again.
continue;
}
// Fail.
perror("Couldn't open writefile.bin for writing");
exit(EXIT_FAILURE);
}
// The open succeeded, so break out of the loop.
break;
}
// Grab a start timestamp.
assert(gettimeofday(&start_t, NULL) == 0);
// Write WRITELEN bytes
writecount = 0;
while (writecount < WRITELEN) {
// Try to write BUFSIZE bytes to the output file.
writelen = write(fd_out,
(void *) buf,
(size_t) BUFSIZE);
if (writelen == -1) {
if ((errno == EINTR) ||
(errno == EWOULDBLOCK) ||
(errno == EAGAIN))
continue;
perror("write failed");
exit(EXIT_FAILURE);
}
writecount += writelen;
}
// flush the output file
if (fsync(fd_out) != 0) {
perror("fsync of output file failed");
exit(EXIT_FAILURE);
}
// Grab a stop timestamp.
assert(gettimeofday(&stop_t, NULL) == 0);
// Done!
PrintBandwidth(start_t, stop_t, WRITELEN);
// Clean up; close the file descriptor, delete
// the file we created.
close(fd_out);
assert(unlink(FILENAME) == 0);
return EXIT_SUCCESS; // defined in stdlib.h
}
void PrintBandwidth(struct timeval start_t,
struct timeval stop_t,
int numbytes) {
double total_seconds, bw;
total_seconds = (stop_t.tv_sec - start_t.tv_sec);
total_seconds += (stop_t.tv_usec - start_t.tv_usec) / 1000000.0;
bw = ((double) numbytes) / total_seconds;
bw = bw / 1000000.0;
fprintf(stdout, "Bandwidth: %f MB/s\n", bw);
}