23 #include <sys/types.h>    30 #include "sion_error_handler.h"    40 #include "sion_generic_buddy.h"    44 int sion_generic_create_api( 
char *name ) {
    45   int apiid = SION_ID_UNDEF;
    50     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_generic_create_api: problems to alloc apidesc, aborting ...\n"));
    55     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_generic_create_api: name for API not given, aborting ...\n"));
    58   sion_apidesc->name=strdup(name);
    61   sion_apidesc->aid=apiid;
    62   sion_apidesc->level=SION_GENERIC_API_LEVEL_NONE;
    64   DPRINTFP((2, 
"_sion_generic_create_api", _SION_DEFAULT_RANK, 
"API created with name %s apiid=%d\n", sion_apidesc->name, apiid));
    69 int sion_generic_free_api( 
int aid ) {
    71   int rc = SION_SUCCESS;
    74     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_free_api: invalid sion_apidesc %d", aid));
    82 int sion_generic_register_create_local_commgroup_cb(
int aid, 
int create_lcg_cb(
void **, 
void *, 
int, 
int, 
int, 
int, 
int, 
int)) {
    84   int rc = SION_SUCCESS;
    87     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_create_local_commgroup_cb: invalid sion_apidesc %d", aid));
    90   if(sion_apidesc->create_lcg_cb!=NULL) {
    91     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_create_local_commgroup_cb: update_cb already registered for apiid=%d", aid));
    93   sion_apidesc->create_lcg_cb=create_lcg_cb;
    97   DPRINTFP((2, 
"sion_generic_register_create_local_commgroup_cb", _SION_DEFAULT_RANK, 
"create_lcg_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
   102 int sion_generic_register_free_local_commgroup_cb(
int aid, 
int free_lcg_cb(
void *)) {
   104   int rc = SION_SUCCESS;
   107     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_free_local_commgroup_cb: invalid sion_apidesc %d", aid));
   110   if(sion_apidesc->free_lcg_cb!=NULL) {
   111     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_free_local_commgroup_cb: update_cb already registered for apiid=%d", aid));
   113   sion_apidesc->free_lcg_cb=free_lcg_cb;
   117   DPRINTFP((2, 
"sion_generic_register_free_local_commgroup_cb", _SION_DEFAULT_RANK, 
"free_lcg_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
   123 int sion_generic_register_barrier_cb(
int aid, 
int barrier_cb(
void *)) {
   125   int rc = SION_SUCCESS;
   128     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_barrier_cb: invalid sion_apidesc %d", aid));
   131   if(sion_apidesc->barrier_cb!=NULL) {
   132     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_barrier_cb: barrier_cb already registered for apiid=%d", aid));
   134   sion_apidesc->barrier_cb=barrier_cb;
   138   DPRINTFP((2, 
"sion_generic_register_barrier_cb", _SION_DEFAULT_RANK, 
"barrier_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
   143 int sion_generic_register_bcastr_cb(
int aid, 
int bcastr_cb(
void *,
void *, 
int,
int,
int)) {
   145   int rc = SION_SUCCESS;
   148     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_bcastr_cb: invalid sion_apidesc %d", aid));
   151   if(sion_apidesc->bcastr_cb!=NULL) {
   152     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_bcastr_cb: bcastr_cb already registered for apiid=%d", aid));
   154   sion_apidesc->bcastr_cb=bcastr_cb;
   158   DPRINTFP((2, 
"sion_generic_register_bcastr_cb", _SION_DEFAULT_RANK, 
"bcastr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
   163 int sion_generic_register_gatherr_cb(
int aid, 
int gatherr_cb(
void *,
void *,
void *, 
int,
int,
int)) {
   165   int rc = SION_SUCCESS;
   168     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_gatherr_cb: invalid sion_apidesc %d", aid));
   171   if(sion_apidesc->gatherr_cb!=NULL) {
   172     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_gatherr_cb: gatherr_cb already registered for apiid=%d", aid));
   174   sion_apidesc->gatherr_cb=gatherr_cb;
   178   DPRINTFP((2, 
"sion_generic_register_gatherr_cb", _SION_DEFAULT_RANK, 
"gatherr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
   183 int sion_generic_register_gathervr_cb(
int aid, 
int gathervr_cb(
void *,
void *,
void *, 
int, 
int *, 
int, 
int)) {
   185   int rc = SION_SUCCESS;
   188     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_gathervr_cb: invalid sion_apidesc %d", aid));
   191   if(sion_apidesc->gathervr_cb!=NULL) {
   192     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_gathervr_cb: gathervr_cb already registered for apiid=%d", aid));
   194   sion_apidesc->gathervr_cb=gathervr_cb;
   198   DPRINTFP((2, 
"sion_generic_register_gathervr_cb", _SION_DEFAULT_RANK, 
"gathervr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
   203 int sion_generic_register_scatterr_cb(
int aid, 
int scatterr_cb(
void *,
void *,
void *, 
int,
int,
int)) {
   205   int rc = SION_SUCCESS;
   208     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_scatterr_cb: invalid sion_apidesc %d", aid));
   211   if(sion_apidesc->scatterr_cb!=NULL) {
   212     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_scatterr_cb: scatterr_cb already registered for apiid=%d", aid));
   214   sion_apidesc->scatterr_cb=scatterr_cb;
   218   DPRINTFP((2, 
"sion_generic_register_scatterr_cb", _SION_DEFAULT_RANK, 
"scatterr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
   223 int sion_generic_register_scattervr_cb(
int aid, 
int scattervr_cb(
void *,
void *,
void *, 
int, 
int *, 
int, 
int)) {
   225   int rc = SION_SUCCESS;
   228     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid));
   231   if(sion_apidesc->scattervr_cb!=NULL) {
   232     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_scattervr_cb: scattervr_cb already registered for apiid=%d", aid));
   234   sion_apidesc->scattervr_cb=scattervr_cb;
   238   DPRINTFP((2, 
"sion_generic_register_scattervr_cb", _SION_DEFAULT_RANK, 
"scattervr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
   243 int sion_generic_register_gather_and_execute_cb(
int aid, 
int gather_execute_cb(
const void *, sion_int64*, 
int, sion_int64, 
   244                                            void *, 
int, 
int, 
int, 
int,
   245                                            int process_cb(
const void *,sion_int64 *, 
int))) {
   247   int rc = SION_SUCCESS;
   250     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_gather_and_execute_cb: invalid sion_apidesc %d", aid));
   253   if(sion_apidesc->gather_execute_cb!=NULL) {
   254     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_gather_and_execute_cb: scattervr_cb already registered for apiid=%d", aid));
   256   sion_apidesc->gather_execute_cb=gather_execute_cb;
   260   DPRINTFP((2, 
"sion_generic_register_gather_and_execute_cb", _SION_DEFAULT_RANK, 
"gather_execute_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
   265 int sion_generic_register_execute_and_scatter_cb(
int aid, 
int execute_scatter_cb(
void *, sion_int64*, 
int, sion_int64, 
   266                                              void *, 
int, 
int, 
int, 
int,
   267                                              int process_cb(
void *,sion_int64 *, 
int))) {
   269   int rc = SION_SUCCESS;
   272     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_execute_and_scatter_cb: invalid sion_apidesc %d", aid));
   275   if(sion_apidesc->execute_scatter_cb!=NULL) {
   276     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_execute_and_scatter_cb: scattervr_cb already registered for apiid=%d", aid));
   278   sion_apidesc->execute_scatter_cb=execute_scatter_cb;
   280   DPRINTFP((2, 
"sion_generic_register_execute_and_scatter_cb", _SION_DEFAULT_RANK, 
"gather_execute_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
   285 int sion_generic_register_get_multi_filename_cb(
int aid, 
char *get_multi_filename_cb(
const char *,
int)) {
   290     return(_sion_errorprint(-1,_SION_ERROR_RETURN,
"sion_generic_register_get_multi_filename_cb: invalid sion_apidesc %d", aid));
   293   if(sion_apidesc->get_multi_filename_cb!=NULL) {
   294     return(_sion_errorprint(-1,_SION_ERROR_RETURN,
"sion_generic_register_get_multi_filename_cb: get_multi_filename_cb already registered for apiid=%d", aid));
   296   sion_apidesc->get_multi_filename_cb=get_multi_filename_cb;
   300   DPRINTFP((2, 
"sion_generic_register_get_multi_filename_cb", -1, 
"get_multi_filename_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
   305 int sion_generic_register_get_capability_cb(
int aid, 
int get_capability_cb(
void *)) {
   307   int rc = SION_SUCCESS;
   310     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_get_capability_cb: invalid sion_apidesc %d", aid));
   313   if(sion_apidesc->get_capability_cb!=NULL) {
   314     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_generic_register_get_capability_cb: get_capability_cb already registered for apiid=%d", aid));
   316   sion_apidesc->get_capability_cb=get_capability_cb;
   320   DPRINTFP((2, 
"sion_generic_register_get_capability_cb", _SION_DEFAULT_RANK, 
"get_capability_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
   351                          const char* file_mode,
   352                          sion_int64* chunksize,
   353                          sion_int32* fsblksize,
   365   int        rc, sid = SION_ID_UNDEF;
   366   sion_int32 lfsblksize;
   367   sion_int64 lchunksize;
   369   char       *nfname=NULL,*lprefix=NULL;
   375    DPRINTFTS(grank, 
"enter sion_generic_paropen");
   376   DPRINTFP((1, 
"sion_generic_paropen", grank, 
"enter generic parallel open of FILE %s (global: %d of %d, local: %d of %d, file: %d of %d )\n", 
   377         fname, grank, gsize, *lrank, *lsize, *filenumber, *numfiles));
   380     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid));
   383   if ( (sion_apidesc->level!=SION_GENERIC_API_LEVEL_STD) && 
   384        (sion_apidesc->level!=SION_GENERIC_API_LEVEL_FULL) ) {
   385     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: API %s not correctly initalized, aborting",sion_apidesc->name));
   389   if ( (grank < 0 ) || (grank >= gsize) ) {
   390     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: global rank %d not valid (0..%d)",grank,gsize));
   395   if(strstr(fname,
".def")!=NULL) {
   400     lfsblksize=*fsblksize;
   401     lchunksize=*chunksize;
   405   DPRINTFP((1, 
"sion_generic_paropen", grank, 
"setting fsblksize = %d for file %s\n", lfsblksize, fname));
   410     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: problems to alloc gendata, aborting ...\n"));
   414   sion_gendata->aid=aid;
   415   sion_gendata->apidesc=sion_apidesc;
   416   sion_gendata->comm_data_global=gcommgroup;
   417   sion_gendata->comm_data_local=NULL;
   418   sion_gendata->grank=grank;
   419   sion_gendata->gsize=gsize;
   422   if ( ! flags_store ) {
   423     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: could not parse file mode in %s, aborting ...\n", file_mode));
   426   if (flags_store->mask&_SION_FMODE_WRITE) {
   430       _sion_flags_destroy_store(&flags_store);
   431       return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: No lrank variable given"));
   434       _sion_flags_destroy_store(&flags_store);
   435       return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: No lsize variable given"));
   437     if ( (*lrank < 0 ) || (*lrank >= *lsize) ) {
   438       _sion_flags_destroy_store(&flags_store);
   439       return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: local rank %d not valid (0..%d)",*lrank,*lsize));
   441     sion_gendata->lrank=*lrank;
   442     sion_gendata->lsize=*lsize;
   444     if (filenumber == NULL) {
   445       _sion_flags_destroy_store(&flags_store);
   446       return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: No filenumber variable given"));
   448     if (numfiles == NULL) {
   449       _sion_flags_destroy_store(&flags_store);
   450       return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: No numfiles variable given"));
   452     if ( (*filenumber < 0 ) || (*filenumber >= *numfiles) ) {
   453       _sion_flags_destroy_store(&flags_store);
   454       return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: file number %d not valid (0..%d)",*filenumber,*numfiles));
   456     sion_gendata->filenumber=*filenumber;
   457     sion_gendata->numfiles=*numfiles;
   459     lprefix = calloc(SION_FILENAME_LENGTH,1);
   460     if (lprefix == NULL) {
   461       _sion_flags_destroy_store(&flags_store);
   462       return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: cannot allocate temporary memory of size %lu (lprefix), aborting ...\n", (
unsigned long) SION_FILENAME_LENGTH));
   465     strcpy(lprefix, fname);
   467   } 
else if (flags_store->mask&_SION_FMODE_READ) {
   470     DPRINTFP((1, 
"sion_generic_paropen", grank, 
"READ: buddy=%d\n", flags_store->mask&_SION_FMODE_BUDDY));
   473     if(! (flags_store->mask&_SION_FMODE_BUDDY) ) { 
   475       rc = _sion_generic_get_and_distribute_info_from_file(sion_gendata, fname);
   476       *numfiles=sion_gendata->numfiles;
   477       *filenumber=sion_gendata->filenumber;
   478       if(rc != SION_SUCCESS) {
   479     _sion_flags_destroy_store(&flags_store);
   480     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: error in _sion_generic_get_and_distribute_info_from_file"));
   486       sion_gendata->lrank=*lrank;
   487       sion_gendata->lsize=*lsize;
   489       if (filenumber == NULL) 
return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: No filenumber variable given"));
   490       if (numfiles == NULL)   
return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: No numfiles variable given"));
   491       if ( (*filenumber < 0 ) || (*filenumber >= *numfiles) ) {
   492     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: file number %d not valid (0..%d)",*filenumber,*numfiles));
   494       sion_gendata->filenumber=*filenumber;
   495       sion_gendata->numfiles=*numfiles;
   501     _sion_flags_destroy_store(&flags_store);
   502     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: unknown file mode"));
   506   rc=sion_apidesc->create_lcg_cb(&sion_gendata->comm_data_local,sion_gendata->comm_data_global,
   507                  sion_gendata->grank,sion_gendata->gsize,
   508                  sion_gendata->lrank,sion_gendata->lsize,
   509                  sion_gendata->filenumber,sion_gendata->numfiles);
   511     _sion_flags_destroy_store(&flags_store);
   512     if(lprefix) free(lprefix);
   513     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_paropen_generic: error in create_local_commgroup callback function"));
   517   nfname=(sion_apidesc->get_multi_filename_cb?sion_apidesc->get_multi_filename_cb:
_sion_get_multi_filename)(fname,sion_gendata->filenumber);
   518   help_globalrank=sion_gendata->grank;
   523   if(! (flags_store->mask&_SION_FMODE_BUDDY) ) {
   526     DPRINTFP((1, 
"sion_generic_paropen", grank, 
"call parallel open of %d files (current name %s) in %s mode\n", sion_gendata->numfiles, nfname, file_mode));
   527     rc=
_sion_paropen_generic_one_file(sid, nfname, flags_store, lprefix, &sion_gendata->numfiles, &sion_gendata->filenumber, &lchunksize, &lfsblksize, 
   528                        sion_gendata->lrank, sion_gendata->lsize, &help_globalrank, 
   529                       _SION_INTERNAL_FLAG_NORMAL, fileptr, sion_gendata, NULL);
   530     DPRINTFP((1, 
"sion_generic_paropen", sion_gendata->grank, 
"leave parallel open of %d files in %s mode #tasks=%d sid=%d globalrank=%d\n", sion_gendata->numfiles, 
   531           file_mode, sion_gendata->lsize, sid, sion_gendata->grank));
   536     DPRINTFP((1, 
"sion_generic_paropen", grank, 
"call parallel buddy open of %d files (current name %s) in %s mode\n", sion_gendata->numfiles, nfname, file_mode));
   537     rc=_sion_paropen_generic_buddy(sid, fname, flags_store, lprefix, &sion_gendata->numfiles, &sion_gendata->filenumber, &lchunksize, &lfsblksize, 
   538                    sion_gendata->lrank, sion_gendata->lsize, &help_globalrank, 
   539                    fileptr, sion_gendata);
   540     DPRINTFP((1, 
"sion_generic_paropen", sion_gendata->grank, 
"leave parallel buddy open of %d files in %s mode #tasks=%d sid=%d globalrank=%d rc=%d\n", sion_gendata->numfiles, 
   541           file_mode, sion_gendata->lsize, sid, sion_gendata->grank, rc));
   545   _sion_flags_destroy_store(&flags_store);
   549     DPRINTFP((1, 
"sion_generic_paropen", sion_gendata->grank, 
"invalid rc %d or sion_filedesc %d", rc, sid));
   550     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen: invalid rc %d or sion_filedesc %d", rc, sid));
   554   sion_filedesc->
dataptr=sion_gendata;
   559     if(nfname) free(nfname);
   563   *fsblksize  = lfsblksize;
   564   *chunksize  = lchunksize;
   568   DPRINTFP((64, 
"sion_generic_paropen", grank, 
"lprefix=%s (%x)\n", lprefix,lprefix));
   569   if(lprefix) free(lprefix);
   571   DPRINTFP((1, 
"sion_generic_paropen", grank, 
"leave parallel open of file %s sid=%d\n", fname, sid));
   572    DPRINTFTS(-1, 
"leave sion_generic_paropen");
   578 int sion_generic_parclose(
int sid) {
   579   ONLY_DEBUG(
int grank);
   580   int       mapping_size=0, rc=SION_SUCCESS;
   581   sion_int32 *mapping=NULL;
   587    DPRINTFTS(-1, 
"enter sion_generic_parclose");
   590     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_parclose: invalid sion_filedesc %d", sid));
   592   sion_gendata=sion_filedesc->
dataptr;
   593   sion_apidesc=sion_gendata->apidesc;
   595   ONLY_DEBUG(grank=sion_gendata->grank);
   597   DPRINTFP((1, 
"sion_generic_parclose", grank, 
"enter parallel close of sid %d (%d file)\n", sid, sion_filedesc->
nfiles));
   600   _sion_generic_collect_mapping(sion_filedesc,&mapping_size,&mapping);
   604                  sion_gendata, NULL );
   606     rc = _sion_parclose_generic_buddy( sid, sion_filedesc->
rank, sion_filedesc->
ntasks, mapping_size, mapping, sion_gendata );
   610   if (sion_apidesc->free_lcg_cb && sion_gendata->comm_data_local) {
   611     sion_apidesc->free_lcg_cb(sion_gendata->comm_data_local);
   613   _SION_SAFE_FREE(mapping, NULL);
   617   sion_apidesc->barrier_cb(sion_gendata->comm_data_global);
   619   _SION_SAFE_FREE(sion_gendata, NULL);
   621   DPRINTFP((1, 
"sion_generic_parclose", grank, 
"leave parallel close of sid %d\n", sid));
   622    DPRINTFTS(-1, 
"leave sion_generic_parclose");
   628 int sion_generic_paropen_mapped(
int         aid,
   630                 const char *file_mode,
   637                 sion_int64 **chunksizes,
   638                 int        **mapping_filenrs, 
   639                 int        **mapping_lranks,
   640                 sion_int32 *fsblksize,
   643   int        rc, sid = SION_ID_UNDEF;
   650    DPRINTFTS(grank, 
"enter sion_generic_paropen_mapped");
   651   DPRINTFP((1, 
"sion_generic_paropen_mapped", grank, 
"enter generic parallel mapped open of file %s (global: %d of %d, nlocaltasks %d)\n", 
   652         fname, grank, gsize, *nlocaltasks));
   655     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid));
   658   if ((!sion_apidesc->create_lcg_cb) || (!sion_apidesc->free_lcg_cb) || (!sion_apidesc->barrier_cb) ||  (!sion_apidesc->bcastr_cb) ||  
   659       (!sion_apidesc->gatherr_cb) ||  (!sion_apidesc->gathervr_cb) ||   (!sion_apidesc->scatterr_cb) ||  (!sion_apidesc->scattervr_cb) ) {
   660     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: API %s not correctly initalized, aborting",sion_apidesc->name));
   664   if ( (grank < 0 ) || (grank >= gsize) ) {
   665     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: global rank %d not valid (0..%d)",grank,gsize));
   671     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: problems to alloc gendata, aborting ...\n"));
   675   sion_gendata->aid=aid;
   676   sion_gendata->apidesc=sion_apidesc;
   677   sion_gendata->comm_data_global=gcommgroup;
   678   sion_gendata->grank=grank;
   679   sion_gendata->gsize=gsize;
   680   sion_gendata->lrank=-1;
   681   sion_gendata->lsize=-1;
   682   sion_gendata->filenumber=-1;
   683   sion_gendata->numfiles=-1;
   684   sion_gendata->comm_data_local=NULL;
   687   if ( ! flags_store ) {
   688     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: could not parse file mode in %s, aborting ...\n", file_mode));
   691   if (flags_store->mask&_SION_FMODE_WRITE) {
   696     lprefix = calloc(SION_FILENAME_LENGTH,1);
   697     if (lprefix == NULL) {
   698       _sion_flags_destroy_store(&flags_store);
   699       return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: cannot allocate temporary memory of size %lu (lprefix), aborting ...\n", (
unsigned long) SION_FILENAME_LENGTH));
   701     strcpy(lprefix, fname);
   703   } 
else if (flags_store->mask&_SION_FMODE_READ) {
   708     _sion_flags_destroy_store(&flags_store);
   709     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: unknown file mode"));
   714   DPRINTFP((1, 
"sion_generic_paropen_mapped", grank, 
"enter parallel mapped open  in %s mode\n", file_mode));
   716                   numFiles, nlocaltasks, globalranks, chunksizes, mapping_filenrs, mapping_lranks, 
   717                   fsblksize, grank, gsize, _SION_INTERNAL_FLAG_NORMAL,
   718                   fileptr, sion_gendata);
   719   sion_gendata->numfiles=*numFiles;
   720   DPRINTFP((1, 
"sion_generic_paropen_mapped", sion_gendata->grank, 
"leave parallel open of %d files in %s mode #tasks=%d sid=%d globalrank=%d\n", sion_gendata->numfiles, 
   721                                    file_mode, sion_gendata->lsize, sid, sion_gendata->grank));
   723   _sion_flags_destroy_store(&flags_store);
   727     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_paropen_mapped: invalid sion_filedesc %d", sid));
   731   sion_filedesc->
dataptr=sion_gendata;
   735   DPRINTFP((1, 
"sion_generic_paropen_mapped", grank, 
"lprefix=%s (%x)\n", lprefix,lprefix));
   736   if(lprefix) free(lprefix);
   738   DPRINTFP((1, 
"sion_generic_paropen_mapped", grank, 
"leave parallel open of file %s sid=%d\n", fname, sid));
   739    DPRINTFTS(-1, 
"leave sion_generic_paropen_mapped");
   745 int sion_generic_parclose_mapped(
int sid)
   747   int       grank, gsize, rc;
   751    DPRINTFTS(-1, 
"enter sion_generic_parclose_mapped");
   753     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_parclose_mapped: invalid sion_filedesc %d", sid));
   755   sion_gendata=sion_filedesc->
dataptr;
   757   grank=sion_gendata->grank;
   758   gsize=sion_gendata->gsize;
   760   DPRINTFP((1, 
"sion_generic_parclose_mapped", grank, 
"enter parallel close of sid %d\n", sid));
   762   DPRINTFP((1, 
"sion_generic_parclose_mapped", grank, 
"closing %d file(s)\n", sion_filedesc->
nfiles));
   764   rc = _sion_parclose_mapped_generic(sid, grank, gsize,sion_gendata);
   770   DPRINTFP((1, 
"sion_generic_parclose_mapped", grank, 
"leave parallel close of sid %d\n", sid));
   771    DPRINTFTS(-1, 
"leave sion_generic_parclose_mapped");
   777 int _sion_generic_get_and_distribute_info_from_file(  
_sion_generic_gendata *sion_gendata, 
const char *fname)
   779   int       sid = -1,  ntasks = -1, nfiles = -1, t = 0;
   780   int       rc = SION_SUCCESS;
   782   sion_int32 fsblksize;
   784   int         mapping_size = -1;
   785   sion_int32 *mapping = NULL;
   789   sion_apidesc=sion_gendata->apidesc;
   791   if(sion_gendata->grank == 0) {
   793     DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"before open\n"));
   794     sid=
_sion_open_read(fname,_SION_FMODE_READ|_SION_FMODE_ANSI,_SION_READ_MASTER_ONLY_OF_MULTI_FILES,
   795             &ntasks,&nfiles,NULL,&fsblksize,NULL,&fileptr);
   798       DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"after open\n"));
   800       DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"sion file %d files\n", sion_gendata->numfiles));
   802       sion_gendata->numfiles=-1;
   807   sion_apidesc->bcastr_cb(&sion_gendata->numfiles, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
   809   if((sion_gendata->grank == 0) && (sion_gendata->numfiles>1)) {
   810     if(mapping_size!=sion_gendata->gsize) {
   811       return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_generic_get_and_distribute_info_from_file: Incorrect sum of ntasks of files %d <> %d\n", mapping_size, sion_gendata->gsize));
   815   if(sion_gendata->numfiles<0) {
   816     return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_generic_get_and_distribute_info_from_file: could not get numfiles from sion file\n"));
   819   if(sion_gendata->numfiles>1) {
   820     DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"before scatter\n"));
   821     if(sion_gendata->grank==0) {
   822       for(t=0;t<mapping_size;t++) {
   823     DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"  %d -> (%d,%d)\n",t,mapping[t*2],mapping[t*2+1]));
   827     sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global, _SION_INT32, 2, 0);
   828     sion_gendata->filenumber=lpos[0];
   829     sion_gendata->lrank     =lpos[1];
   830     DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"after scatter filenum+lrank (%d,%d)\n",sion_gendata->filenumber,sion_gendata->lrank));
   832     if(sion_gendata->grank==0) {
   833       tasksinfile = (
int *) malloc(sion_gendata->numfiles * 
sizeof(
int));
   834       if (tasksinfile == NULL) {
   835     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"_sion_generic_get_and_distribute_info_from_file: Cannot allocate memory for tasksinfile counter vector"));
   837       for(t=0;t<sion_gendata->numfiles;t++) tasksinfile[t]=0;                   
   838       for(t=0;t<mapping_size;t++)  tasksinfile[ mapping[t*2] ]++;                 
   839       for(t=0;t<mapping_size;t++)  mapping[t*2+1]=tasksinfile[ mapping[t*2] ];  
   841     sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global, _SION_INT32, 2, 0);
   842     sion_gendata->lsize     =lpos[1];
   843     DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"after scatter lsize (%d, %d of %d)\n",sion_gendata->filenumber, sion_gendata->lrank, sion_gendata->lsize));
   845     if(sion_gendata->grank==0) {
   846       if(tasksinfile) free(tasksinfile);
   851     sion_gendata->filenumber=0;
   852     sion_gendata->lrank     = sion_gendata->grank;
   853     sion_gendata->lsize     = sion_gendata->gsize;
   854     DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"only one file -> filenumber=%d lRank=%d\n",sion_gendata->filenumber,sion_gendata->lrank));
   857   if(sion_gendata->grank == 0) {
   859     if (sid>=0) _sion_close_sid(sid);
   865 int sion_generic_parreinit(
int sid, sion_int64 chunksize ) {
   866   int       grank, gsize, rc;
   871     return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_generic_parreinit: invalid sion_filedesc %d", sid));
   873   sion_gendata=sion_filedesc->
dataptr;
   875   grank=sion_gendata->grank;
   876   gsize=sion_gendata->gsize;
   878   DPRINTFP((1, 
"sion_generic_parreinit", grank, 
"enter parallel reinit of sid %d\n", sid));
   882   DPRINTFP((1, 
"sion_generic_parreinit", grank, 
"leave parallel reinit of sid %d\n", sid));
 
_sion_generic_gendata * _sion_generic_alloc_gendata()
Allocates memory for internal sion api data structure needed for each SION file.
Sion File Descriptor Structure.
int _sion_generic_free_apidesc(_sion_generic_apidesc *sion_apidesc)
free apidesc structure
int _sion_paropen_generic_one_file(int sid, char *fname, _sion_flags_store *flags_store, char *prefix, int *numFiles, int *filenumber, sion_int64 *chunksize, sion_int32 *fsblksize, int rank, int ntasks, int *globalrank, int flag, FILE **fileptr, _sion_generic_gendata *sion_gendata, _sion_generic_buddy *buddy_data)
Generic parallel open of one direct access file.
int _sion_parclose_generic(int sid, int rank, int ntasks, int mapping_size, sion_int32 *mapping, int flag, _sion_generic_gendata *sion_gendata, _sion_generic_buddy *buddy_data)
Internal function to close parallel opened SION file.
_sion_generic_apidesc * _sion_generic_alloc_apidesc()
Allocates memory for internal sion api desc 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_paropen_mapped_generic(int sid, char *fname, sion_int64 file_mode_flags, char *prefix, int *numFiles, int *nlocaltasks, int **globalranks, sion_int64 **chunksizes, int **mapping_filenrs, int **mapping_lranks, sion_int32 *fsblksize, int rank, int ntasks, int flag, FILE **fileptr, _sion_generic_gendata *sion_gendata)
Generic parallel open of one direct access file. Mapping sion files to environment with less tasks.
int _sion_vcdtype(int sid)
_sion_flags_store * _sion_parse_flags(const char *flags)
Parse flags and return a flags store with key value pairs.
int _sion_parreinit_generic(int sid, sion_int64 chunksize, int rank, int ntasks, _sion_generic_gendata *sion_gendata)
change chunksize for an already opened SION file (write)
int sion_get_mapping(int sid, int *mapping_size, sion_int32 **mapping, int *numfiles)
Returns pointers to the internal field mapping.
void * _sion_vcdtovcon(int sid)
int _sion_newvcd(void *data, int type)
char * _sion_get_multi_filename(const char *fname, int filenumber)
generates the multi filename
#define SION_FILEDESCRIPTOR
int _sion_freevcd(int sid)
int _sion_generic_update_api_level(_sion_generic_apidesc *sion_apidesc)
Update API level.
int _sion_generic_init_apidesc(_sion_generic_apidesc *sion_apidesc)
Initialize the sion api description.
int _sion_generic_free_gendata(_sion_generic_gendata *sion_gendata)
Free sion gendata description.
int _sion_generic_init_gendata(_sion_generic_gendata *sion_gendata)
Initialize the sion file description.
#define SION_APIDESCRIPTOR
int _sion_open_read(const char *fname, sion_int64 file_mode_flags, int read_all, int *ntasks, int *nfiles, sion_int64 **chunksizes, sion_int32 *fsblksize, int **globalranks, FILE **fileptr)
internal sion serial open function for reading on one or more files