star-aerosol

Describe the radiative properties of aerosols
git clone git://git.meso-star.fr/star-aerosol.git
Log | Files | Refs | README | LICENSE

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:
Msrc/sars.c | 26+++++++++++++++++++++++---
Msrc/test_sars_load.c | 22++++++++++++++++------
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);