commit 7480c2bc89ba2de4670ce45d5da90a819d216cfa
parent fa81d42b1f1bf750e3a01d78d7186d6b0f6c734e
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 29 Mar 2022 17:06:19 +0200
Improve error management of a few I/O errors
Diffstat:
| M | src/stardis-compute.c | | | 176 | +++++++++++++++++++++++++++++++++++++++++++++++++------------------------------ |
1 file changed, 109 insertions(+), 67 deletions(-)
diff --git a/src/stardis-compute.c b/src/stardis-compute.c
@@ -436,8 +436,8 @@ error:
args.rng_type = SSP_RNG_THREEFRY; \
} else { \
const char* name = str_cget(Name); \
- stream = fopen(name, "r"); \
- if(!stream) { \
+ stream_r = fopen(name, "r"); \
+ if(!stream_r) { \
res = RES_IO_ERR; \
logger_print(stardis->logger, LOG_ERROR, \
"Cannot open generator's state file ('%s').\n", \
@@ -445,14 +445,14 @@ error:
goto error; \
} \
ERR(ssp_rng_create(stardis->allocator, SSP_RNG_THREEFRY, &args.rng_state)); \
- res = read_random_generator_state(args.rng_state, stream); \
+ res = read_random_generator_state(args.rng_state, stream_r); \
if(res != RES_OK) { \
logger_print(stardis->logger, LOG_ERROR, \
"Cannot read random generator's state ('%s').\n", \
name); \
goto error; \
} \
- fclose(stream); stream = NULL; \
+ fclose(stream_r); stream_r = NULL; \
} \
}
@@ -460,16 +460,16 @@ error:
if(!stardis->mpi_initialized || stardis->mpi_rank == 0) { \
if(!str_is_empty(Name)) { \
const char* name = str_cget(Name); \
- stream = fopen(name, "wb"); \
- if(!stream) { \
+ stream_r = fopen(name, "wb"); \
+ if(!stream_r) { \
res = RES_IO_ERR; \
logger_print(stardis->logger, LOG_ERROR, \
"Cannot write random generator's state ('%s').\n", \
name); \
goto error; \
} \
- ERR(write_random_generator_state(estimator, stream)); \
- fclose(stream); stream = NULL; \
+ ERR(write_random_generator_state(estimator, stream_r)); \
+ fclose(stream_r); stream_r = NULL; \
} \
}
@@ -483,7 +483,9 @@ compute_probe(struct stardis* stardis, struct time* start)
struct sdis_estimator* estimator = NULL;
struct dump_path_context dump_ctx;
struct sdis_solve_probe_args args = SDIS_SOLVE_PROBE_ARGS_DEFAULT;
- FILE* stream = NULL;
+ FILE* stream_r = NULL;
+ FILE* stream_g = NULL;
+ FILE* stream_p = NULL;
struct time compute_start, compute_end;
ASSERT(stardis && start && (stardis->mode & MODE_PROBE_COMPUTE));
@@ -502,31 +504,37 @@ compute_probe(struct stardis* stardis, struct time* start)
if(stardis->mpi_initialized && stardis->mpi_rank != 0) {
ERR(sdis_solve_probe_green_function(stardis->sdis_scn, &args, &green));
} else {
- time_current(&compute_start);
- ERR(sdis_solve_probe_green_function(stardis->sdis_scn, &args, &green));
- time_current(&compute_end);
+ /* Try to open output files to detect errors early */
if(stardis->mode & MODE_BIN_GREEN) {
- struct time output_end;
ASSERT(!str_is_empty(&stardis->bin_green_filename));
- stream = fopen(str_cget(&stardis->bin_green_filename), "wb");
- if(!stream) {
+ stream_g = fopen(str_cget(&stardis->bin_green_filename), "wb");
+ if(!stream_g) {
logger_print(stardis->logger, LOG_ERROR,
"cannot open file '%s'\n", str_cget(&stardis->bin_green_filename));
res = RES_IO_ERR;
goto error;
}
- ERR(dump_green_bin(green, stardis, stream));
- fclose(stream); stream = NULL;
if(str_cget(&stardis->end_paths_filename)
&& strlen(str_cget(&stardis->end_paths_filename)))
{
- stream = fopen(str_cget(&stardis->end_paths_filename), "w");
- if(!stream) {
+ stream_p = fopen(str_cget(&stardis->end_paths_filename), "w");
+ if(!stream_p) {
+ logger_print(stardis->logger, LOG_ERROR,
+ "cannot open file '%s'\n", str_cget(&stardis->end_paths_filename));
res = RES_IO_ERR;
goto error;
}
- ERR(dump_paths_end(green, stardis, stream));
- fclose(stream); stream = NULL;
+ }
+ }
+ /* Call solve() */
+ time_current(&compute_start);
+ ERR(sdis_solve_probe_green_function(stardis->sdis_scn, &args, &green));
+ time_current(&compute_end);
+ if(stardis->mode & MODE_BIN_GREEN) {
+ struct time output_end;
+ ERR(dump_green_bin(green, stardis, stream_g));
+ if(stream_p) {
+ ERR(dump_paths_end(green, stardis, stream_p));
}
time_current(&output_end);
ERR(print_computation_time(NULL, stardis,
@@ -560,7 +568,10 @@ compute_probe(struct stardis* stardis, struct time* start)
WRITE_RANDOM_STATE(&stardis->rndgen_state_out_filename);
end:
- if(stream) fclose(stream);
+ if(stream_r) fclose(stream_r);
+ if(stream_g) fclose(stream_g);
+ if(stream_p) fclose(stream_p);
+ if(estimator) SDIS(estimator_ref_put(estimator));
if(estimator) SDIS(estimator_ref_put(estimator));
if(green) SDIS(green_function_ref_put(green));
if(args.rng_state) SSP(rng_ref_put(args.rng_state));
@@ -580,7 +591,9 @@ compute_probe_on_interface(struct stardis* stardis, struct time* start)
struct dump_path_context dump_ctx;
struct sdis_solve_probe_boundary_args args
= SDIS_SOLVE_PROBE_BOUNDARY_ARGS_DEFAULT;
- FILE* stream = NULL;
+ FILE* stream_r = NULL;
+ FILE* stream_g = NULL;
+ FILE* stream_p = NULL;
struct time compute_start, compute_end;
enum sdis_side compute_side;
unsigned prop[3];
@@ -748,32 +761,38 @@ compute_probe_on_interface(struct stardis* stardis, struct time* start)
ERR(sdis_solve_probe_boundary_green_function(stardis->sdis_scn, &args,
&green));
} else {
- time_current(&compute_start);
- ERR(sdis_solve_probe_boundary_green_function(stardis->sdis_scn, &args,
- &green));
- time_current(&compute_end);
+ /* Try to open output files to detect errors early */
if(stardis->mode & MODE_BIN_GREEN) {
- struct time output_end;
ASSERT(!str_is_empty(&stardis->bin_green_filename));
- stream = fopen(str_cget(&stardis->bin_green_filename), "wb");
- if(!stream) {
+ stream_g = fopen(str_cget(&stardis->bin_green_filename), "wb");
+ if(!stream_g) {
logger_print(stardis->logger, LOG_ERROR,
"cannot open file '%s'\n", str_cget(&stardis->bin_green_filename));
res = RES_IO_ERR;
goto error;
}
- ERR(dump_green_bin(green, stardis, stream));
- fclose(stream); stream = NULL;
if(str_cget(&stardis->end_paths_filename)
&& strlen(str_cget(&stardis->end_paths_filename)))
{
- stream = fopen(str_cget(&stardis->end_paths_filename), "w");
- if(!stream) {
+ stream_p = fopen(str_cget(&stardis->end_paths_filename), "w");
+ if(!stream_p) {
+ logger_print(stardis->logger, LOG_ERROR,
+ "cannot open file '%s'\n", str_cget(&stardis->end_paths_filename));
res = RES_IO_ERR;
goto error;
}
- ERR(dump_paths_end(green, stardis, stream));
- fclose(stream); stream = NULL;
+ }
+ }
+ /* Call solve() */
+ time_current(&compute_start);
+ ERR(sdis_solve_probe_boundary_green_function(stardis->sdis_scn, &args,
+ &green));
+ time_current(&compute_end);
+ if(stardis->mode & MODE_BIN_GREEN) {
+ struct time output_end;
+ ERR(dump_green_bin(green, stardis, stream_g));
+ if(stream_p) {
+ ERR(dump_paths_end(green, stardis, stream_p));
}
time_current(&output_end);
ERR(print_computation_time(NULL, stardis,
@@ -807,7 +826,9 @@ compute_probe_on_interface(struct stardis* stardis, struct time* start)
WRITE_RANDOM_STATE(&stardis->rndgen_state_out_filename);
end:
- if(stream) fclose(stream);
+ if(stream_r) fclose(stream_r);
+ if(stream_g) fclose(stream_g);
+ if(stream_p) fclose(stream_p);
if(estimator) SDIS(estimator_ref_put(estimator));
if(green) SDIS(green_function_ref_put(green));
if(args.rng_state) SSP(rng_ref_put(args.rng_state));
@@ -906,7 +927,7 @@ compute_camera(struct stardis* stardis, struct time* start)
struct dump_path_context dump_ctx;
size_t definition[2];
size_t ix, iy;
- FILE* stream;
+ FILE* stream = NULL;
struct time compute_start, compute_end, output_end;
ASSERT(stardis && start
@@ -999,7 +1020,9 @@ compute_medium(struct stardis* stardis, struct time* start)
struct sdis_green_function* green = NULL;
struct sdis_solve_medium_args args = SDIS_SOLVE_MEDIUM_ARGS_DEFAULT;
struct dump_path_context dump_ctx;
- FILE* stream = NULL;
+ FILE* stream_r = NULL;
+ FILE* stream_g = NULL;
+ FILE* stream_p = NULL;
struct time compute_start, compute_end;
ASSERT(stardis && start && (stardis->mode & MODE_MEDIUM_COMPUTE));
@@ -1025,31 +1048,38 @@ compute_medium(struct stardis* stardis, struct time* start)
if(stardis->mpi_initialized && stardis->mpi_rank != 0) {
ERR(sdis_solve_medium_green_function(stardis->sdis_scn, &args, &green));
} else {
- time_current(&compute_start);
- ERR(sdis_solve_medium_green_function(stardis->sdis_scn, &args, &green));
- time_current(&compute_end);
+ /* Try to open output files to detect errors early */
if(stardis->mode & MODE_BIN_GREEN) {
- struct time output_end;
ASSERT(!str_is_empty(&stardis->bin_green_filename));
- stream = fopen(str_cget(&stardis->bin_green_filename), "wb");
- if(!stream) {
+ stream_g = fopen(str_cget(&stardis->bin_green_filename), "wb");
+ if(!stream_g) {
logger_print(stardis->logger, LOG_ERROR,
"cannot open file '%s'\n", str_cget(&stardis->bin_green_filename));
res = RES_IO_ERR;
goto error;
}
- ERR(dump_green_bin(green, stardis, stream));
- fclose(stream); stream = NULL;
if(str_cget(&stardis->end_paths_filename)
&& strlen(str_cget(&stardis->end_paths_filename)))
{
- stream = fopen(str_cget(&stardis->end_paths_filename), "w");
- if(!stream) {
+ stream_p = fopen(str_cget(&stardis->end_paths_filename), "w");
+ if(!stream_p) {
+ logger_print(stardis->logger, LOG_ERROR,
+ "cannot open file '%s'\n", str_cget(&stardis->end_paths_filename));
res = RES_IO_ERR;
goto error;
}
- ERR(dump_paths_end(green, stardis, stream));
- fclose(stream); stream = NULL;
+ }
+ }
+ /* Call solve() */
+ time_current(&compute_start);
+ ERR(sdis_solve_medium_green_function(stardis->sdis_scn, &args, &green));
+ time_current(&compute_end);
+ if(stardis->mode & MODE_BIN_GREEN) {
+ struct time output_end;
+ ASSERT(!str_is_empty(&stardis->bin_green_filename));
+ ERR(dump_green_bin(green, stardis, stream_g));
+ if(stream_p) {
+ ERR(dump_paths_end(green, stardis, stream_p));
}
time_current(&output_end);
ERR(print_computation_time(NULL, stardis,
@@ -1082,7 +1112,9 @@ compute_medium(struct stardis* stardis, struct time* start)
WRITE_RANDOM_STATE(&stardis->rndgen_state_out_filename);
end:
- if(stream) fclose(stream);
+ if(stream_r) fclose(stream_r);
+ if(stream_g) fclose(stream_g);
+ if(stream_p) fclose(stream_p);
if(estimator) SDIS(estimator_ref_put(estimator));
if(green) SDIS(green_function_ref_put(green));
if(args.rng_state) SSP(rng_ref_put(args.rng_state));
@@ -1147,7 +1179,9 @@ compute_boundary(struct stardis* stardis, struct time* start)
struct sdis_estimator* estimator = NULL;
struct dump_path_context dump_ctx;
struct sdis_solve_boundary_args args = SDIS_SOLVE_BOUNDARY_ARGS_DEFAULT;
- FILE* stream = NULL;
+ FILE* stream_r = NULL;
+ FILE* stream_g = NULL;
+ FILE* stream_p = NULL;
struct time compute_start, compute_end;
ASSERT(stardis && start && (stardis->mode & MODE_BOUNDARY_COMPUTE));
@@ -1167,31 +1201,37 @@ compute_boundary(struct stardis* stardis, struct time* start)
if(stardis->mpi_initialized && stardis->mpi_rank != 0) {
ERR(sdis_solve_boundary_green_function(stardis->sdis_scn, &args, &green));
} else {
- time_current(&compute_start);
- ERR(sdis_solve_boundary_green_function(stardis->sdis_scn, &args, &green));
- time_current(&compute_end);
+ /* Try to open output files to detect errors early */
if(stardis->mode & MODE_BIN_GREEN) {
- struct time output_end;
ASSERT(!str_is_empty(&stardis->bin_green_filename));
- stream = fopen(str_cget(&stardis->bin_green_filename), "wb");
- if(!stream) {
+ stream_g = fopen(str_cget(&stardis->bin_green_filename), "wb");
+ if(!stream_g) {
logger_print(stardis->logger, LOG_ERROR,
"cannot open file '%s'\n", str_cget(&stardis->bin_green_filename));
res = RES_IO_ERR;
goto error;
}
- ERR(dump_green_bin(green, stardis, stream));
- fclose(stream); stream = NULL;
if(str_cget(&stardis->end_paths_filename)
&& strlen(str_cget(&stardis->end_paths_filename)))
{
- stream = fopen(str_cget(&stardis->end_paths_filename), "w");
- if(!stream) {
+ stream_p = fopen(str_cget(&stardis->end_paths_filename), "w");
+ if(!stream_p) {
+ logger_print(stardis->logger, LOG_ERROR,
+ "cannot open file '%s'\n", str_cget(&stardis->end_paths_filename));
res = RES_IO_ERR;
goto error;
}
- ERR(dump_paths_end(green, stardis, stream));
- fclose(stream); stream = NULL;
+ }
+ }
+ /* Call solve() */
+ time_current(&compute_start);
+ ERR(sdis_solve_boundary_green_function(stardis->sdis_scn, &args, &green));
+ time_current(&compute_end);
+ if(stardis->mode & MODE_BIN_GREEN) {
+ struct time output_end;
+ ERR(dump_green_bin(green, stardis, stream_g));
+ if(stream_p) {
+ ERR(dump_paths_end(green, stardis, stream_p));
}
time_current(&output_end);
ERR(print_computation_time(NULL, stardis,
@@ -1224,7 +1264,9 @@ compute_boundary(struct stardis* stardis, struct time* start)
WRITE_RANDOM_STATE(&stardis->rndgen_state_out_filename);
end:
- if(stream) fclose(stream);
+ if(stream_r) fclose(stream_r);
+ if(stream_g) fclose(stream_g);
+ if(stream_p) fclose(stream_p);
if(estimator) SDIS(estimator_ref_put(estimator));
if(green) SDIS(green_function_ref_put(green));
if(args.rng_state) SSP(rng_ref_put(args.rng_state));
@@ -1242,7 +1284,7 @@ compute_flux_boundary(struct stardis* stardis, struct time* start)
struct sdis_solve_boundary_flux_args args
= SDIS_SOLVE_BOUNDARY_FLUX_ARGS_DEFAULT;
struct dump_path_context dump_ctx;
- FILE* stream = NULL;
+ FILE* stream_r = NULL;
struct time compute_start, compute_end;
ASSERT(stardis && start && (stardis->mode & MODE_FLUX_BOUNDARY_COMPUTE));