25 #include <sys/types.h> 33 #include "sion_debug.h" 34 #include "sion_internal.h" 36 #include "sion_filedesc.h" 38 #include "sion_flags.h" 43 #include "sion_omp_internal_gen.h" 44 #include "sion_omp_cb_gen.h" 45 #include "sion_lock.h" 51 sion_int32 _sion_omp_api_aid = -1;
52 static omp_lock_t _sion_omp_lock_data;
54 int _sion_omp_user_lock(
void * data) {
56 omp_set_lock(&_sion_omp_lock_data);
59 int _sion_omp_user_unlock(
void * data) {
61 omp_unset_lock(&_sion_omp_lock_data);
82 int sion_paropen_omp(
const char *fname,
83 const char *file_mode,
84 sion_int64 *chunksize,
85 sion_int32 *fsblksize,
90 int sid = SION_ID_UNDEF;
91 int filenumber, num_threads, thread_num;
92 int numFiles=1,gtasks, gRank, lRank, lSize;
93 _omp_api_commdata *gen_gcomm;
96 thread_num = omp_get_thread_num();
97 num_threads = omp_get_num_threads();
101 _sion_debug_set_query_thread_num_function(omp_get_thread_num);
102 omp_init_lock(&_sion_omp_lock_data);
109 DPRINTFP((1,
"sion_paropen_omp", thread_num,
"enter parallel open of file %s\n", fname));
112 if ( ! flags_store ) {
113 return(_sion_errorprint_omp(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
114 "sion_paropen_omp: could not parse file mode in %s, aborting ...\n", file_mode));
117 if (flags_store->mask&_SION_FMODE_WRITE) {
119 *globalrank = thread_num;
121 _sion_flags_destroy_store(flags_store);
126 if(_sion_omp_api_aid<0) _sion_omp_api_aid=_sion_register_callbacks_omp();
130 gen_gcomm = (_omp_api_commdata *) malloc(
sizeof(_omp_api_commdata));
131 if (gen_gcomm == NULL) {
132 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
133 "cannot allocate omp internal data structure of size %lu (_omp_api_commdata), aborting ...\n",
134 (
unsigned long)
sizeof(_omp_api_commdata)));
136 gen_gcomm->commset=1;
137 gen_gcomm->thread_num=thread_num;
138 gen_gcomm->num_threads=num_threads;
141 _sion_omp_barrier_cb(gen_gcomm);
144 lRank=gRank=thread_num;
145 lSize=gtasks=num_threads;
149 DPRINTFP((1,
"sion_paropen_omp", gRank,
"enter parallel open of %d files (current name %s) in %s mode\n", numFiles, fname, file_mode));
150 sid =
sion_generic_paropen(_sion_omp_api_aid, fname, file_mode, chunksize, fsblksize, gen_gcomm, gRank, gtasks,
151 &filenumber, &numFiles, &lRank, &lSize, fileptr, newfname);
152 DPRINTFP((1,
"sion_paropen_omp", gRank,
"leave parallel open of %d files in %s mode #tasks=%d sid=%d\n", numFiles, file_mode, lSize, sid));
156 if ( sid == SION_ID_NOT_VALID ) {
157 return(_sion_errorprint_omp(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_omp: invalid return code from internal open %d", sid));
160 DPRINTFP((1,
"sion_paropen_omp", thread_num,
"leave parallel open of file %s sid=%d\n", fname, sid));
171 int sion_parclose_omp(
int sid)
173 int rc = SION_SUCCESS;
174 ONLY_DEBUG(
int thread_num;)
177 if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
178 return(_sion_errorprint_omp(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_parclose_omp: invalid sion_filedesc %d", sid));
181 ONLY_DEBUG(thread_num = omp_get_thread_num();)
183 if(omp_get_num_threads()!=sion_filedesc->ntasks){
184 return(_sion_errorprint_omp(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
185 "sion_parclose_omp: invalid number of OpenMP threads, %d <> %d",
186 omp_get_num_threads(), sion_filedesc->ntasks));
189 DPRINTFP((1,
"sion_parclose_omp", thread_num,
"enter parallel close of sid %d\n", sid));
190 DPRINTFP((1,
"sion_parclose_omp", thread_num,
"closing %d file(s)\n", sion_filedesc->nfiles));
192 rc = sion_generic_parclose(sid);
194 DPRINTFP((1,
"sion_parclose_omp", thread_num,
"leave parallel close of sid %d rc=%d\n", sid, rc));
Sion File Descriptor Structure.
int sion_generic_paropen(int aid, const char *fname, const char *file_mode, sion_int64 *chunksize, sion_int32 *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...
_sion_flags_store * _sion_parse_flags(const char *flags)
Parse flags and return a flags store with key value pairs.