diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/io.c | 181 | ||||
-rw-r--r-- | src/io.h | 6 | ||||
-rw-r--r-- | src/main.c | 60 |
3 files changed, 161 insertions, 86 deletions
@@ -10,11 +10,12 @@ #include <libgen.h> #include "io.h" -int stream_open(struct stream *in) +static int stream_open_in(struct stream * const in); +static int stream_open_out(struct stream * const in); +static int stream_open_special(struct stream * const in); + +int stream_open(struct stream * const in) { - struct stat st; - mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP; - char *dname = NULL; int ret = 0; if (!in || in->fd > 0 || !in->name) { @@ -22,74 +23,19 @@ int stream_open(struct stream *in) goto err; } - if (in->out) { - char *tmp[2]; - - tmp[0] = strdup(in->name); - tmp[1] = dirname(tmp[0]); - dname = strdup(tmp[1]); - free(tmp[0]); - - if (stat(dname, &st)) { - ret = errno; - /* TODO: error message */ - goto err; - } - - if(!(st.st_mode & S_IFDIR)) { - ret = EINVAL; - /* TODO: error message */ - goto err; - } - - if (!stat(in->name, &st)) { - if (!(st.st_mode & S_IFREG)) { - ret = EINVAL; - /* TODO: error message */ - goto err; - } - mode = st.st_mode; - } - } else if (stat(in->name, &st)) { - ret = errno; - /* TODO: error message */ - goto err; - } else if (!(st.st_mode & S_IFREG) || !st.st_size || (st.st_size % in->stride)) { - ret = EINVAL; - /* TODO: error message */ - goto err; + if (in->out == 1) { + ret = stream_open_out(in); + } else if (!in->out) { + ret = stream_open_in(in); } else { - in->n = st.st_size / in->stride; - } - - if (in->out) { - in->fd = open(dname, O_TMPFILE | O_WRONLY, mode); - if (in->fd < 0) { - ret = errno; - /* TODO: error message */ - goto err; - } - - if (ftruncate(in->fd, in->stride * in->n)) { - ret = errno; - /* TODO: error message */ - goto err; - } - } else { - in->fd = open(in->name, O_RDONLY | O_NOATIME); - if (in->fd < 0) { - ret = errno; - /* TODO: error message */ - goto err; - } + ret = stream_open_special(in); } err: - free(dname); return ret; } -int stream_close(struct stream *in) +int stream_close(struct stream * const in) { int ret = 0; @@ -135,3 +81,108 @@ err: early_err: return ret; } + +static int stream_open_out(struct stream * const in) +{ + struct stat st; + mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP; + char *dname = NULL; + char *tmp[2]; + int ret = 0; + + tmp[0] = strdup(in->name); + tmp[1] = dirname(tmp[0]); + dname = strdup(tmp[1]); + free(tmp[0]); + + if (stat(dname, &st)) { + ret = errno; + /* TODO: error message */ + goto err; + } + + if(!(st.st_mode & S_IFDIR)) { + ret = EINVAL; + /* TODO: error message */ + goto err; + } + + if (!stat(in->name, &st)) { + if (!(st.st_mode & S_IFREG)) { + ret = EINVAL; + /* TODO: error message */ + goto err; + } + mode = st.st_mode; + } + + in->fd = open(dname, O_TMPFILE | O_WRONLY, mode); + + if (in->fd < 0) { + ret = errno; + /* TODO: error message */ + goto err; + } + + if (ftruncate(in->fd, in->stride * in->n)) { + ret = errno; + /* TODO: error message */ + goto err; + } + +err: + free(dname); + return ret; +} + +static int stream_open_in(struct stream * const in) +{ + struct stat st; + int ret = 0; + + if (stat(in->name, &st)) { + ret = errno; + /* TODO: error message */ + goto err; + } else if (!(st.st_mode & S_IFREG) || !st.st_size || (st.st_size % in->stride)) { + ret = EINVAL; + /* TODO: error message */ + goto err; + } else { + in->n = st.st_size / in->stride; + } + + in->fd = open(in->name, O_RDONLY | O_NOATIME); + + if (in->fd < 0) { + ret = errno; + /* TODO: error message */ + goto err; + } + +err: + return ret; +} + +static int stream_open_special(struct stream * const in) +{ + struct stat st; + int ret = 0; + + if (stat(in->name, &st)) { + ret = errno; + /* TODO: error message */ + goto err; + } + + in->fd = open(in->name, O_RDONLY | O_NOATIME); + + if (in->fd < 0) { + ret = errno; + /* TODO: error message */ + goto err; + } + +err: + return ret; +} @@ -24,7 +24,9 @@ struct entry_l { uint64_t val; }; -int stream_open(struct stream *in); -int stream_close(struct stream *in); +int stream_open(struct stream * const in); +int stream_close(struct stream * const in); +int stream_get(struct stream *in, size_t idx, void *data); +int stream_put(struct stream *in, size_t idx, void *data); #endif /* ALGOS_IO_H_INCLUDED */ @@ -5,16 +5,24 @@ #include <string.h> #include "io.h" -static const unsigned int OPERATING_MODE = (1 << 0); -static const unsigned int DATA_FORMAT = (1 << 1); -static const unsigned int DATA_ACCESS = (1 << 2); +enum opmode { + mode_normal, + mode_fetch, + mode_generate +}; + +static const unsigned int FLAG_DATA_FORMAT = (1 << 0); +static const unsigned int FLAG_DATA_ACCESS = (1 << 1); + +static char randfile[] = "/dev/urandom"; static struct settings_s { - size_t fetchpos; - size_t fetchto; + size_t ss; + size_t to; char *filein; char *fileout; - unsigned int mode; + unsigned int flags; + enum opmode opmode; } settings = {0}; static struct stream file_in = {.last_idx = -1, .fd = -1}; @@ -31,14 +39,20 @@ int main(int argc, char **argv) goto out; } - file_in.name = settings.filein; - file_in.stride = settings.mode & DATA_FORMAT ? sizeof(struct entry_l) : sizeof(struct entry_a); + if (settings.opmode == mode_generate) { + file_in.name = randfile; + file_in.out = -1; + } else { + file_in.name = settings.filein; + } + + file_out.name = settings.fileout ? settings.fileout : settings.filein; + file_in.stride = settings.opmode & FLAG_DATA_FORMAT ? sizeof(struct entry_l) : sizeof(struct entry_a); if ((ret = stream_open(&file_in))) { goto out; } - file_out.name = settings.fileout ? settings.fileout : settings.filein; file_out.n = file_in.n; file_out.stride = file_in.stride; @@ -64,26 +78,28 @@ static int parseargs(int argc, char **argv, struct settings_s * settings) for (i = 1; i < argc - 1; ++i) { if (!(strcmp(argv[i], "--sort"))) { - s.mode &= ~OPERATING_MODE; + s.opmode = mode_normal; } else if (!(strcmp(argv[i], "--fetch"))) { - s.mode |= OPERATING_MODE; + s.opmode = mode_fetch; + } else if (!(strcmp(argv[i], "--generate"))) { + s.opmode = mode_generate; } else if (!(strcmp(argv[i], "--array"))) { - s.mode &= ~DATA_FORMAT; + s.opmode &= ~FLAG_DATA_FORMAT; } else if (!(strcmp(argv[i], "--list"))) { - s.mode |= DATA_FORMAT; + s.opmode |= FLAG_DATA_FORMAT; } else if (!(strcmp(argv[i], "--cache"))) { - s.mode &= ~DATA_ACCESS; + s.opmode &= ~FLAG_DATA_ACCESS; } else if (!(strcmp(argv[i], "--no-cache"))) { - s.mode |= DATA_ACCESS; + s.opmode |= FLAG_DATA_ACCESS; } else if (!(strncmp(argv[i], "--position=", 11))) { if (strlen(argv[i]) > 11) { - s.fetchpos = strtoul(argv[i] + 11, NULL, 10); + s.ss = strtoul(argv[i] + 11, NULL, 10); } else { goto err; } } else if (!(strncmp(argv[i], "--num=", 6))) { if (strlen(argv[i]) > 6) { - s.fetchto = strtoul(argv[i] + 11, NULL, 10); + s.to = strtoul(argv[i] + 11, NULL, 10); } else { goto err; } @@ -108,7 +124,12 @@ static int parseargs(int argc, char **argv, struct settings_s * settings) s.fileout = s.filein; } - s.fetchto = s.fetchpos + s.fetchto; + s.to = s.ss + s.to; + + /* we always generate in-memory for speed */ + if (s.opmode == mode_generate) { + s.opmode &= ~FLAG_DATA_ACCESS; + } *settings = s; @@ -130,11 +151,12 @@ void printhelp(const char * const name) "Options:\n" " --sort sort mode (default)\n" " --fetch do not sort, fetch element(s) instead\n" + " --generate generate an input dataset\n" " --array use an array data format (default)\n" " --list use a linked list data format\n" " --[no]-cache cache data in memory (default) or process data in-place\n" " --position=<num> fetch element from position <num>\n" - " --num=<num> <num> of elements to fetch\n" + " --num=<num> <num> of elements to fetch/generate\n" " --out=<name> write output to <name> file\n" "\n" "In case more than one same option is provided, the last one take precedence\n" |