SIONlib  1.6.2
Scalable I/O library for parallel access to task-local files
sion_generic.c
Go to the documentation of this file.
1 /****************************************************************************
2 ** SIONLIB http://www.fz-juelich.de/jsc/sionlib **
3 *****************************************************************************
4 ** Copyright (c) 2008-2016 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include <stdarg.h>
18 #include <string.h>
19 #include <time.h>
20 
21 #include <sys/time.h>
22 
23 #include <sys/types.h>
24 #include <fcntl.h>
25 
26 #include <unistd.h>
27 
28 #include "sion.h"
29 #include "sion_debug.h"
30 #include "sion_internal.h"
31 #include "sion_fd.h"
32 #include "sion_filedesc.h"
33 #include "sion_printts.h"
34 #include "sion_flags.h"
35 
36 #include "sion_generic_internal.h"
37 #include "sion_generic_apidesc.h"
38 #include "sion_generic_mapped.h"
39 #include "sion_generic.h"
40 
41 
42 int sion_generic_create_api( char *name ) {
43  int apiid = SION_ID_UNDEF;
44  _sion_generic_apidesc *sion_apidesc;
45 
46  sion_apidesc=_sion_generic_alloc_apidesc();
47  if(!sion_apidesc) {
48  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"_sion_generic_create_api: problems to alloc apidesc, aborting ...\n"));
49  }
50  _sion_generic_init_apidesc(sion_apidesc);
51 
52  if (name == NULL) {
53  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"_sion_generic_create_api: name for API not given, aborting ...\n"));
54  }
55 
56  sion_apidesc->name=strdup(name);
57 
58  apiid = _sion_newvcd(sion_apidesc,SION_APIDESCRIPTOR);
59  sion_apidesc->aid=apiid;
60  sion_apidesc->level=SION_GENERIC_API_LEVEL_NONE;
61 
62  DPRINTFP((2, "_sion_generic_create_api", _SION_DEFAULT_RANK, "API created with name %s apiid=%d\n", sion_apidesc->name, apiid));
63 
64  return(apiid);
65 }
66 
67 int sion_generic_free_api( int aid ) {
68  _sion_generic_apidesc *sion_apidesc;
69  int rc = SION_SUCCESS;
70 
71  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
72  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_free_api: invalid sion_apidesc %d", aid));
73  }
74  _sion_freevcd(aid);
75  rc=_sion_generic_free_apidesc(sion_apidesc);
76 
77  return(rc);
78 }
79 
80 int sion_generic_register_create_local_commgroup_cb(int aid, int create_lcg_cb(void **, void *, int, int, int, int, int, int)) {
81  _sion_generic_apidesc *sion_apidesc;
82  int rc = SION_SUCCESS;
83 
84  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
85  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_create_local_commgroup_cb: invalid sion_apidesc %d", aid));
86  }
87 
88  if(sion_apidesc->create_lcg_cb!=NULL) {
89  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_create_local_commgroup_cb: update_cb already registered for apiid=%d", aid));
90  }
91  sion_apidesc->create_lcg_cb=create_lcg_cb;
92 
93  _sion_generic_update_api_level(sion_apidesc);
94 
95  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));
96 
97  return(rc);
98 }
99 
100 int sion_generic_register_free_local_commgroup_cb(int aid, int free_lcg_cb(void *)) {
101  _sion_generic_apidesc *sion_apidesc;
102  int rc = SION_SUCCESS;
103 
104  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
105  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_free_local_commgroup_cb: invalid sion_apidesc %d", aid));
106  }
107 
108  if(sion_apidesc->free_lcg_cb!=NULL) {
109  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_free_local_commgroup_cb: update_cb already registered for apiid=%d", aid));
110  }
111  sion_apidesc->free_lcg_cb=free_lcg_cb;
112 
113  _sion_generic_update_api_level(sion_apidesc);
114 
115  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));
116 
117  return(rc);
118 }
119 
120 
121 int sion_generic_register_barrier_cb(int aid, int barrier_cb(void *)) {
122  _sion_generic_apidesc *sion_apidesc;
123  int rc = SION_SUCCESS;
124 
125  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
126  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_barrier_cb: invalid sion_apidesc %d", aid));
127  }
128 
129  if(sion_apidesc->barrier_cb!=NULL) {
130  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_barrier_cb: barrier_cb already registered for apiid=%d", aid));
131  }
132  sion_apidesc->barrier_cb=barrier_cb;
133 
134  _sion_generic_update_api_level(sion_apidesc);
135 
136  DPRINTFP((2, "sion_generic_register_barrier_cb", _SION_DEFAULT_RANK, "barrier_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
137 
138  return(rc);
139 }
140 
141 int sion_generic_register_bcastr_cb(int aid, int bcastr_cb(void *,void *, int,int,int)) {
142  _sion_generic_apidesc *sion_apidesc;
143  int rc = SION_SUCCESS;
144 
145  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
146  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_bcastr_cb: invalid sion_apidesc %d", aid));
147  }
148 
149  if(sion_apidesc->bcastr_cb!=NULL) {
150  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_bcastr_cb: bcastr_cb already registered for apiid=%d", aid));
151  }
152  sion_apidesc->bcastr_cb=bcastr_cb;
153 
154  _sion_generic_update_api_level(sion_apidesc);
155 
156  DPRINTFP((2, "sion_generic_register_bcastr_cb", _SION_DEFAULT_RANK, "bcastr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
157 
158  return(rc);
159 }
160 
161 int sion_generic_register_gatherr_cb(int aid, int gatherr_cb(void *,void *,void *, int,int,int)) {
162  _sion_generic_apidesc *sion_apidesc;
163  int rc = SION_SUCCESS;
164 
165  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
166  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_gatherr_cb: invalid sion_apidesc %d", aid));
167  }
168 
169  if(sion_apidesc->gatherr_cb!=NULL) {
170  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_gatherr_cb: gatherr_cb already registered for apiid=%d", aid));
171  }
172  sion_apidesc->gatherr_cb=gatherr_cb;
173 
174  _sion_generic_update_api_level(sion_apidesc);
175 
176  DPRINTFP((2, "sion_generic_register_gatherr_cb", _SION_DEFAULT_RANK, "gatherr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
177 
178  return(rc);
179 }
180 
181 int sion_generic_register_gathervr_cb(int aid, int gathervr_cb(void *,void *,void *, int, int *, int, int)) {
182  _sion_generic_apidesc *sion_apidesc;
183  int rc = SION_SUCCESS;
184 
185  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
186  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_gathervr_cb: invalid sion_apidesc %d", aid));
187  }
188 
189  if(sion_apidesc->gathervr_cb!=NULL) {
190  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_gathervr_cb: gathervr_cb already registered for apiid=%d", aid));
191  }
192  sion_apidesc->gathervr_cb=gathervr_cb;
193 
194  _sion_generic_update_api_level(sion_apidesc);
195 
196  DPRINTFP((2, "sion_generic_register_gathervr_cb", _SION_DEFAULT_RANK, "gathervr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
197 
198  return(rc);
199 }
200 
201 int sion_generic_register_scatterr_cb(int aid, int scatterr_cb(void *,void *,void *, int,int,int)) {
202  _sion_generic_apidesc *sion_apidesc;
203  int rc = SION_SUCCESS;
204 
205  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
206  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_scatterr_cb: invalid sion_apidesc %d", aid));
207  }
208 
209  if(sion_apidesc->scatterr_cb!=NULL) {
210  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_scatterr_cb: scatterr_cb already registered for apiid=%d", aid));
211  }
212  sion_apidesc->scatterr_cb=scatterr_cb;
213 
214  _sion_generic_update_api_level(sion_apidesc);
215 
216  DPRINTFP((2, "sion_generic_register_scatterr_cb", _SION_DEFAULT_RANK, "scatterr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
217 
218  return(rc);
219 }
220 
221 int sion_generic_register_scattervr_cb(int aid, int scattervr_cb(void *,void *,void *, int, int *, int, int)) {
222  _sion_generic_apidesc *sion_apidesc;
223  int rc = SION_SUCCESS;
224 
225  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
226  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid));
227  }
228 
229  if(sion_apidesc->scattervr_cb!=NULL) {
230  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_scattervr_cb: scattervr_cb already registered for apiid=%d", aid));
231  }
232  sion_apidesc->scattervr_cb=scattervr_cb;
233 
234  _sion_generic_update_api_level(sion_apidesc);
235 
236  DPRINTFP((2, "sion_generic_register_scattervr_cb", _SION_DEFAULT_RANK, "scattervr_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
237 
238  return(rc);
239 }
240 
241 int sion_generic_register_gather_and_execute_cb(int aid, int gather_execute_cb(const void *, sion_int64*, int, sion_int64,
242  void *, int, int, int, int,
243  int process_cb(const void *,sion_int64 *, int))) {
244  _sion_generic_apidesc *sion_apidesc;
245  int rc = SION_SUCCESS;
246 
247  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
248  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_gather_and_execute_cb: invalid sion_apidesc %d", aid));
249  }
250 
251  if(sion_apidesc->gather_execute_cb!=NULL) {
252  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_gather_and_execute_cb: scattervr_cb already registered for apiid=%d", aid));
253  }
254  sion_apidesc->gather_execute_cb=gather_execute_cb;
255 
256  _sion_generic_update_api_level(sion_apidesc);
257 
258  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));
259 
260  return(rc);
261 }
262 
263 int sion_generic_register_execute_and_scatter_cb(int aid, int execute_scatter_cb(void *, sion_int64*, int, sion_int64,
264  void *, int, int, int, int,
265  int process_cb(void *,sion_int64 *, int))) {
266  _sion_generic_apidesc *sion_apidesc;
267  int rc = SION_SUCCESS;
268 
269  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
270  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_execute_and_scatter_cb: invalid sion_apidesc %d", aid));
271  }
272 
273  if(sion_apidesc->execute_scatter_cb!=NULL) {
274  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_execute_and_scatter_cb: scattervr_cb already registered for apiid=%d", aid));
275  }
276  sion_apidesc->execute_scatter_cb=execute_scatter_cb;
277 
278  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));
279 
280  return(rc);
281 }
282 
283 int sion_generic_register_get_multi_filename_cb(int aid, char *get_multi_filename_cb(const char *,int)) {
284  _sion_generic_apidesc *sion_apidesc;
285  int rc=0;
286 
287  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
288  return(_sion_errorprint(-1,_SION_ERROR_RETURN,"sion_generic_register_get_multi_filename_cb: invalid sion_apidesc %d", aid));
289  }
290 
291  if(sion_apidesc->get_multi_filename_cb!=NULL) {
292  return(_sion_errorprint(-1,_SION_ERROR_RETURN,"sion_generic_register_get_multi_filename_cb: get_multi_filename_cb already registered for apiid=%d", aid));
293  }
294  sion_apidesc->get_multi_filename_cb=get_multi_filename_cb;
295 
296  _sion_generic_update_api_level(sion_apidesc);
297 
298  DPRINTFP((2, "sion_generic_register_get_multi_filename_cb", -1, "get_multi_filename_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
299 
300  return(rc);
301 }
302 
303 int sion_generic_register_get_capability_cb(int aid, int get_capability_cb(void *)) {
304  _sion_generic_apidesc *sion_apidesc;
305  int rc = SION_SUCCESS;
306 
307  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
308  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_get_capability_cb: invalid sion_apidesc %d", aid));
309  }
310 
311  if(sion_apidesc->get_capability_cb!=NULL) {
312  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_generic_register_get_capability_cb: get_capability_cb already registered for apiid=%d", aid));
313  }
314  sion_apidesc->get_capability_cb=get_capability_cb;
315 
316  _sion_generic_update_api_level(sion_apidesc);
317 
318  DPRINTFP((2, "sion_generic_register_get_capability_cb", _SION_DEFAULT_RANK, "get_capability_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
319 
320  return(rc);
321 }
322 
323 
348  const char* fname,
349  const char* file_mode,
350  sion_int64* chunksize,
351  sion_int32* fsblksize,
352  void* gcommgroup,
353  int grank,
354  int gsize,
355  int* filenumber,
356  int* numfiles,
357  const int* lrank,
358  const int* lsize,
359  FILE** fileptr,
360  char** newfname
361  )
362 {
363  int rc, sid = SION_ID_UNDEF;
364  sion_int32 lfsblksize;
365  sion_int64 lchunksize;
366  int help_globalrank;
367  char *nfname=NULL,*lprefix=NULL;
368  _sion_filedesc *sion_filedesc;
369  _sion_generic_apidesc *sion_apidesc;
370  _sion_generic_gendata *sion_gendata;
371  _sion_flags_store* flags_store = NULL;
372 
373  /* */ DPRINTFTS(grank, "enter sion_generic_paropen");
374  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",
375  fname, grank, gsize, *lrank, *lsize, *filenumber, *numfiles));
376 
377  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
378  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid));
379  }
380 
381  if ( (sion_apidesc->level!=SION_GENERIC_API_LEVEL_STD) &&
382  (sion_apidesc->level!=SION_GENERIC_API_LEVEL_FULL) ) {
383  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: API %s not correctly initalized, aborting",sion_apidesc->name));
384  }
385 
386  /* check parameters */
387  if ( (grank < 0 ) || (grank >= gsize) ) {
388  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: global rank %d not valid (0..%d)",grank,gsize));
389  }
390 
391 #ifdef HACK_SCALASCA
392  /* hack for scalasca */
393  if(strstr(fname,".def")!=NULL) {
394  lfsblksize=65536;
395  lchunksize=65536;
396  } else {
397 #endif
398  lfsblksize=*fsblksize;
399  lchunksize=*chunksize;
400 #ifdef HACK_SCALASCA
401  }
402 #endif
403  DPRINTFP((1, "sion_generic_paropen", grank, "setting fsblksize = %d for file %s\n", lfsblksize, fname));
404 
405  /* create data container */
406  sion_gendata=_sion_generic_alloc_gendata();
407  if(!sion_gendata) {
408  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: problems to alloc gendata, aborting ...\n"));
409  }
410  _sion_generic_init_gendata(sion_gendata);
411 
412  sion_gendata->aid=aid;
413  sion_gendata->apidesc=sion_apidesc;
414  sion_gendata->comm_data_global=gcommgroup;
415  sion_gendata->comm_data_local=NULL;
416  sion_gendata->grank=grank;
417  sion_gendata->gsize=gsize;
418 
419  flags_store = _sion_parse_flags(file_mode);
420  if ( ! flags_store ) {
421  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: could not parse file mode in %s, aborting ...\n", file_mode));
422  }
423 
424  if (flags_store->mask&_SION_FMODE_WRITE) {
425 
426 
427  if (lrank == NULL) {
428  _sion_flags_destroy_store(flags_store);
429  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: No lrank variable given"));
430  }
431  if (lsize == NULL) {
432  _sion_flags_destroy_store(flags_store);
433  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: No lsize variable given"));
434  }
435  if ( (*lrank < 0 ) || (*lrank >= *lsize) ) {
436  _sion_flags_destroy_store(flags_store);
437  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: local rank %d not valid (0..%d)",*lrank,*lsize));
438  }
439  sion_gendata->lrank=*lrank;
440  sion_gendata->lsize=*lsize;
441 
442  if (filenumber == NULL) {
443  _sion_flags_destroy_store(flags_store);
444  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: No filenumber variable given"));
445  }
446  if (numfiles == NULL) {
447  _sion_flags_destroy_store(flags_store);
448  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: No numfiles variable given"));
449  }
450  if ( (*filenumber < 0 ) || (*filenumber >= *numfiles) ) {
451  _sion_flags_destroy_store(flags_store);
452  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: file number %d not valid (0..%d)",*filenumber,*numfiles));
453  }
454  sion_gendata->filenumber=*filenumber;
455  sion_gendata->numfiles=*numfiles;
456 
457  lprefix = calloc(SION_FILENAME_LENGTH,1);
458  if (lprefix == NULL) {
459  _sion_flags_destroy_store(flags_store);
460  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));
461  }
462 
463  strcpy(lprefix, fname);
464 
465  } else if (flags_store->mask&_SION_FMODE_READ) {
466  /* file mode READ */
467 
468  /* get number of files and filenumber */
469  rc = _sion_generic_get_and_distribute_info_from_file(sion_gendata, fname);
470  *numfiles=sion_gendata->numfiles;
471  *filenumber=sion_gendata->filenumber;
472 
473  if(rc != SION_SUCCESS) {
474  _sion_flags_destroy_store(flags_store);
475  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: error in _sion_generic_get_and_distribute_info_from_file"));
476  }
477 
478  } else {
479  _sion_flags_destroy_store(flags_store);
480  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: unknown file mode"));
481  }
482 
483  /* generate local commgroup according to information from file (read) or parameter (write) */
484  rc=sion_apidesc->create_lcg_cb(&sion_gendata->comm_data_local,sion_gendata->comm_data_global,
485  sion_gendata->grank,sion_gendata->gsize,
486  sion_gendata->lrank,sion_gendata->lsize,
487  sion_gendata->filenumber,sion_gendata->numfiles);
488  if(rc) {
489  _sion_flags_destroy_store(flags_store);
490  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_paropen_generic: error in create_local_commgroup callback function"));
491  }
492 
493  /* set up parameters of call to generic open */
494  nfname=(sion_apidesc->get_multi_filename_cb?sion_apidesc->get_multi_filename_cb:_sion_get_multi_filename)(fname,sion_gendata->filenumber);
495 
496  sid = _sion_newvcd(NULL,SION_FILEDESCRIPTOR);
497 
498  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));
499  help_globalrank=sion_gendata->grank;
500  _sion_paropen_generic_one_file(sid, nfname, flags_store, lprefix, &sion_gendata->numfiles, &sion_gendata->filenumber, &lchunksize, &lfsblksize,
501  sion_gendata->lrank, sion_gendata->lsize, &help_globalrank,
502  SION_DIFFSIZE, fileptr, sion_gendata);
503  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,
504  file_mode, sion_gendata->lsize, sid, sion_gendata->grank));
505 
506  _sion_flags_destroy_store(flags_store);
507 
508  /* test sid and get internal data structure */
509  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
510  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen: invalid sion_filedesc %d", sid));
511  }
512 
513  /* store additional data */
514  sion_filedesc->dataptr=sion_gendata;
515 
516  if(newfname!=NULL) {
517  *newfname=nfname;
518  } else {
519  if(nfname) free(nfname);
520  }
521 
522  /* OUTPUT parameters */
523  *fsblksize = lfsblksize;
524  *chunksize = lchunksize;
525 
526  /* Bug? */
527 
528  DPRINTFP((64, "sion_generic_paropen", grank, "lprefix=%s (%x)\n", lprefix,lprefix));
529  if(lprefix) free(lprefix);
530 
531  DPRINTFP((1, "sion_generic_paropen", grank, "leave parallel open of file %s sid=%d\n", fname, sid));
532  /* */ DPRINTFTS(-1, "leave sion_generic_paropen");
533 
534  return (sid);
535 }
536 
537 
538 int sion_generic_parclose(int sid) {
539  int grank, gsize, lrank, mapping_size, t, rc;
540  sion_int32 lpos[2],*mapping=NULL, *receivemap=NULL, iamreceiver, receiver;
541  _sion_filedesc *sion_filedesc;
542  _sion_generic_gendata *sion_gendata;
543  _sion_generic_apidesc *sion_apidesc;
544 
545 
546  /* */ DPRINTFTS(-1, "enter sion_generic_parclose");
547 
548  if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
549  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_parclose: invalid sion_filedesc %d", sid));
550  }
551  sion_gendata=sion_filedesc->dataptr;
552  sion_apidesc=sion_gendata->apidesc;
553 
554  grank=sion_gendata->grank;
555  gsize=sion_gendata->gsize;
556  lrank=sion_filedesc->rank;
557 
558  DPRINTFP((1, "sion_generic_parclose", grank, "enter parallel close of sid %d\n", sid));
559  DPRINTFP((1, "sion_generic_parclose", grank, "closing %d file(s)\n", sion_filedesc->nfiles));
560 
561  if ((sion_filedesc->mode == SION_FILEMODE_WRITE) && (sion_filedesc->nfiles > 1)) {
562  /* collect mapping to files to task 0 */
563 
564  /* mapping data will be collected by master of first physical file */
565  if((sion_filedesc->filenumber==0) && (lrank==0)) {
566  /* allocate data */
567  mapping_size=gsize;
568  mapping = (sion_int32 *) malloc(mapping_size * 2 * sizeof(sion_int32));
569  if (mapping == NULL) {
570  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_parclose: Cannot allocate memory for mapping"));
571  }
572  } else {
573  mapping = NULL;
574  mapping_size = 0;
575  }
576 
577  /* gather info about send about global rank of master of first file on grank 0 */
578  if(grank==0) {
579  receivemap = (sion_int32 *) malloc(gsize * sizeof(sion_int32));
580  if (receivemap == NULL) {
581  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_parclose: Cannot allocate memory for receivemap"));
582  }
583  }
584 
585  if((sion_filedesc->filenumber==0) && (lrank==0)) iamreceiver=grank;
586  else iamreceiver=-1;
587  sion_apidesc->gatherr_cb(&iamreceiver, receivemap, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
588  if(grank==0) {
589  for(t=0;t<gsize;t++) {
590  if(receivemap[t]>=0) {
591  receiver=receivemap[t];
592  break;
593  }
594  }
595  DPRINTFP((1, "sion_generic_parclose", grank, "receiver of mapping grank=%d\n", receiver));
596  }
597  sion_apidesc->bcastr_cb(&receiver, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
598 
599  /* receive global rank of master of first file on grank 0 */
600  lpos[0] = sion_filedesc->filenumber;
601  lpos[1] = lrank;
602  sion_apidesc->gatherr_cb(&lpos, mapping, sion_gendata->comm_data_global, _SION_INT32, 2, receiver);
603  }
604  else {
605  mapping = NULL;
606  mapping_size = 0;
607  }
608 
609  rc = _sion_parclose_generic( 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);
612  }
613  _SION_SAFE_FREE(mapping, NULL);
614 
615  _sion_freevcd(sid);
616 
617  /* if((sion_filedesc->nfiles > 1)||(sion_filedesc->nfiles == 0)) */
618  sion_apidesc->barrier_cb(sion_gendata->comm_data_global);
619 
620  if(receivemap!=NULL) free(receivemap);
621 
622  _SION_SAFE_FREE(sion_gendata, NULL);
623 
624  DPRINTFP((1, "sion_generic_parclose", grank, "leave parallel close of sid %d\n", sid));
625  /* */ DPRINTFTS(-1, "leave sion_generic_parclose");
626 
627  return (rc);
628 }
629 
630 
631 int sion_generic_paropen_mapped(int aid,
632  char *fname,
633  const char *file_mode,
634  int *numFiles,
635  void *gcommgroup,
636  int grank,
637  int gsize,
638  int *nlocaltasks,
639  int **globalranks,
640  sion_int64 **chunksizes,
641  int **mapping_filenrs,
642  int **mapping_lranks,
643  sion_int32 *fsblksize,
644  FILE **fileptr )
645 {
646  int rc, sid = SION_ID_UNDEF;
647  char *lprefix=NULL;
648  _sion_filedesc *sion_filedesc;
649  _sion_generic_apidesc *sion_apidesc;
650  _sion_generic_gendata *sion_gendata;
651  _sion_flags_store* flags_store = NULL;
652 
653  /* */ DPRINTFTS(grank, "enter sion_generic_paropen_mapped");
654  DPRINTFP((1, "sion_generic_paropen_mapped", grank, "enter generic parallel mapped open of file %s (global: %d of %d, nlocaltasks %d)\n",
655  fname, grank, gsize, *nlocaltasks));
656 
657  if ( (aid<0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
658  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid));
659  }
660 
661  if ((!sion_apidesc->create_lcg_cb) || (!sion_apidesc->free_lcg_cb) || (!sion_apidesc->barrier_cb) || (!sion_apidesc->bcastr_cb) ||
662  (!sion_apidesc->gatherr_cb) || (!sion_apidesc->gathervr_cb) || (!sion_apidesc->scatterr_cb) || (!sion_apidesc->scattervr_cb) ) {
663  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen_mapped: API %s not correctly initalized, aborting",sion_apidesc->name));
664  }
665 
666  /* check parameters */
667  if ( (grank < 0 ) || (grank >= gsize) ) {
668  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen_mapped: global rank %d not valid (0..%d)",grank,gsize));
669  }
670 
671  /* create data container */
672  sion_gendata=_sion_generic_alloc_gendata();
673  if(!sion_gendata) {
674  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen_mapped: problems to alloc gendata, aborting ...\n"));
675  }
676  _sion_generic_init_gendata(sion_gendata);
677 
678  sion_gendata->aid=aid;
679  sion_gendata->apidesc=sion_apidesc;
680  sion_gendata->comm_data_global=gcommgroup;
681  sion_gendata->grank=grank;
682  sion_gendata->gsize=gsize;
683  sion_gendata->lrank=-1;
684  sion_gendata->lsize=-1;
685  sion_gendata->filenumber=-1;
686  sion_gendata->numfiles=-1;
687  sion_gendata->comm_data_local=NULL;
688 
689  flags_store = _sion_parse_flags(file_mode);
690  if ( ! flags_store ) {
691  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));
692  }
693 
694  if (flags_store->mask&_SION_FMODE_WRITE) {
695 
696 
697 
698 
699  lprefix = calloc(SION_FILENAME_LENGTH,1);
700  if (lprefix == NULL) {
701  _sion_flags_destroy_store(flags_store);
702  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));
703  }
704  strcpy(lprefix, fname);
705 
706  } else if (flags_store->mask&_SION_FMODE_READ) {
707  /* file mode READ */
708  /* nothing to do here so far, filenumbers and mapping will be determined by in generic routine */
709 
710  } else {
711  _sion_flags_destroy_store(flags_store);
712  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen_mapped: unknown file mode"));
713  }
714 
715  sid = _sion_newvcd(NULL,SION_FILEDESCRIPTOR);
716 
717  DPRINTFP((1, "sion_generic_paropen_mapped", grank, "enter parallel mapped open in %s mode\n", file_mode));
718  rc=_sion_paropen_mapped_generic(sid, fname, flags_store->mask, lprefix,
719  numFiles, nlocaltasks, globalranks, chunksizes, mapping_filenrs, mapping_lranks,
720  fsblksize, grank, gsize, SION_DIFFSIZE,
721  fileptr, sion_gendata);
722  sion_gendata->numfiles=*numFiles;
723  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,
724  file_mode, sion_gendata->lsize, sid, sion_gendata->grank));
725 
726  _sion_flags_destroy_store(flags_store);
727 
728  /* test sid again and get internal data structure */
729  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
730  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_paropen_mapped: invalid sion_filedesc %d", sid));
731  }
732 
733  /* store additional data */
734  sion_filedesc->dataptr=sion_gendata;
735 
736  /* Bug? */
737 
738  DPRINTFP((1, "sion_generic_paropen_mapped", grank, "lprefix=%s (%x)\n", lprefix,lprefix));
739  if(lprefix) free(lprefix);
740 
741  DPRINTFP((1, "sion_generic_paropen_mapped", grank, "leave parallel open of file %s sid=%d\n", fname, sid));
742  /* */ DPRINTFTS(-1, "leave sion_generic_paropen_mapped");
743 
744  return (rc);
745 }
746 
747 
748 int sion_generic_parclose_mapped(int sid)
749 {
750  int grank, gsize, rc;
751  _sion_filedesc *sion_filedesc;
752  _sion_generic_gendata *sion_gendata;
753 
754  /* */ DPRINTFTS(-1, "enter sion_generic_parclose_mapped");
755  if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
756  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_parclose_mapped: invalid sion_filedesc %d", sid));
757  }
758  sion_gendata=sion_filedesc->dataptr;
759 
760  grank=sion_gendata->grank;
761  gsize=sion_gendata->gsize;
762 
763  DPRINTFP((1, "sion_generic_parclose_mapped", grank, "enter parallel close of sid %d\n", sid));
764 
765  DPRINTFP((1, "sion_generic_parclose_mapped", grank, "closing %d file(s)\n", sion_filedesc->nfiles));
766 
767  rc = _sion_parclose_mapped_generic(sid, grank, gsize,sion_gendata);
768 
769  _sion_freevcd(sid);
770 
771  _sion_generic_free_gendata(sion_gendata);
772 
773  DPRINTFP((1, "sion_generic_parclose_mapped", grank, "leave parallel close of sid %d\n", sid));
774  /* */ DPRINTFTS(-1, "leave sion_generic_parclose_mapped");
775 
776  return (rc);
777 }
778 
779 
780 int _sion_generic_get_and_distribute_info_from_file( _sion_generic_gendata *sion_gendata, const char *fname)
781 {
782  int sid, ntasks, nfiles, t;
783  int rc = SION_SUCCESS;
784  FILE *fileptr;
785  sion_int32 fsblksize;
786  int *tasksinfile;
787  int mapping_size;
788  sion_int32 *mapping;
789  sion_int32 lpos[2];
790  _sion_generic_apidesc *sion_apidesc;
791 
792  sion_apidesc=sion_gendata->apidesc;
793 
794  if(sion_gendata->grank == 0) {
795  /* open and get mapping of sion file */
796  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "before open\n"));
797  sid=_sion_open_read(fname,_SION_FMODE_READ|_SION_FMODE_ANSI,_SION_READ_MASTER_ONLY_OF_MULTI_FILES,
798  &ntasks,&nfiles,NULL,&fsblksize,NULL,&fileptr);
799  /* sid = sion_open(fname, "br", &ntasks, &nfiles, &chunksizes, &fsblksize, &globalranks, &fileptr); */
800  if(sid>=0) {
801  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "after open\n"));
802  rc=sion_get_mapping(sid,&mapping_size,&mapping,&sion_gendata->numfiles);
803  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "sion file %d files\n", sion_gendata->numfiles));
804  } else {
805  sion_gendata->numfiles=-1;
806  }
807  }
808 
809  /* each task has to know if more than file was used in sion file */
810  sion_apidesc->bcastr_cb(&sion_gendata->numfiles, sion_gendata->comm_data_global, _SION_INT32, 1, 0);
811 
812  if((sion_gendata->grank == 0) && (sion_gendata->numfiles>1)) {
813  if(mapping_size!=sion_gendata->gsize) {
814  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  }
816  }
817 
818  if(sion_gendata->numfiles<0) {
819  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"));
820  }
821 
822  if(sion_gendata->numfiles>1) {
823  DPRINTFP((1, "_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, "before scatter\n"));
824  if(sion_gendata->grank==0) {
825  for(t=0;t<mapping_size;t++) {
826  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  }
828  }
829 
830  sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global, _SION_INT32, 2, 0);
831  sion_gendata->filenumber=lpos[0];
832  sion_gendata->lrank =lpos[1];
833  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));
834 
835  if(sion_gendata->grank==0) {
836  tasksinfile = (int *) malloc(sion_gendata->numfiles * sizeof(int));
837  if (tasksinfile == NULL) {
838  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"));
839  }
840  for(t=0;t<sion_gendata->numfiles;t++) tasksinfile[t]=0; /* init counter */
841  for(t=0;t<mapping_size;t++) tasksinfile[ mapping[t*2] ]++; /* count tasks in file */
842  for(t=0;t<mapping_size;t++) mapping[t*2+1]=tasksinfile[ mapping[t*2] ]; /* set 2nd value of mapping to lsize */
843  }
844  sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global, _SION_INT32, 2, 0);
845  sion_gendata->lsize =lpos[1];
846  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));
847 
848  if(sion_gendata->grank==0) {
849  if(tasksinfile) free(tasksinfile);
850  }
851  /* WARNING: mapping file of sion file is now destroyed and should not be used until close */
852 
853  } else {
854  sion_gendata->filenumber=0;
855  sion_gendata->lrank = sion_gendata->grank;
856  sion_gendata->lsize = sion_gendata->gsize;
857  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));
858  }
859 
860  if(sion_gendata->grank == 0) {
861  /* frees also mapping vector */
862  if (sid>=0) _sion_close_sid(sid);
863  }
864 
865  return(rc);
866 }
867 
868 int sion_generic_parreinit(int sid, sion_int64 chunksize ) {
869  int grank, gsize, rc;
870  _sion_filedesc *sion_filedesc;
871  _sion_generic_gendata *sion_gendata;
872 
873  if ( (sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
874  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_generic_parreinit: invalid sion_filedesc %d", sid));
875  }
876  sion_gendata=sion_filedesc->dataptr;
877 
878  grank=sion_gendata->grank;
879  gsize=sion_gendata->gsize;
880 
881  DPRINTFP((1, "sion_generic_parreinit", grank, "enter parallel reinit of sid %d\n", sid));
882 
883  rc = _sion_parreinit_generic(sid, chunksize, grank, gsize, sion_gendata);
884 
885  DPRINTFP((1, "sion_generic_parreinit", grank, "leave parallel reinit of sid %d\n", sid));
886 
887  return(rc);
888 }
_sion_generic_gendata * _sion_generic_alloc_gendata()
Allocates memory for internal sion api data structure needed for each SION file.
Sion File Descriptor Structure.
Definition: sion_filedesc.h:77
int _sion_generic_free_apidesc(_sion_generic_apidesc *sion_apidesc)
free apidesc structure
_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.
Definition: sion_generic.c:347
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_parclose_generic(int sid, int rank, int ntasks, int mapping_size, sion_int32 *mapping, _sion_generic_gendata *sion_gendata)
Internal function to close parallel opened SION file.
int _sion_vcdtype(int sid)
Definition: sion_fd.c:56
_sion_flags_store * _sion_parse_flags(const char *flags)
Parse flags and return a flags store with key value pairs.
Definition: sion_flags.c:285
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.
Definition: sion_common.c:213
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:51
int _sion_errorprint(int rc, int level, const char *format,...)
Internal SION error.
int _sion_newvcd(void *data, int type)
Definition: sion_fd.c:41
char * _sion_get_multi_filename(const char *fname, int filenumber)
generates the multi filename
#define SION_FILEDESCRIPTOR
Definition: sion_fd.h:17
int _sion_freevcd(int sid)
Definition: sion_fd.c:46
#define SION_FILEMODE_WRITE
Definition: sion_filedesc.h:34
int _sion_generic_update_api_level(_sion_generic_apidesc *sion_apidesc)
Update API level.
Sion Time Stamp Header.
#define SION_DIFFSIZE
Definition: sion_common.h:35
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_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)
Generic parallel open of one direct access file.
int _sion_generic_init_gendata(_sion_generic_gendata *sion_gendata)
Initialize the sion file description.
#define SION_APIDESCRIPTOR
Definition: sion_fd.h:18
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