SIONlib  1.6.2
Scalable I/O library for parallel access to task-local files
sion_common.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 ****************************************************************************/
9 
16 #include <stdlib.h>
17 #include <stdio.h>
18 #include <string.h>
19 #include <time.h>
20 #include <assert.h>
21 
22 #if defined(_BGL)
23 #include <rts.h>
24 #ifndef __USE_FILE_OFFSET64
25 #define __USE_FILE_OFFSET64
26 #endif
27 #endif
28 
29 #include <sys/time.h>
30 
31 
32 #include "sion.h"
33 #include "sion_debug.h"
34 #include "sion_filedesc.h"
35 #include "sion_tools.h"
36 #include "sion_fd.h"
37 #include "sion_file.h"
38 #include "sion_metadata.h"
39 #include "sion_internal.h"
40 #include "sion_internal_seek.h"
41 #include "sion_hints.h"
42 #include "sion_printts.h"
43 #include "sion_buffer.h"
44 #include "sion_dup.h"
45 #include "sion_lock.h"
46 
81 int sion_get_locations(int sid,
82  int *ntasks,
83  int *maxchunks,
84  sion_int64 *globalskip,
85  sion_int64 *start_of_varheader,
86  sion_int64 **sion_chunksizes,
87  sion_int64 **sion_globalranks,
88  sion_int64 **sion_blockcount,
89  sion_int64 **sion_blocksizes ) {
90  int rc = SION_SUCCESS;
91  _sion_filedesc *sion_filedesc;
92 #ifdef SION_SERIAL_MASTER
93  _sion_filedesc *help;
94  int i, lfile, lrank, blknum;
95 #endif
96 
97  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
98  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
99  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
100  }
101  DPRINTFP((1, "sion_get_locations", -1, "enter\n"));
102 
103 #ifdef SION_SERIAL_MASTER
104  if((sion_filedesc->state == SION_FILESTATE_SEROPENMASTER) &&
105  (sion_filedesc->all_blockcount==NULL) ) {
106 
107  /* collect info from sub files */
108  _sion_alloc_filedesc_arrays(sion_filedesc);
110 
111  for (i = 0; i < sion_filedesc->ntasks; i++) {
112  lfile=sion_filedesc->mapping[i*2+0]; lrank=sion_filedesc->mapping[i*2+1];
113  sion_filedesc->all_chunksizes[i] = sion_filedesc->multifiles[lfile]->all_chunksizes[lrank];
114  sion_filedesc->all_globalranks[i] = sion_filedesc->multifiles[lfile]->all_globalranks[lrank];
115  sion_filedesc->all_blockcount[i] = sion_filedesc->multifiles[lfile]->all_blockcount[lrank];
116  }
117  for (i = 0; i < sion_filedesc->ntasks; i++) {
118  lfile=sion_filedesc->mapping[i*2+0]; lrank=sion_filedesc->mapping[i*2+1];
119  help=sion_filedesc->multifiles[lfile];
120  for (blknum = 0; blknum < sion_filedesc->all_blockcount[i]; blknum++) {
121  sion_filedesc->all_blocksizes[sion_filedesc->ntasks * blknum + i] =
122  help->all_blocksizes[help->ntasks * blknum + lrank];
123  }
124  }
125  }
126 #endif
127 
128  *ntasks = sion_filedesc->ntasks;
129  *maxchunks = sion_filedesc->maxusedchunks;
130  *sion_chunksizes = sion_filedesc->all_chunksizes;
131  *sion_globalranks = sion_filedesc->all_globalranks;
132  *sion_blockcount = sion_filedesc->all_blockcount;
133  *sion_blocksizes = sion_filedesc->all_blocksizes;
134  *globalskip = sion_filedesc->globalskip;
135  *start_of_varheader = sion_filedesc->start_of_varheader;
136 
137  DPRINTFP((1, "sion_get_locations", -1, "leave\n"));
138 
139  return (rc);
140 }
141 
142 int _sion_close_sid(int sid)
143 {
144  int rc = SION_SUCCESS;
145  _sion_filedesc *sion_filedesc;
146 
147  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
148  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
149  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_close: invalid sion_filedesc, aborting %d ...\n", sid));
150  }
151  rc=_sion_close(sion_filedesc);
152 
153  if(rc==SION_SUCCESS) {
154  _sion_freevcd(sid);
155  _sion_free_filedesc(sion_filedesc);
156  }
157 
158  return(rc);
159 
160 }
161 
179 int sion_get_current_location(int sid, int *currentchunknr, sion_int64 *currentpos, int *maxchunks, sion_int64 **chunksizes)
180 {
181  int rc = SION_SUCCESS;
182  _sion_filedesc *sion_filedesc;
183 
184  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
185  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
186  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
187  }
188  DPRINTFP((1, "sion_get_current_location", -1, "enter\n"));
189 
190  *currentchunknr = sion_filedesc->currentblocknr;
191  *currentpos = sion_filedesc->currentpos - (sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip);
192  *maxchunks = sion_filedesc->lastchunknr+1;
193  *chunksizes = sion_filedesc->blocksizes;
194 
195  DPRINTFP((1, "sion_get_current_location", -1, "leave\n"));
196  return (rc);
197 }
198 
213 int sion_get_mapping(int sid,
214  int *mapping_size,
215  sion_int32 **mapping,
216  int *numfiles ) {
217  int rc = SION_SUCCESS;
218  _sion_filedesc *sion_filedesc;
219 
220  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
221  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
222  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
223  }
224  DPRINTFP((1, "sion_get_mapping", -1, "enter\n"));
225 
226  if(sion_filedesc->mapping_size>0) {
227  *mapping_size=sion_filedesc->mapping_size;
228  *mapping=sion_filedesc->mapping;
229  } else {
230  *mapping_size=-1;
231  }
232  *numfiles=sion_filedesc->nfiles;
233 
234  DPRINTFP((1, "sion_get_mapping", -1, "leave (mapping_size=%d)\n",*mapping_size));
235 
236  return (rc);
237 }
238 
248 {
249  _sion_filedesc *sion_filedesc;
250 
251  DPRINTFP((1, "sion_get_file_endianness", -1, "enter (sid=%d)\n",sid));
252 
253  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
254  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
255  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
256  }
257 
258  DPRINTFP((1, "sion_get_file_endianness", -1, "leave (sid=%d)\n",sid));
259  /* return endianness of user data */
260  return ((sion_filedesc->endianness >> 8) & 1);
261 }
262 
272 {
273  int swap_needed = 0;
274 
275  DPRINTFP((1, "sion_endianness_swap_needed", -1, "enter (sid=%d)\n",sid));
276 
277  swap_needed = (sion_get_file_endianness(sid) != sion_get_endianness());
278 
279  DPRINTFP((1, "sion_endianness_swap_needed", -1, "leave (swap_needed=%d)\n",
280  swap_needed));
281 
282  return swap_needed;
283 }
284 
302  int *ntasks,
303  sion_int64 **sion_currentpos,
304  sion_int64 **sion_currentblocknr)
305 {
306  int rc = SION_SUCCESS;
307  _sion_filedesc *sion_filedesc;
308 
309  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
310  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
311  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
312  }
313  DPRINTFP((1, "sion_get_current_locations", -1, "enter\n"));
314 
315  *ntasks = sion_filedesc->ntasks;
316  *sion_currentpos = sion_filedesc->all_currentpos;
317  *sion_currentblocknr = sion_filedesc->all_currentblocknr;
318 
319  DPRINTFP((1, "sion_get_current_locations", -1, "leave\n"));
320  return (rc);
321 }
322 
323 int sion_get_number_of_files(int sid)
324 {
325  _sion_filedesc *sion_filedesc;
326 
327  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
328  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
329  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
330  }
331 
332  return (sion_filedesc->nfiles);
333 }
334 
335 int sion_get_filenumber(int sid)
336 {
337  _sion_filedesc *sion_filedesc;
338 
339  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
340  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
341  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
342  }
343 
344  return (sion_filedesc->filenumber);
345 }
346 
347 int sion_is_serial_opened(int sid)
348 {
349  _sion_filedesc *sion_filedesc;
350 
351  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
352  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
353  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
354  }
355 
356  return (sion_filedesc->state == SION_FILESTATE_SEROPEN
357  || sion_filedesc->state == SION_FILESTATE_SEROPENRANK
358  || sion_filedesc->state == SION_FILESTATE_SEROPENMASTER);
359 }
360 
361 int sion_using_hints(int sid)
362 {
363  _sion_filedesc *sion_filedesc;
364 
365  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
366  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
367  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
368  }
369 
370  return (sion_filedesc->usehints);
371 }
372 
373 sion_int64 sion_get_bytes_written(int sid)
374 {
375  _sion_filedesc *sion_filedesc;
376  sion_int64 bytes=SION_SIZE_NOT_VALID;
377  int i;
378 
379  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
380  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
381  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
382  }
383 
384  if (sion_filedesc->mode == SION_FILEMODE_WRITE) {
385  if (sion_filedesc->usebuffer) {
386  _sion_buffer_flush(sion_filedesc);
387  }
388  _sion_flush_block(sion_filedesc);
389  bytes=0;
390  for(i=0;i<=sion_filedesc->lastchunknr;i++) bytes+=sion_filedesc->blocksizes[i];
391  }
392 
393  return (bytes);
394 }
395 
396 sion_int64 sion_get_bytes_read(int sid)
397 {
398  _sion_filedesc *sion_filedesc;
399  sion_int64 bytes=SION_SIZE_NOT_VALID;
400  int i;
401 
402  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
403  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
404  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
405  }
406 
407  if (sion_filedesc->mode == SION_FILEMODE_READ) {
408  _sion_file_purge(sion_filedesc->fileptr);
409  sion_filedesc->currentpos = _sion_file_get_position(sion_filedesc->fileptr);
410 
411  bytes=0;
412  for(i=0;i<sion_filedesc->currentblocknr;i++) bytes+=sion_filedesc->blocksizes[i];
413  /* current chunk */
414  bytes+=sion_filedesc->currentpos - (sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip);
415  }
416 
417  return (bytes);
418 }
419 
433 size_t sion_fwrite(const void *data, size_t size, size_t nitems, int sid)
434 {
435  sion_int64 bytes_buffered, bytes_to_write, bbytes, bytes_left;
436  _sion_filedesc *sion_filedesc;
437  size_t rc=0, frc;
438  char *data_ptr;
439  void *bdata;
440 
441  DPRINTFP((1, "sion_fwrite", -1, "enter size=%ld nitems=%ld\n",(long) size, (long) nitems));
442 
443  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
444  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
445  return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
446  }
447 
448  _sion_check_on_collective_mode(sion_filedesc);
449 
450  bytes_to_write=size*nitems;
451 
452  /* buffering? */
453  if(sion_filedesc->usebuffer) {
454 
455  /* create a new block if needed and check size of input */
456  if(!sion_ensure_free_space(sid,bytes_to_write)) {
457  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
458  "could not ensure free space for this buffered block of size %d, returning sid=%d ...",
459  (int) bytes_to_write, sid));
460  }
461 
462  data_ptr=(void *) data;
463  bytes_left = sion_filedesc->chunksize -
464  sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
465  bbytes = sion_filedesc->buffer_ptr;
466 
467  /* check for enough space in current block */
468  if (bbytes + bytes_to_write > bytes_left) {
469  /* not enough space for buffer + bytes_to_write => flush first */
470  _sion_buffer_get_data_ptr(sion_filedesc,&bdata,&bbytes);
471  if(sion_ensure_free_space(sid,bbytes)) {
472  frc = _sion_file_write(bdata, bbytes, sion_filedesc->fileptr);
473  if(frc != bbytes) {
474  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
475  "could not write data (%d bytes) to file (sid=%d) ...", (int) bbytes, sid));
476  }
477  } else {
478  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
479  "could not ensure free space for this buffered block of size %d, returning sid=%d ...",
480  (int) bbytes, sid));
481  }
482  /* increase current position */
483  sion_filedesc->currentpos+=bbytes;
484  }
485  /* buffer data */
486  bytes_buffered=_sion_buffer_push(sion_filedesc,data_ptr,bytes_to_write);
487  bytes_to_write-=bytes_buffered;
488  data_ptr+=bytes_buffered;
489 
490  while(bytes_to_write>0) {
491  /* flush filled buffer to file, not all data could be stored */
492  _sion_buffer_get_data_ptr(sion_filedesc,&bdata,&bbytes);
493  if(sion_ensure_free_space(sid,bbytes)) {
494  frc = _sion_file_write(bdata, bbytes, sion_filedesc->fileptr);
495  if(frc != bbytes) {
496  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
497  "could not write data (%d bytes) to file (sid=%d) ...", (int) bbytes, sid));
498  }
499  } else {
500  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
501  "could not ensure free space for this buffered block of size %d, returning sid=%d ...",
502  (int) bbytes, sid));
503  }
504  /* increase current position */
505  sion_filedesc->currentpos+=bbytes;
506 
507  /* next try to push data into buffer */
508  bytes_buffered=_sion_buffer_push(sion_filedesc,data_ptr,bytes_to_write);
509  bytes_to_write-=bytes_buffered;
510  data_ptr+=bytes_buffered;
511  }
512  /* reset value since it will be used later */
513  bytes_to_write=size*nitems;
514  /* return code: bytes stored */
515  rc=(size_t) (size ? bytes_to_write / size : 0);
516 
517  } else {
518  /* normal write */
519  if(sion_ensure_free_space(sid,bytes_to_write)) {
520  frc = _sion_file_write(data, bytes_to_write, sion_filedesc->fileptr);
521  if(frc != bytes_to_write) {
522  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
523  "could not write data (%d bytes) to file (frc=%d sid=%d) ...", (int) bytes_to_write, (int) frc, sid));
524  }
525 
526  rc=(size_t) (size ? bytes_to_write / size : 0);
527 
528  } else {
529  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,"could not ensure free space for this block, returning %d ...", sid));
530  }
531  /* increase current position */
532  sion_filedesc->currentpos+=bytes_to_write;
533  }
534 
535  DPRINTFP((1, "sion_fwrite", -1, "leave rc=%ld\n",(long) rc));
536  return(rc);
537 }
538 
553 size_t sion_fread( void *data, size_t size, size_t nitems, int sid) {
554  _sion_filedesc *sion_filedesc;
555  sion_int64 bytes, bread, bytes_left;
556 
557  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
558  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
559  return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
560  }
561  if (!data) {
562  /* FIXME: replace SION_ANSI_SIZE_NOT_VALID? */
563  return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid pointer, aborting %d ...\n", data));
564  }
565 
566  /* check and update current position */
567  _sion_update_fileposition(sion_filedesc);
568 
569  bytes_left = sion_filedesc->startpos +
570  sion_filedesc->currentblocknr * sion_filedesc->globalskip +
571  sion_filedesc->blocksizes[sion_filedesc->currentblocknr] -
572  sion_filedesc->currentpos;
573 
574  DPRINTFP((1, "sion_fread", -1, "enter\n"));
575  DPRINTFP((4, "sion_fread", -1, " parameter size=%ld nitems=%ld\n",(long) size,(long) nitems));
576 
577  _sion_check_on_collective_mode(sion_filedesc);
578 
579  bread=0;
580  bytes=size*nitems;
581 
582  /* Check size. bytes_left == 0 is handled by sion_feof */
583  if((sion_filedesc->chunksize < bytes) || ((bytes_left < bytes) &&
584  (bytes_left != 0))) {
585  /* FIXME: replace SION_ANSI_SIZE_NOT_VALID? */
586  return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,"not enough bytes left in chunk, aborting (%ld < %ld) ...\n", bytes_left, bytes));
587  }
588 
589  if(!sion_feof(sid)) {
590  bread=_sion_file_read(data,bytes,sion_filedesc->fileptr);
591  DPRINTFP((256, "sion_fread", -1, " _sion_file_read returns %ld\n",(long) bread));
592  }
593  if(bread!=bytes) {
594  return (size_t) (size ? bread / size : 0);
595  }
596 
597  bread = size ? bread / size : 0;
598 
599  /* increase current position */
600  sion_filedesc->currentpos+=bytes;
601 
602  DPRINTFP((4, "sion_fread", -1, " return value %ld\n",(long) bread));
603  DPRINTFP((1, "sion_fread", -1, "leave\n"));
604  return(bread);
605 }
606 
621 int sion_seek(int sid, int rank, int currentblocknr, sion_int64 posinblk)
622 {
623  FILE *fileptr;
624  int rc=SION_SUCCESS;
625  /* TBD: check if not sion_open and multi file */
626  rc=sion_seek_fp(sid,rank,currentblocknr,posinblk,&fileptr);
627  return(rc);
628 
629 }
630 
644 int sion_seek_fp(int sid, int rank, int currentblocknr, sion_int64 posinblk, FILE **fileptr)
645 {
646  int rc = SION_SUCCESS;
647  _sion_filedesc *sion_filedesc;
648 
649  DPRINTFP((1, "sion_seek_fp", -1, " enter seek with sid=%d\n", sid));
650  assert((_sion_vcdtype(sid) == SION_FILEDESCRIPTOR));
651 
652  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
653  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
654  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_seek: invalid sion_filedesc, aborting %d ...\n", sid));
655  }
656 
657  /* check state */
658  if ((sion_filedesc->mode != SION_FILEMODE_READ) && (sion_filedesc->mode != SION_FILEMODE_WRITE)) {
659  return(_sion_errorprint_on_rank(SION_NOT_SUCCESS,_SION_ERROR_RETURN,sion_filedesc->rank,"sion_seek_fp: unknown file open state !(READ|WRITE), aborting %d ...", sid));
660  }
661  if (sion_filedesc->usebuffer) {
662  _sion_buffer_flush(sion_filedesc);
663  }
664  if ( (sion_filedesc->state != SION_FILESTATE_PAROPEN)
665  && (sion_filedesc->state != SION_FILESTATE_SEROPEN)
666  && (sion_filedesc->state != SION_FILESTATE_SEROPENMASTER)
667  && (sion_filedesc->state != SION_FILESTATE_SEROPENRANK)
668  && (sion_filedesc->state != SION_FILESTATE_PAROPENMAPPEDMASTER)
669  ) {
670  return(_sion_errorprint_on_rank(SION_NOT_SUCCESS,_SION_ERROR_RETURN,sion_filedesc->rank,"sion_seek_fp: unknown file open state !(PAR|SER|SERRANK|MAPPED), aborting %d ...", sid));
671  }
672 
673 
674  if (sion_filedesc->mode == SION_FILEMODE_READ) { /* READ */
675 
676  if (sion_filedesc->state == SION_FILESTATE_SEROPEN) {
677  rc = _sion_seek_on_all_ranks_read(sion_filedesc, rank, currentblocknr, posinblk);
678  }
679  else if (sion_filedesc->state == SION_FILESTATE_SEROPENMASTER) {
680  rc = _sion_seek_on_all_ranks_read_master(sion_filedesc, rank, currentblocknr, posinblk);
681  }
682  else if ((sion_filedesc->state == SION_FILESTATE_SEROPENRANK) ||
683  (sion_filedesc->state == SION_FILESTATE_PAROPEN)) {
684  rc = _sion_seek_on_current_rank_read(sion_filedesc, rank, currentblocknr, posinblk);
685  }
686  else if (sion_filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
687  rc = _sion_seek_on_all_ranks_read_mapped(sion_filedesc, rank, currentblocknr, posinblk);
688  }
689  } else { /* WRITE */
690  if (sion_filedesc->state == SION_FILESTATE_SEROPEN) {
691  rc = _sion_seek_on_all_ranks_write(sion_filedesc, rank, currentblocknr, posinblk);
692  }
693  else if (sion_filedesc->state == SION_FILESTATE_SEROPENRANK) {
694  return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, sion_filedesc->rank, "sion_seek_fp: seek not supported for this type (write, sion_open_rank), aborting ...");
695  }
696  else if (sion_filedesc->state == SION_FILESTATE_PAROPEN) {
697  rc = _sion_seek_on_current_rank_write(sion_filedesc, rank, currentblocknr, posinblk);
698  }
699  else if (sion_filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
700  rc = _sion_seek_on_all_ranks_write_mapped(sion_filedesc, rank, currentblocknr, posinblk);
701  }
702 
703  }
704 
705  /* TBD: implement sion_open and sion_seek_fp for multi-files */
706  if(fileptr!=NULL) {
707  if(sion_filedesc->fileptr->flags&SION_FILE_FLAG_ANSI) {
708  *fileptr=sion_filedesc->fileptr->fileptr;
709  sion_filedesc->fileptr_exported=1;
710 
711  } else {
712  *fileptr=NULL;
713  sion_filedesc->fileptr_exported=0;
714  }
715  }
716 
717  DPRINTFP((1, "sion_seek_fp", -1, "leave seek rc=%d\n",rc));
718 
719  return (rc);
720 }
721 
732 int sion_feof(int sid)
733 {
734  int rc = SION_NOT_SUCCESS;
735  sion_int64 maxpos;
736 
737  _sion_filedesc *sion_filedesc;
738  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
739  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
740  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"sion_feof: invalid sion_filedesc, aborting %d ...\n", sid));
741  }
742 
743  DPRINTFP((8, "sion_feof", -1, "enter feof sid=%d currentpos=%15lld\n", sid, sion_filedesc->currentpos));
744 
745  /* check and update current position */
746  _sion_update_fileposition(sion_filedesc);
747 
748  maxpos = sion_filedesc->startpos
749  + sion_filedesc->currentblocknr * sion_filedesc->globalskip + sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
750 
751  DPRINTFP((16, "sion_feof", -1,
752  " after flush sid=%d currentpos=%15lld maxpos= %lld startpos=%lld curblknr=%d\n",
753  sid, sion_filedesc->currentpos, maxpos, sion_filedesc->startpos, sion_filedesc->currentblocknr));
754 
755  if (sion_filedesc->currentpos < maxpos) {
756  /* end of current block not reached */
757  rc = 0;
758  DPRINTFP((16, "sion_feof", -1, " end of current block %d not reached sid=%d\n",
759  sion_filedesc->currentblocknr, sid));
760  } else {
761  if (sion_filedesc->currentblocknr < sion_filedesc->lastchunknr) {
762 
763  /* apply hint for freeing current chunk */
764  rc = _sion_apply_hints(sion_filedesc,SION_HINTS_FREE_TYPE_CHUNK);
765 
766  /* end of current block reached, skip to next block */
767  sion_filedesc->currentblocknr++;
768  sion_filedesc->currentpos = sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip;
769 
770  /* apply hint for access current (new) chunk */
771  rc = _sion_apply_hints(sion_filedesc,SION_HINTS_ACCESS_TYPE_CHUNK);
772 
773  _sion_file_purge(sion_filedesc->fileptr);
774  _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->currentpos);
775  rc = SION_NOT_SUCCESS;
776  DPRINTFP((8, "sion_feof", -1,
777  " end of block %d reached, skipping to next %lld -> %lld position=%lld gs=%lld sid=%d\n",
778  sion_filedesc->currentblocknr - 1,
779  sion_filedesc->currentpos, _sion_file_get_position(sion_filedesc->fileptr), sion_filedesc->currentpos, sion_filedesc->globalskip, sid));
780  }
781  else {
782  /* end of last block reached */
783  DPRINTFP((8, "sion_feof", -1, " end of last block %d reached sid=%d\n", sion_filedesc->currentblocknr, sid));
784  rc = SION_SUCCESS;
785  }
786  }
787 
788  DPRINTFP((8, "sion_feof", -1, "leave feof sid=%d currentpos=%15lld rc=%d\n", sid, sion_filedesc->currentpos, rc));
789 
790  return (rc);
791 }
792 
802 sion_int64 sion_bytes_avail_in_block(int sid)
803 {
804  return(sion_bytes_avail_in_chunk(sid));
805 }
806 
817 sion_int64 sion_bytes_avail_in_chunk(int sid)
818 {
819  sion_int64 maxpos;
820  sion_int64 bytes_avail=SION_SIZE_NOT_VALID;
821  _sion_filedesc *sion_filedesc;
822 
823  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
824  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
825  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"sion_bytes_avail_in_chunk: invalid sion_filedesc, aborting %d ...\n", sid));
826  }
827 
828 
829  _sion_update_fileposition(sion_filedesc);
830 
831  maxpos = sion_filedesc->startpos
832  + sion_filedesc->currentblocknr * sion_filedesc->globalskip + sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
833 
834  bytes_avail = maxpos - sion_filedesc->currentpos;
835 
836  DPRINTFP((8, "sion_bytes_avail_in_chunk", -1,
837  "leave sid=%d rank=%4d currentpos=%lld maxpos= %lld -> bytes to read %lld\n",
838  sid, sion_filedesc->rank, sion_filedesc->currentpos, maxpos, bytes_avail));
839 
840  return (bytes_avail);
841 }
842 
853 sion_int64 sion_get_position(int sid)
854 {
855  _sion_filedesc *sion_filedesc;
856 
857  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
858  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
859  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"sion_get_position: invalid sion_filedesc, aborting %d ...\n", sid));
860  }
861 
862 
863  _sion_file_flush(sion_filedesc->fileptr);
864 
865  return (_sion_file_get_position(sion_filedesc->fileptr));
866 
867 }
868 
869 int sion_set_fp_closed(int sid)
870 {
871  int rc = SION_SUCCESS;
872  _sion_filedesc *sion_filedesc;
873 
874  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
875  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
876  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_set_fp_closed: invalid sion_filedesc, aborting %d ...\n", sid));
877  }
878  sion_filedesc->state = SION_FILESTATE_CLOSE;
879  return (rc);
880 }
881 
882 int sion_set_second_fp(int sid, FILE *secondfd)
883 {
884  int rc = SION_SUCCESS;
885  _sion_filedesc *sion_filedesc;
886 
887 
888  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
889  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
890  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_set_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
891  }
892 
893  if(!(sion_filedesc->fileptr->flags&SION_FILE_FLAG_ANSI)) {
894  return(_sion_errorprint_on_rank(SION_NOT_SUCCESS,_SION_ERROR_RETURN,sion_filedesc->rank,"sion_set_second_fp: file was not opened in ANSI mode, aborting %d ...", sid));
895  }
896 
897  _sion_file_set_second_fileptr(sion_filedesc->fileptr,secondfd);
898 
899  _sion_print_filedesc(sion_filedesc, 512, "sion_set_second_fd", 1);
900  /*
901  if (sion_filedesc->mode == SION_FILEMODE_READ) {
902  sion_seek(sid, SION_CURRENT_RANK, 0, 0);
903  }
904  */
905  return (rc);
906 }
907 
908 int sion_unset_second_fp(int sid)
909 {
910  int rc = SION_SUCCESS;
911  _sion_filedesc *sion_filedesc;
912 
913  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
914  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
915  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_unset_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
916  }
917 
918  if(!(sion_filedesc->fileptr->flags&SION_FILE_FLAG_ANSI)) {
919  return(_sion_errorprint_on_rank(SION_NOT_SUCCESS,_SION_ERROR_RETURN,sion_filedesc->rank,"sion_unset_second_fp: file was not opened in ANSI mode, aborting %d ...", sid));
920  }
921 
923  return (rc);
924 }
925 
926 int sion_optimize_fp_buffer(int sid)
927 {
928  int rc = SION_SUCCESS;
929  _sion_filedesc *sion_filedesc;
930 
931  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
932  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
933  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_set_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
934  }
935 
936  sion_filedesc->fpbuffer = (char *) malloc(sion_filedesc->fsblksize);
937  if (sion_filedesc->fpbuffer == NULL) {
938  return(_sion_errorprint_on_rank(SION_NOT_SUCCESS,_SION_ERROR_RETURN,sion_filedesc->rank,"sion_optimize_fp_buffer: cannot allocate internal buffer of size %lu , aborting ...", (unsigned long) sion_filedesc->fsblksize));
939  }
940  sion_filedesc->fpbuffer_size = sion_filedesc->fsblksize;
941 
942  rc=_sion_file_set_buffer(sion_filedesc->fileptr, sion_filedesc->fpbuffer, sion_filedesc->fpbuffer_size);
943  return (rc);
944 }
945 
953 int sion_flush(int sid)
954 {
955  int rc = SION_SUCCESS;
956  _sion_filedesc *sion_filedesc;
957 
958  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
959  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
960  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_unset_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
961  }
962  rc = _sion_flush_block(sion_filedesc);
963  return (rc);
964 }
965 
976 int sion_ensure_free_space(int sid, sion_int64 bytes)
977 {
978  _sion_filedesc *sion_filedesc;
979  sion_int64 byteswritten;
980  int rc = SION_SUCCESS;
981 
982  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
983  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
984  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_ensure_free_space: invalid sion_filedesc, returning %d ...\n", sid));
985  }
986 
987  DPRINTFP((8, "_sion_ensure_free_space", -1, "enter ensure_free sid=%d bytes=%lld\n", sid, bytes));
988 
989  if (sion_filedesc->mode != SION_FILEMODE_WRITE) {
990  DPRINTFP((8, "_sion_ensure_free_space", -1, "invalid opened\n"));
991  return(_sion_errorprint_on_rank(SION_NOT_SUCCESS,_SION_ERROR_RETURN,sion_filedesc->rank,"sion_ensure_free_space[%2d]: file is opened invalid sion_mode, returning ...", sion_filedesc->rank));
992  }
993  if (sion_filedesc->fileptr == NULL) {
994  DPRINTFP((8, "_sion_ensure_free_space", -1, "file not opened\n"));
995  return(_sion_errorprint_on_rank(SION_NOT_SUCCESS,_SION_ERROR_RETURN,sion_filedesc->rank,"sion_ensure_free_space[%2d]: file is not open, returning ...", sion_filedesc->rank));
996  }
997 
998  if (bytes > sion_filedesc->chunksize) {
999  DPRINTFP((8, "_sion_ensure_free_space", -1, "could not write %lld bytes, chunksize=%lld\n", bytes, sion_filedesc->chunksize));
1000  return(_sion_errorprint_on_rank(SION_NOT_SUCCESS,_SION_ERROR_RETURN,sion_filedesc->rank,"sion_ensure_free_space[%2d]: could not write %lld bytes, chunksize=%lld, returning ...",sion_filedesc->rank, bytes, sion_filedesc->chunksize));
1001  }
1002 
1003  _sion_flush_block(sion_filedesc);
1004 
1005  DPRINTFP((16, "_sion_ensure_free_space", -1,
1006  " after getpos sid=%d fileposition is %lld bytes=%lld\n", sid, sion_filedesc->currentpos, bytes));
1007 
1008  byteswritten = sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
1009 
1010  DPRINTFP((16, "_sion_ensure_free_space", -1,
1011  " sid=%d byteswritten(%lld) + new bytes (%lld) = %lld\n", sid, byteswritten, bytes, byteswritten + bytes));
1012 
1013  if ((byteswritten + bytes) > sion_filedesc->chunksize) {
1014  /* not enough space for writing next data */
1015  _sion_create_new_block(sion_filedesc);
1016  }
1017 
1018  DPRINTFP((8, "_sion_ensure_free_space", -1,
1019  "leave ensure_free sid=%d fileposition is %lld bw+bytes=%lld <= chunksize=%lld (fsblksize=%d)\n",
1020  sid, sion_filedesc->currentpos, byteswritten + bytes, sion_filedesc->chunksize, sion_filedesc->fsblksize));
1021 
1022 
1023  return (rc);
1024 
1025 }
1026 
1027 int sion_is_thread_safe() {
1028 #ifdef SION_PTHREADS
1029  return(SION_SUCCESS);
1030 #else
1031  return(SION_NOT_SUCCESS);
1032 #endif
1033 }
1034 
1044 int sion_get_sizeof(int sid, int *numbytes, int *numfds) {
1045  _sion_filedesc *sion_filedesc;
1046  int rc=SION_NOT_SUCCESS;
1047 
1048  *numbytes=SION_SIZE_NOT_VALID;
1049  *numfds=SION_SIZE_NOT_VALID;
1050 
1051  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
1052  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
1053  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"sion_get_sizeof: invalid sion_filedesc, returning %d ...\n", sid));
1054  }
1055  DPRINTFP((2, "sion_get_sizeof", -1, "enter sid=%d\n", sid));
1056 
1057  rc=_sion_get_size_of_filedesc(sion_filedesc,numbytes,numfds);
1058 
1059  DPRINTFP((2, "sion_get_sizeof", -1, "leave sid=%d numbytes=%d numfds=%d\n", sid, *numbytes, *numfds));
1060 
1061  return (rc);
1062 
1063 }
1064 
1065 
1066 #define DFUNCTION "sion_dup"
1067 
1082 int sion_dup(int sid, int mode, int rank, uint64_t key)
1083 {
1084  int new_sid = SION_ID_NOT_VALID;
1085  _sion_filedesc *sion_filedesc;
1086 
1087  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
1088  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
1089  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_dup: invalid sion_filedesc, returning %d ...\n", sid));
1090  }
1091  DPRINTFP((8, DFUNCTION, -1, "enter sid=%d\n", sid));
1092 
1093  if (sion_filedesc->mode != SION_FILEMODE_READ) {
1094  DPRINTFP((8, DFUNCTION, -1, "invalid opened\n"));
1095  return(_sion_errorprint_on_rank(SION_ID_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank, DFUNCTION "[%2d]: file is not opened in read mode, returning ...", sion_filedesc->rank));
1096  }
1097 
1098  new_sid=_sion_dup(sid, mode, rank, key);
1099 
1100  DPRINTFP((8, DFUNCTION, -1, "leave sid=%d new_sid=%d\n", sid, new_sid));
1101 
1102  return (new_sid);
1103 
1104 }
1105 #undef DFUNCTION
1106 
1107 #define DFUNCTION "sion_dedup"
1108 
1116 int sion_dedup(int sid)
1117 {
1118  int rc = SION_SUCCESS;
1119  DPRINTFP((8, DFUNCTION, -1, "enter sid=%d\n", sid));
1120 
1121  rc=_sion_dedup(sid);
1122 
1123  DPRINTFP((8, DFUNCTION, -1, "leave sid=%d rc=%d\n", sid, rc));
1124 
1125  return (rc);
1126 
1127 }
1128 #undef DFUNCTION
1129 
1130 #define DFUNCTION "sion_lock_register_lock_callbacks"
1131 
1141 int sion_lock_register_lock_callbacks(int lock(void *), int unlock(void *), void *lock_data)
1142 {
1143  int rc = SION_SUCCESS;
1144  DPRINTFP((8, DFUNCTION, -1, "enter\n"));
1145 
1146  rc=_sion_lock_register_lock_callbacks(lock,unlock,lock_data);
1147 
1148  DPRINTFP((8, DFUNCTION, -1, "leave rc=%d\n", rc));
1149 
1150  return (rc);
1151 }
1152 #undef DFUNCTION
1153 
1154 #define DFUNCTION "sion_lock_user_callbacks_defined"
1155 
1161 {
1162  int rc = SION_SUCCESS;
1163  DPRINTFP((8, DFUNCTION, -1, "enter\n"));
1164 
1165  rc=_sion_lock_user_callbacks_defined();
1166 
1167  DPRINTFP((8, DFUNCTION, -1, "leave rc=%d\n", rc));
1168 
1169  return (rc);
1170 }
1171 #undef DFUNCTION
int sion_feof(int sid)
Function that indicates whether the end of file is reached for this task.
Definition: sion_common.c:732
sion_int64 _sion_file_write(const void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Write data to file.
Definition: sion_file.c:147
sion_int64 _sion_file_get_position(_sion_fileptr *sion_fileptr)
Get new position in file.
Definition: sion_file.c:268
int _sion_buffer_flush(_sion_filedesc *sion_filedesc)
Flush buffer.
Definition: sion_buffer.c:163
int _sion_flush_block(_sion_filedesc *sion_filedesc)
Update the internal data structure.
int sion_dup(int sid, int mode, int rank, uint64_t key)
Function which duplicates a sion file descriptor.
Definition: sion_common.c:1082
int _sion_seek_on_all_ranks_read(_sion_filedesc *sion_filedesc, int rank, int blocknr, sion_int64 posinblk)
Function to set the file pointer to a new position, updates internal data structure.
sion_int64 _sion_file_set_position(_sion_fileptr *sion_fileptr, sion_int64 startpointer)
Set new position in file.
Definition: sion_file.c:238
sion_int64 sion_bytes_avail_in_block(int sid)
Return the number of bytes available in the current chunk.
Definition: sion_common.c:802
sion_int64 sion_bytes_avail_in_chunk(int sid)
Function that returns the number of bytes available in the current chunk.
Definition: sion_common.c:817
int _sion_buffer_get_data_ptr(_sion_filedesc *sion_filedesc, void **data, sion_int64 *bytes)
Pop all data from buffer.
Definition: sion_buffer.c:138
Sion File Descriptor Structure.
Definition: sion_filedesc.h:77
int sion_get_endianness(void)
Return endianness.
Definition: sion_tools.c:29
int sion_ensure_free_space(int sid, sion_int64 bytes)
Funtion to ensure that enough space is available for writing.
Definition: sion_common.c:976
sion_int64 * all_blockcount
sion_int64 sion_get_position(int sid)
Function that returns the current file position.
Definition: sion_common.c:853
int sion_get_file_endianness(int sid)
Returns edianness of data in file sid.
Definition: sion_common.c:247
#define SION_FILESTATE_SEROPEN
Definition: sion_filedesc.h:25
int _sion_file_purge(_sion_fileptr *sion_fileptr)
Purge data to file.
Definition: sion_file.c:322
sion_int64 _sion_file_read(void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Read data from file.
Definition: sion_file.c:168
int _sion_seek_on_all_ranks_read_mapped(_sion_filedesc *sion_filedesc_master, int rank, int blocknr, sion_int64 posinblk)
Function to set the file pointer to a new position, updates internal data structure.
sion_int64 * all_currentpos
int _sion_seek_on_all_ranks_write_mapped(_sion_filedesc *sion_filedesc_master, int rank, int blocknr, sion_int64 posinblk)
Function to set the file pointer to a new position, updates internal data structure.
int _sion_file_set_buffer(_sion_fileptr *sion_fileptr, char *buffer, sion_int32 buffer_size)
Set buffer of fp.
Definition: sion_file.c:348
sion_int64 * all_globalranks
int _sion_alloc_filedesc_arrays(_sion_filedesc *sion_filedesc)
Allocate memory for the internal sion arrays.
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...
Definition: sion_common.c:1141
int _sion_get_size_of_filedesc(_sion_filedesc *sion_filedesc, int *numbytes, int *numfds)
get size of internal data structure sion_filedesc
sion_int64 * all_currentblocknr
int _sion_alloc_filedesc_block_arrays_only(_sion_filedesc *sion_filedesc)
Allocate memory for the internal sion structure, fields for all chunksizes of all tasks.
sion_int64 _sion_buffer_push(_sion_filedesc *sion_filedesc, const void *data, sion_int64 bytes)
Push data to buffer.
Definition: sion_buffer.c:102
int _sion_vcdtype(int sid)
Definition: sion_fd.c:56
int sion_get_current_locations(int sid, int *ntasks, sion_int64 **sion_currentpos, sion_int64 **sion_currentblocknr)
Returns current position in file and pointer fiels containing chunk sizes.
Definition: sion_common.c:301
int _sion_dedup(int sid)
Destroy a duplicated sion file descriptor.
Definition: sion_dup.c:154
sion_int32 fileptr_exported
int sion_get_locations(int sid, int *ntasks, int *maxchunks, sion_int64 *globalskip, sion_int64 *start_of_varheader, sion_int64 **sion_chunksizes, sion_int64 **sion_globalranks, sion_int64 **sion_blockcount, sion_int64 **sion_blocksizes)
Returns pointers to internal fields.
Definition: sion_common.c:81
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
size_t sion_fwrite(const void *data, size_t size, size_t nitems, int sid)
Write data to sion file.
Definition: sion_common.c:433
int sion_endianness_swap_needed(int sid)
Returns whether or not byte swapping is needed for sid.
Definition: sion_common.c:271
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:51
#define SION_FILE_FLAG_ANSI
Definition: sion_file.h:19
int _sion_dup(int sid, int mode, int rank, uint64_t key)
Create a duplicated sion file descriptor.
Definition: sion_dup.c:49
#define SION_FILEMODE_READ
Definition: sion_filedesc.h:33
int sion_seek(int sid, int rank, int currentblocknr, sion_int64 posinblk)
Function to set the file pointer to a new position.
Definition: sion_common.c:621
int _sion_errorprint(int rc, int level, const char *format,...)
Internal SION error.
int _sion_update_fileposition(_sion_filedesc *sion_filedesc)
Update the internal data structure (check fileposition)
int sion_lock_user_callbacks_defined()
Function which return flag, if user callback for locking are registered.
Definition: sion_common.c:1160
#define SION_FILESTATE_PAROPEN
Definition: sion_filedesc.h:24
int _sion_file_set_second_fileptr(_sion_fileptr *sion_fileptr, FILE *fileptr)
Set second fileptr for file if opened with ANSI.
Definition: sion_file.c:375
int sion_get_sizeof(int sid, int *numbytes, int *numfds)
Function returns size of internal data structure for sid.
Definition: sion_common.c:1044
int _sion_file_unset_second_fileptr(_sion_fileptr *sion_fileptr)
Unset second fileptr for file if opened with ANSI.
Definition: sion_file.c:395
int _sion_seek_on_all_ranks_read_master(_sion_filedesc *sion_filedesc, int rank, int blocknr, sion_int64 posinblk)
Function to set the file pointer to a new position, updates internal data structure.
sion_int32 fpbuffer_size
Definition: sion_filedesc.h:86
sion_int64 * blocksizes
Definition: sion_filedesc.h:98
#define SION_FILESTATE_PAROPENMAPPEDMASTER
Definition: sion_filedesc.h:28
sion_int32 currentblocknr
Definition: sion_filedesc.h:95
#define SION_FILESTATE_SEROPENRANK
Definition: sion_filedesc.h:26
int _sion_create_new_block(_sion_filedesc *sion_filedesc)
Create a new block for the internal data structure.
#define SION_FILEDESCRIPTOR
Definition: sion_fd.h:17
sion_int64 * all_chunksizes
int _sion_print_filedesc(_sion_filedesc *sion_filedesc, int level, char *desc, int flag)
Print the initialized sion file description.
int _sion_freevcd(int sid)
Definition: sion_fd.c:46
#define SION_FILESTATE_CLOSE
Definition: sion_filedesc.h:31
size_t sion_fread(void *data, size_t size, size_t nitems, int sid)
Read data from sion file.
Definition: sion_common.c:553
int _sion_seek_on_current_rank_read(_sion_filedesc *sion_filedesc, int rank, int blocknr, sion_int64 posinblk)
Function to set the file pointer to a new position in the same rank, updates internal data structure.
#define SION_FILEMODE_WRITE
Definition: sion_filedesc.h:34
int _sion_check_on_collective_mode(_sion_filedesc *sion_filedesc)
check if a collective operation are already called,
Sion Time Stamp Header.
int sion_dedup(int sid)
Function which destroy a duplicated sion file descriptor.
Definition: sion_common.c:1116
int _sion_seek_on_all_ranks_write(_sion_filedesc *sion_filedesc, int rank, int blocknr, sion_int64 posinblk)
Function to set the file pointer to a new position, updates internal data structure.
sion_int64 start_of_varheader
#define SION_FILESTATE_SEROPENMASTER
Definition: sion_filedesc.h:27
sion_int64 * all_blocksizes
int _sion_file_flush(_sion_fileptr *sion_fileptr)
Flush data to file.
Definition: sion_file.c:298
int sion_get_current_location(int sid, int *currentchunknr, sion_int64 *currentpos, int *maxchunks, sion_int64 **chunksizes)
Returns current position in file and pointer fiels containing chunk sizes.
Definition: sion_common.c:179
_sion_filedesc ** multifiles
_sion_fileptr * fileptr
Definition: sion_filedesc.h:80
int sion_seek_fp(int sid, int rank, int currentblocknr, sion_int64 posinblk, FILE **fileptr)
Deprecated. Use sion_seek() instead.
Definition: sion_common.c:644
int _sion_seek_on_current_rank_write(_sion_filedesc *sion_filedesc, int rank, int blocknr, sion_int64 posinblk)
Function to set the file pointer to a new position in the same rank, updates internal data structure.
int sion_flush(int sid)
Flushed sion file.
Definition: sion_common.c:953