10 #define _XOPEN_SOURCE 700 17 #include "sion_common.h" 18 #include "sion_const.h" 19 #include "sion_debug.h" 20 #include "sion_error_handler.h" 22 #include "sion_filedesc.h" 23 #include "sion_flags.h" 24 #include "sion_generic.h" 25 #include "sion_internal.h" 26 #include "sion_omp_cb_gen.h" 27 #include "sion_omp_internal_gen.h" 31 int32_t _sion_omp_api_aid = -1;
32 static omp_lock_t _sion_omp_lock_data;
34 int _sion_omp_user_lock(
void *data)
36 int rc = SION_SUCCESS;
37 omp_set_lock(&_sion_omp_lock_data);
40 int _sion_omp_user_unlock(
void *data)
42 int rc = SION_SUCCESS;
43 omp_unset_lock(&_sion_omp_lock_data);
47 int sion_paropen_omp(
const char *fname,
const char *file_mode, int64_t *chunksize, int32_t *fsblksize,
int *globalrank,
48 FILE **fileptr,
char **newfname)
50 int sid = SION_ID_UNDEF;
51 int filenumber, num_threads, thread_num;
52 int numFiles = 1, gtasks, gRank, lRank, lSize;
53 _omp_api_commdata *gen_gcomm;
54 _sion_flags_store *flags_store = NULL;
56 thread_num = omp_get_thread_num();
57 num_threads = omp_get_num_threads();
61 _sion_debug_set_query_thread_num_function(omp_get_thread_num);
62 _sion_error_set_query_thread_num_function(omp_get_thread_num);
63 omp_init_lock(&_sion_omp_lock_data);
70 DPRINTFP((1,
"sion_paropen_omp", thread_num,
"enter parallel open of file %s\n", fname));
72 flags_store = _sion_parse_flags(file_mode);
74 return _sion_errorprint_omp(
75 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_paropen_omp: could not parse file mode in %s, aborting ...\n", file_mode);
78 if (flags_store->mask & _SION_FMODE_WRITE) {
80 *globalrank = thread_num;
82 _sion_flags_destroy_store(&flags_store);
87 if (_sion_omp_api_aid < 0) {
88 _sion_omp_api_aid = _sion_register_callbacks_omp();
93 gen_gcomm = malloc(
sizeof(_omp_api_commdata));
94 if (gen_gcomm == NULL) {
95 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
96 "cannot allocate omp internal data structure of size %lu (_omp_api_commdata), aborting ...\n",
97 (
unsigned long)
sizeof(_omp_api_commdata));
99 gen_gcomm->commset = 1;
100 gen_gcomm->thread_num = thread_num;
101 gen_gcomm->num_threads = num_threads;
104 _sion_omp_barrier_cb(gen_gcomm);
106 lRank = gRank = thread_num;
107 lSize = gtasks = num_threads;
112 (1,
"sion_paropen_omp", gRank,
"enter parallel open of %d files (current name %s) in %s mode\n", numFiles, fname, file_mode));
113 sid =
sion_generic_paropen(_sion_omp_api_aid, fname, file_mode, chunksize, fsblksize, gen_gcomm, gRank, gtasks, &filenumber,
114 &numFiles, &lRank, &lSize, fileptr, newfname);
115 DPRINTFP((1,
"sion_paropen_omp", gRank,
"leave parallel open of %d files in %s mode #tasks=%d sid=%d\n", numFiles, file_mode,
119 if (sid == SION_ID_NOT_VALID) {
120 return _sion_errorprint_omp(
121 SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_paropen_omp: invalid return code from internal open %d", sid);
124 DPRINTFP((1,
"sion_paropen_omp", thread_num,
"leave parallel open of file %s sid=%d\n", fname, sid));
131 int rc = SION_SUCCESS;
132 ONLY_DEBUG(
int thread_num;)
133 _sion_filedesc *sion_filedesc;
135 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
136 return _sion_errorprint_omp(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_parclose_omp: invalid sion_filedesc %d", sid);
139 ONLY_DEBUG(thread_num = omp_get_thread_num();)
141 if (omp_get_num_threads() != sion_filedesc->ntasks) {
142 return _sion_errorprint_omp(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
143 "sion_parclose_omp: invalid number of OpenMP threads, %d <> %d", omp_get_num_threads(), sion_filedesc->ntasks);
146 DPRINTFP((1,
"sion_parclose_omp", thread_num,
"enter parallel close of sid %d\n", sid));
147 DPRINTFP((1,
"sion_parclose_omp", thread_num,
"closing %d file(s)\n", sion_filedesc->nfiles));
149 rc = sion_generic_parclose(sid);
151 DPRINTFP((1,
"sion_parclose_omp", thread_num,
"leave parallel close of sid %d rc=%d\n", sid, rc));
int sion_parclose_omp(int sid)
closes a SION file previously opened in OpenMP mode
int sion_generic_paropen(int aid, const char *fname, const char *file_mode, int64_t *chunksize, int32_t *fsblksize, void *gcommgroup, int grank, int gsize, int *filenumber, int *numfiles, const int *lrank, const int *lsize, FILE **fileptr, char **newfname)
Open a sion file a generic interface.
int sion_lock_register_lock_callbacks(int lock(void *), int unlock(void *), void *lock_data)
Function which registers callback funtions for lock and unlock internal access to shared data structu...
int sion_paropen_omp(const char *fname, const char *file_mode, int64_t *chunksize, int32_t *fsblksize, int *globalrank, FILE **fileptr, char **newfname)
Open a sion file using OpenMP.