commit 1256fc4d8ccc8da17f660b4be7844b35c4622e2a
parent 691beeb817d3454ace5b68ccc1ea32f6c753d7ae
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Mon, 16 Oct 2023 15:14:34 +0200
Detect whether memory mapping is enabled when loading from stdin
In this case, print a specific error message at the start of the loading
procedure before any loading problems occur. To test this, we can now
provide the "-" option as an input argument to the test_sars_load
program, which means "read data from stdin".
Diffstat:
2 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/src/sars.c b/src/sars.c
@@ -29,10 +29,22 @@
#include <errno.h>
#include <sys/mman.h> /* mmap */
+#include <sys/stat.h> /* fstat */
/*******************************************************************************
* Helper functions
******************************************************************************/
+static INLINE int
+is_stdin(FILE* stream)
+{
+ struct stat stream_buf;
+ struct stat stdin_buf;
+ ASSERT(stream);
+ CHK(fstat(fileno(stream), &stream_buf) == 0);
+ CHK(fstat(STDIN_FILENO, &stdin_buf) == 0);
+ return stream_buf.st_dev == stdin_buf.st_dev;
+}
+
static INLINE res_T
check_sars_create_args(const struct sars_create_args* args)
{
@@ -48,9 +60,17 @@ check_sars_load_args(const struct sars_load_args* args)
}
static INLINE res_T
-check_sars_load_stream_args(const struct sars_load_stream_args* args)
+check_sars_load_stream_args
+ (struct sars* sars,
+ const struct sars_load_stream_args* args)
{
if(!args || !args->stream || !args->name) return RES_BAD_ARG;
+ if(args->memory_mapping && is_stdin(args->stream)) {
+ log_err(sars,
+ "%s: unable to use memory mapping on data loaded from stdin\n",
+ args->name);
+ return RES_BAD_ARG;
+ }
return RES_OK;
}
@@ -306,7 +326,7 @@ load_stream(struct sars* sars, const struct sars_load_stream_args* args)
size_t iband;
uint64_t nbands;
res_T res = RES_OK;
- ASSERT(sars && check_sars_load_stream_args(args) == RES_OK);
+ ASSERT(sars && check_sars_load_stream_args(sars, args) == RES_OK);
reset_sars(sars);
@@ -539,7 +559,7 @@ sars_load_stream(struct sars* sars, const struct sars_load_stream_args* args)
{
res_T res = RES_OK;
if(!sars) return RES_BAD_ARG;
- res = check_sars_load_stream_args(args);
+ res = check_sars_load_stream_args(sars, args);
if(res != RES_OK) return res;
return load_stream(sars, args);
}
diff --git a/src/test_sars_load.c b/src/test_sars_load.c
@@ -281,16 +281,26 @@ test_load_files(struct sars* sars, int argc, char** argv)
CHK(sars);
FOR_EACH(i, 1, argc) {
hash256_T hash;
- struct sars_load_args args = SARS_LOAD_ARGS_NULL;
size_t nnodes;
size_t nbands;
size_t iband;
- printf("Load %s\n", argv[1]);
-
- args.path = argv[i];
- args.memory_mapping = 1;
- CHK(sars_load(sars, &args) == RES_OK);
+ if(!strcmp(argv[i], "-")) { /* Read from stdin */
+ struct sars_load_stream_args args = SARS_LOAD_STREAM_ARGS_NULL;
+ printf("Load from stdin\n");
+ args.stream = stdin;
+ args.name = "stdin";
+ args.memory_mapping = 1;
+ CHK(sars_load_stream(sars, &args) == RES_BAD_ARG);
+ args.memory_mapping = 0;
+ CHK(sars_load_stream(sars, &args) == RES_OK);
+ } else {
+ struct sars_load_args args = SARS_LOAD_ARGS_NULL;
+ printf("Load %s\n", argv[1]);
+ args.path = argv[i];
+ args.memory_mapping = 1;
+ CHK(sars_load(sars, &args) == RES_OK);
+ }
nbands = sars_get_bands_count(sars);
nnodes = sars_get_nodes_count(sars);
CHK(nbands);