summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Gediminas Jakutis <gediminas@varciai.lt> 2020-02-19 14:55:34 +0200
committerGravatar Gediminas Jakutis <gediminas@varciai.lt> 2020-02-19 14:55:34 +0200
commit1bcfe887515845678f8f648c6dfecffd01813b0f (patch)
tree8f3fbb04211f5fbb21e8dd48e2c823f29a30f99f
parent790d6dcfc531005a5d7ca2f79460d593d61bb1a0 (diff)
downloadalgos-ld1-1bcfe887515845678f8f648c6dfecffd01813b0f.tar.gz
algos-ld1-1bcfe887515845678f8f648c6dfecffd01813b0f.tar.bz2
algos-ld1-1bcfe887515845678f8f648c6dfecffd01813b0f.zip
now with a special generation mode!
Signed-off-by: Gediminas Jakutis <gediminas@varciai.lt>
-rw-r--r--src/io.c181
-rw-r--r--src/io.h6
-rw-r--r--src/main.c60
3 files changed, 161 insertions, 86 deletions
diff --git a/src/io.c b/src/io.c
index a8dfa2f..f10269c 100644
--- a/src/io.c
+++ b/src/io.c
@@ -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;
+}
diff --git a/src/io.h b/src/io.h
index b7c0ebd..18e8e65 100644
--- a/src/io.h
+++ b/src/io.h
@@ -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 */
diff --git a/src/main.c b/src/main.c
index 29283a6..ee0ad52 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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"