10 #define _XOPEN_SOURCE 700 
   16 #include "sion_common.h" 
   17 #include "sion_const.h" 
   18 #include "sion_debug.h" 
   19 #include "sion_enums.h" 
   20 #include "sion_error_handler.h" 
   22 #include "sion_filedesc.h" 
   23 #include "sion_generic.h" 
   25 #include "sion_omp_cb_gen.h" 
   26 #include "sion_omp_internal_gen.h" 
   30 int32_t _sion_omp_api_aid = -1;
 
   31 static omp_lock_t _sion_omp_lock_data;
 
   33 int _sion_omp_user_lock(
void *data)
 
   35   int rc = SION_SUCCESS;
 
   36   omp_set_lock(&_sion_omp_lock_data);
 
   39 int _sion_omp_user_unlock(
void *data)
 
   41   int rc = SION_SUCCESS;
 
   42   omp_unset_lock(&_sion_omp_lock_data);
 
   48   int rc = SION_SUCCESS;
 
   49   ONLY_DEBUG(
int thread_num;)
 
   50   _sion_filedesc *sion_filedesc;
 
   52   if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
 
   53     return _sion_errorprint_omp(SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_parclose_omp: invalid sion_filedesc %d", sid);
 
   56   ONLY_DEBUG(thread_num = omp_get_thread_num();)
 
   58   if (omp_get_num_threads() != sion_filedesc->ntasks) {
 
   59     return _sion_errorprint_omp(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
 
   60       "sion_parclose_omp: invalid number of OpenMP threads, %d <> %d", omp_get_num_threads(), sion_filedesc->ntasks);
 
   63   DPRINTFP((1, 
"sion_parclose_omp", thread_num, 
"enter parallel close of sid %d\n", sid));
 
   64   DPRINTFP((1, 
"sion_parclose_omp", thread_num, 
"closing %d file(s)\n", sion_filedesc->nfiles));
 
   68   DPRINTFP((1, 
"sion_parclose_omp", thread_num, 
"leave parallel close of sid %d rc=%d\n", sid, rc));
 
   76     *options = SION_OMP_OPTIONS_INIT;
 
  130   int thread_num = omp_get_thread_num();
 
  131   int num_threads = omp_get_num_threads();
 
  135     _sion_debug_set_query_thread_num_function(omp_get_thread_num);
 
  136     _sion_error_set_query_thread_num_function(omp_get_thread_num);
 
  137     omp_init_lock(&_sion_omp_lock_data);
 
  142   DPRINTFP((1, __func__, thread_num, 
"enter parallel open of file %s\n", fname));
 
  146   if (_sion_omp_api_aid < 0) {
 
  147     _sion_omp_api_aid = _sion_register_callbacks_omp();
 
  151   _omp_api_commdata *gen_gcomm = malloc(
sizeof(_omp_api_commdata));
 
  153     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
 
  154       "cannot allocate omp internal data structure of size %lu (_omp_api_commdata), aborting ...\n",
 
  155       (
unsigned long)
sizeof(_omp_api_commdata));
 
  157   gen_gcomm->commset = 1;
 
  158   gen_gcomm->thread_num = thread_num;
 
  159   gen_gcomm->num_threads = num_threads;
 
  162   _sion_omp_barrier_cb(gen_gcomm);
 
  166   DPRINTFP((1, 
"sion_paropen_omp", thread_num, 
"enter parallel open of 1 file (current name %s)\n", fname));
 
  168     _sion_omp_api_aid, fname, mode, gen_gcomm, thread_num, num_threads, 0, 1, thread_num, num_threads, &options.generic_options);
 
  171   DPRINTFP((1, 
"sion_paropen_omp", thread_num, 
"leave parallel open of 1 file #tasks=%d sid=%d\n", num_threads, sid));
 
  174   if (sid == SION_ID_NOT_VALID) {
 
  175     return _sion_errorprint_omp(
 
  176       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_paropen_omp: invalid return code from internal open %d", sid);
 
  179   DPRINTFP((1, 
"sion_paropen_omp", thread_num, 
"leave parallel open of file %s sid=%d\n", fname, sid));
 
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_open_mode
specifies for what type of access to open a file
sion_lowlevel_api
specifies a low-level API to use for file system access
sion_endianness
declares the endianness of user data written to a file
sion_keyval_mode
specifies whether to use SIONlib's key-value mechanism for accessing file content and if so in what m...
void sion_generic_options_set_collective_size(sion_generic_options *options, int32_t size)
Enable collective I/O.
void sion_generic_options_set_fsblksize(sion_generic_options *options, int32_t fsblksize)
Set the file system block size to assume.
void sion_generic_options_set_collective_merge(sion_generic_options *options)
Use collective merging.
int sion_generic_paropen(int aid, const char *fname, sion_open_mode mode, void *gcommgroup, int grank, int gsize, int filenumber, int numfiles, int lrank, int lsize, const sion_generic_options *options_)
Open a SIONlib file through a generic interface.
void sion_generic_options_set_endianness(sion_generic_options *options, sion_endianness endianness)
Set the endianness for the contents of a container.
void sion_generic_options_set_chunksize(sion_generic_options *options, int64_t chunksize)
Set the chunk size of a logical file in the container.
void sion_generic_options_set_lowlevel_api(sion_generic_options *options, sion_lowlevel_api lowlevel_api)
Set the low-level API to use for opening a container.
void sion_generic_options_set_keyval_mode(sion_generic_options *options, sion_keyval_mode keyval_mode)
Set the key-value mode to use for a container.
int sion_generic_parclose(int sid)
Close a SIONlib file.
void sion_omp_options_set_collective_merge(sion_omp_options *options)
Use collective merging.
void sion_omp_options_set_fsblksize(sion_omp_options *options, int32_t fsblksize)
Set the file system block size to assume.
void sion_omp_options_set_endianness(sion_omp_options *options, sion_endianness endianness)
Set the endianness for the contents of a container.
void sion_omp_options_set_chunksize(sion_omp_options *options, int64_t chunksize)
Set the chunk size of a logical file in the container.
sion_omp_options * sion_omp_options_new()
Allocates and initializes an instance of sion_omp_options
void sion_omp_options_set_lowlevel_api(sion_omp_options *options, sion_lowlevel_api lowlevel_api)
Set the low-level API to use for opening a container.
struct sion_omp_options sion_omp_options
Holds non-essential arguments for sion_paropen_omp().
int sion_parclose_omp(int sid)
closes a SIONlib file previously opened in OpenMP mode
void sion_omp_options_set_collective_size(sion_omp_options *options, int32_t size)
Enable collective I/O.
void sion_omp_options_set_keyval_mode(sion_omp_options *options, sion_keyval_mode keyval_mode)
Set the key-value mode to use for a container.
int sion_paropen_omp(const char *fname, sion_open_mode mode, const sion_omp_options *options_)
Open a SIONlib file from multiple OpenMP threads.
void sion_omp_options_set_collective(sion_omp_options *options)
Enable collective I/O.
void sion_omp_options_delete(sion_omp_options *options)
Delete an instance of sion_omp_options