SIONlib  1.7.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-2018 **
5 ** Forschungszentrum Juelich, Juelich Supercomputing Centre **
6 ** **
7 ** See the file COPYRIGHT in the package base directory for details **
8 ****************************************************************************/
9 
16 #define _XOPEN_SOURCE 700
17 
18 #include <stdlib.h>
19 #include <stdio.h>
20 #include <string.h>
21 #include <time.h>
22 #include <assert.h>
23 
24 #include <sys/time.h>
25 
26 #include "sion.h"
27 #include "sion_debug.h"
28 #include "sion_error_handler.h"
29 #include "sion_filedesc.h"
30 #include "sion_tools.h"
31 #include "sion_fd.h"
32 #include "sion_file.h"
33 #include "sion_metadata.h"
34 #include "sion_internal.h"
35 #include "sion_internal_seek.h"
36 #include "sion_hints.h"
37 #include "sion_printts.h"
38 #include "sion_buffer.h"
39 #include "sion_dup.h"
40 #include "sion_lock.h"
41 #include "sion_buddy_common.h"
42 
43 
44 sion_io_stat_t* sion_get_io_info_buddy(int sid, int roles, int flag);
45 
80 int sion_get_locations(int sid,
81  int *ntasks,
82  int *maxchunks,
83  sion_int64 *globalskip,
84  sion_int64 *start_of_varheader,
85  sion_int64 **sion_chunksizes,
86  sion_int64 **sion_globalranks,
87  sion_int64 **sion_blockcount,
88  sion_int64 **sion_blocksizes ) {
89  int rc = SION_SUCCESS;
90  _sion_filedesc *sion_filedesc;
91 #ifdef SION_SERIAL_MASTER
92  _sion_filedesc *help;
93 #endif
94 
95  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
96  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
97  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
98  }
99  DPRINTFP((1, "sion_get_locations", -1, "enter\n"));
100 
101 #ifdef SION_SERIAL_MASTER
102  if((sion_filedesc->state == SION_FILESTATE_SEROPENMASTER) &&
103  (sion_filedesc->all_blockcount==NULL) ) {
104  int i;
105 
106  /* collect info from sub files */
107  _sion_alloc_filedesc_arrays(sion_filedesc);
109 
110  for (i = 0; i < sion_filedesc->ntasks; i++) {
111  int lfile=sion_filedesc->mapping[i*2+0];
112  int 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  int lfile=sion_filedesc->mapping[i*2+0];
119  int lrank=sion_filedesc->mapping[i*2+1];
120  int blknum;
121  help=sion_filedesc->multifiles[lfile];
122  for (blknum = 0; blknum < sion_filedesc->all_blockcount[i]; blknum++) {
123  sion_filedesc->all_blocksizes[sion_filedesc->ntasks * blknum + i] =
124  help->all_blocksizes[help->ntasks * blknum + lrank];
125  }
126  }
127  }
128 #endif
129 
130  *ntasks = sion_filedesc->ntasks;
131  *maxchunks = sion_filedesc->maxusedchunks;
132  *sion_chunksizes = sion_filedesc->all_chunksizes;
133  *sion_globalranks = sion_filedesc->all_globalranks;
134  *sion_blockcount = sion_filedesc->all_blockcount;
135  *sion_blocksizes = sion_filedesc->all_blocksizes;
136  *globalskip = sion_filedesc->globalskip;
137  *start_of_varheader = sion_filedesc->start_of_varheader;
138 
139  DPRINTFP((1, "sion_get_locations", -1, "leave\n"));
140 
141  return (rc);
142 }
143 
144 int _sion_close_sid(int sid)
145 {
146  int rc = SION_SUCCESS;
147  _sion_filedesc *sion_filedesc;
148 
149  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
150  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
151  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_close: invalid sion_filedesc, aborting %d ...\n", sid));
152  }
153  rc=_sion_close(sion_filedesc);
154 
155  if(rc==SION_SUCCESS) {
156  _sion_freevcd(sid);
157  _sion_free_filedesc(sion_filedesc);
158  }
159 
160  return(rc);
161 
162 }
163 
181 int sion_get_current_location(int sid, int *currentchunknr, sion_int64 *currentpos, int *maxchunks, sion_int64 **chunksizes)
182 {
183  int rc = SION_SUCCESS;
184  _sion_filedesc *sion_filedesc;
185 
186  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
187  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
188  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
189  }
190  DPRINTFP((1, "sion_get_current_location", -1, "enter\n"));
191 
192  *currentchunknr = sion_filedesc->currentblocknr;
193  *currentpos = sion_filedesc->currentpos - (sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip);
194  *maxchunks = sion_filedesc->lastchunknr+1;
195  *chunksizes = sion_filedesc->blocksizes;
196 
197  DPRINTFP((1, "sion_get_current_location", -1, "leave\n"));
198  return (rc);
199 }
200 
215 int sion_get_mapping(int sid,
216  int *mapping_size,
217  sion_int32 **mapping,
218  int *numfiles ) {
219  int rc = SION_SUCCESS;
220  _sion_filedesc *sion_filedesc;
221 
222  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
223  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
224  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
225  }
226  DPRINTFP((1, "sion_get_mapping", -1, "enter\n"));
227 
228  if(sion_filedesc->mapping_size>0) {
229  *mapping_size=sion_filedesc->mapping_size;
230  *mapping=sion_filedesc->mapping;
231  } else {
232  *mapping_size=-1;
233  }
234  *numfiles=sion_filedesc->nfiles;
235 
236  DPRINTFP((1, "sion_get_mapping", -1, "leave (mapping_size=%d)\n",*mapping_size));
237 
238  return (rc);
239 }
240 
250 {
251  _sion_filedesc *sion_filedesc;
252 
253  DPRINTFP((1, "sion_get_file_endianness", -1, "enter (sid=%d)\n",sid));
254 
255  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
256  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
257  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
258  }
259 
260  DPRINTFP((1, "sion_get_file_endianness", -1, "leave (sid=%d)\n",sid));
261  /* return endianness of user data */
262  return ((sion_filedesc->endianness >> 8) & 1);
263 }
264 
274 {
275  int swap_needed = 0;
276 
277  DPRINTFP((1, "sion_endianness_swap_needed", -1, "enter (sid=%d)\n",sid));
278 
279  swap_needed = (sion_get_file_endianness(sid) != sion_get_endianness());
280 
281  DPRINTFP((1, "sion_endianness_swap_needed", -1, "leave (swap_needed=%d)\n",
282  swap_needed));
283 
284  return swap_needed;
285 }
286 
304  int *ntasks,
305  sion_int64 **sion_currentpos,
306  sion_int64 **sion_currentblocknr)
307 {
308  int rc = SION_SUCCESS;
309  _sion_filedesc *sion_filedesc;
310 
311  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
312  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
313  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
314  }
315  DPRINTFP((1, "sion_get_current_locations", -1, "enter\n"));
316 
317  *ntasks = sion_filedesc->ntasks;
318  *sion_currentpos = sion_filedesc->all_currentpos;
319  *sion_currentblocknr = sion_filedesc->all_currentblocknr;
320 
321  DPRINTFP((1, "sion_get_current_locations", -1, "leave\n"));
322  return (rc);
323 }
324 
325 int sion_get_number_of_files(int sid)
326 {
327  _sion_filedesc *sion_filedesc;
328 
329  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
330  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
331  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
332  }
333 
334  return (sion_filedesc->nfiles);
335 }
336 
337 int sion_get_filenumber(int sid)
338 {
339  _sion_filedesc *sion_filedesc;
340 
341  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
342  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
343  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
344  }
345 
346  return (sion_filedesc->filenumber);
347 }
348 
349 int sion_is_serial_opened(int sid)
350 {
351  _sion_filedesc *sion_filedesc;
352 
353  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
354  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
355  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
356  }
357 
358  return (sion_filedesc->state == SION_FILESTATE_SEROPEN
359  || sion_filedesc->state == SION_FILESTATE_SEROPENRANK
360  || sion_filedesc->state == SION_FILESTATE_SEROPENMASTER);
361 }
362 
363 int sion_using_hints(int sid)
364 {
365  _sion_filedesc *sion_filedesc;
366 
367  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
368  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
369  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
370  }
371 
372  return (sion_filedesc->usehints);
373 }
374 
375 sion_int64 sion_get_bytes_written(int sid)
376 {
377  _sion_filedesc *sion_filedesc;
378  sion_int64 bytes=SION_SIZE_NOT_VALID;
379 
380  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
381  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
382  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
383  }
384 
385  if (sion_filedesc->mode == SION_FILEMODE_WRITE) {
386  int i;
387  if (sion_filedesc->usebuffer) {
388  _sion_buffer_flush(sion_filedesc);
389  }
390  _sion_flush_block(sion_filedesc);
391  bytes=0;
392  for(i=0;i<=sion_filedesc->lastchunknr;i++) bytes+=sion_filedesc->blocksizes[i];
393  }
394 
395  return (bytes);
396 }
397 
398 sion_int64 sion_get_bytes_read(int sid)
399 {
400  _sion_filedesc *sion_filedesc;
401  sion_int64 bytes=SION_SIZE_NOT_VALID;
402 
403  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
404  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
405  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
406  }
407 
408  if (sion_filedesc->mode == SION_FILEMODE_READ) {
409  int i;
410  _sion_file_purge(sion_filedesc->fileptr);
411  sion_filedesc->currentpos = _sion_file_get_position(sion_filedesc->fileptr);
412 
413  bytes=0;
414  for(i=0;i<sion_filedesc->currentblocknr;i++) bytes+=sion_filedesc->blocksizes[i];
415  /* current chunk */
416  bytes+=sion_filedesc->currentpos - (sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip);
417  }
418 
419  return (bytes);
420 }
421 
422 /* return list of filenames created and the size of their payload, and the task role on this file */
423 sion_io_stat_t* sion_get_io_info(int sid) {
424 
425  return(sion_get_io_info_by_spec(sid,SION_ROLE_COLLECTOR|SION_ROLE_WRITER|SION_ROLE_NOWRITER,SION_GET_IO_INFO_FLAG_NONE));
426 
427 }
428 
429 /* return list of filenames created and the size of their payload, and the task role on this file */
430 sion_io_stat_t* sion_get_io_info_by_spec(int sid, int roles, int flag) {
431  _sion_filedesc *sion_filedesc;
432  sion_io_stat_t *p=NULL;
433 
434  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
435  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
436  _sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid);
437  return(NULL);
438  }
439 
440  /* branch to buddy CP */
441  if(sion_filedesc->usebuddy) {
442  p=sion_get_io_info_buddy(sid,roles,flag);
443  }
444 
445  return (p);
446 }
447 
448 int sion_free_io_info(sion_io_stat_t *p) {
449  return (_sion_free_io_info(p));
450 }
451 
452 
466 size_t sion_fwrite(const void *data, size_t size, size_t nitems, int sid)
467 {
468  sion_int64 bytes_to_write, bbytes;
469  _sion_filedesc *sion_filedesc;
470  size_t rc=0, frc;
471  void *bdata;
472 
473  DPRINTFP((1, "sion_fwrite", -1, "enter size=%ld nitems=%ld\n",(long) size, (long) nitems));
474 
475  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
476  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
477  return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
478  }
479 
480  _sion_check_on_collective_mode(sion_filedesc);
481 
482  bytes_to_write=size*nitems;
483 
484  /* buffering? */
485  if(sion_filedesc->usebuffer) {
486 
487  /* create a new block if needed and check size of input */
488  if(!sion_ensure_free_space(sid,bytes_to_write)) {
489  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
490  "could not ensure free space for this buffered block of size %d, returning sid=%d ...",
491  (int) bytes_to_write, sid));
492  }
493 
494  char *data_ptr=(void *) data;
495  sion_int64 bytes_left = sion_filedesc->chunksize -
496  sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
497  bbytes = sion_filedesc->buffer_ptr;
498 
499  /* check for enough space in current block */
500  if (bbytes + bytes_to_write > bytes_left) {
501  /* not enough space for buffer + bytes_to_write => flush first */
502  _sion_buffer_get_data_ptr(sion_filedesc,&bdata,&bbytes);
503  if(sion_ensure_free_space(sid,bbytes)) {
504  frc = _sion_file_write(bdata, bbytes, sion_filedesc->fileptr);
505  if(frc != bbytes) {
506  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
507  "could not write data (%d bytes) to file (sid=%d) ...", (int) bbytes, sid));
508  }
509  } else {
510  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
511  "could not ensure free space for this buffered block of size %d, returning sid=%d ...",
512  (int) bbytes, sid));
513  }
514  /* increase current position */
515  sion_filedesc->currentpos+=bbytes;
516  }
517  /* buffer data */
518  sion_int64 bytes_buffered=_sion_buffer_push(sion_filedesc,data_ptr,bytes_to_write);
519  bytes_to_write-=bytes_buffered;
520  data_ptr+=bytes_buffered;
521 
522  while(bytes_to_write>0) {
523  /* flush filled buffer to file, not all data could be stored */
524  _sion_buffer_get_data_ptr(sion_filedesc,&bdata,&bbytes);
525  if(sion_ensure_free_space(sid,bbytes)) {
526  frc = _sion_file_write(bdata, bbytes, sion_filedesc->fileptr);
527  if(frc != bbytes) {
528  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
529  "could not write data (%d bytes) to file (sid=%d) ...", (int) bbytes, sid));
530  }
531  } else {
532  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
533  "could not ensure free space for this buffered block of size %d, returning sid=%d ...",
534  (int) bbytes, sid));
535  }
536  /* increase current position */
537  sion_filedesc->currentpos+=bbytes;
538 
539  /* next try to push data into buffer */
540  bytes_buffered=_sion_buffer_push(sion_filedesc,data_ptr,bytes_to_write);
541  bytes_to_write-=bytes_buffered;
542  data_ptr+=bytes_buffered;
543  }
544  /* reset value since it will be used later */
545  bytes_to_write=size*nitems;
546  /* return code: bytes stored */
547  rc=(size_t) (size ? bytes_to_write / size : 0);
548 
549  } else {
550  /* normal write */
551  if(sion_ensure_free_space(sid,bytes_to_write)) {
552  frc = _sion_file_write(data, bytes_to_write, sion_filedesc->fileptr);
553  if(frc != bytes_to_write) {
554  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
555  "could not write data (%d bytes) to file (frc=%d sid=%d) ...", (int) bytes_to_write, (int) frc, sid));
556  }
557 
558  rc=(size_t) (size ? bytes_to_write / size : 0);
559 
560  } else {
561  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));
562  }
563  /* increase current position */
564  sion_filedesc->currentpos+=bytes_to_write;
565  }
566 
567  DPRINTFP((1, "sion_fwrite", -1, "leave rc=%ld\n",(long) rc));
568  return(rc);
569 }
570 
585 size_t sion_fread( void *data, size_t size, size_t nitems, int sid) {
586  _sion_filedesc *sion_filedesc;
587  sion_int64 bytes, bread, bytes_left;
588 
589  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
590  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
591  return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
592  }
593  if (!data) {
594  /* FIXME: replace SION_ANSI_SIZE_NOT_VALID? */
595  return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid pointer, aborting %d ...\n", data));
596  }
597 
598  /* check and update current position */
599  _sion_update_fileposition(sion_filedesc);
600 
601  bytes_left = sion_filedesc->startpos +
602  sion_filedesc->currentblocknr * sion_filedesc->globalskip +
603  sion_filedesc->blocksizes[sion_filedesc->currentblocknr] -
604  sion_filedesc->currentpos;
605 
606  DPRINTFP((1, "sion_fread", -1, "enter\n"));
607  DPRINTFP((4, "sion_fread", -1, " parameter size=%ld nitems=%ld\n",(long) size,(long) nitems));
608 
609  _sion_check_on_collective_mode(sion_filedesc);
610 
611  bread=0;
612  bytes=size*nitems;
613 
614  /* Check size. bytes_left == 0 is handled by sion_feof */
615  if((sion_filedesc->chunksize < bytes) || ((bytes_left < bytes) &&
616  (bytes_left != 0))) {
617  /* FIXME: replace SION_ANSI_SIZE_NOT_VALID? */
618  return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,"not enough bytes left in chunk, aborting (%ld < %ld) ...\n", bytes_left, bytes));
619  }
620 
621  if(!sion_feof(sid)) {
622  bread=_sion_file_read(data,bytes,sion_filedesc->fileptr);
623  DPRINTFP((256, "sion_fread", -1, " _sion_file_read returns %ld\n",(long) bread));
624  }
625  if(bread!=bytes) {
626  return (size_t) (size ? bread / size : 0);
627  }
628 
629  bread = size ? bread / size : 0;
630 
631  /* increase current position */
632  sion_filedesc->currentpos+=bytes;
633 
634  DPRINTFP((4, "sion_fread", -1, " return value %ld\n",(long) bread));
635  DPRINTFP((1, "sion_fread", -1, "leave\n"));
636  return(bread);
637 }
638 
653 int sion_seek(int sid, int rank, int currentblocknr, sion_int64 posinblk)
654 {
655  FILE *fileptr;
656  int rc=0;
657  /* TBD: check if not sion_open and multi file */
658  rc=sion_seek_fp(sid,rank,currentblocknr,posinblk,&fileptr);
659  return(rc);
660 
661 }
662 
676 int sion_seek_fp(int sid, int rank, int currentblocknr, sion_int64 posinblk, FILE **fileptr)
677 {
678  int rc = SION_SUCCESS;
679  _sion_filedesc *sion_filedesc;
680 
681  DPRINTFP((1, "sion_seek_fp", -1, " enter seek with sid=%d\n", sid));
682  assert((_sion_vcdtype(sid) == SION_FILEDESCRIPTOR));
683 
684  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
685  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
686  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_seek: invalid sion_filedesc, aborting %d ...\n", sid));
687  }
688 
689  /* check state */
690  if ((sion_filedesc->mode != SION_FILEMODE_READ) && (sion_filedesc->mode != SION_FILEMODE_WRITE)) {
691  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));
692  }
693  if (sion_filedesc->usebuffer) {
694  _sion_buffer_flush(sion_filedesc);
695  }
696  if ( (sion_filedesc->state != SION_FILESTATE_PAROPEN)
697  && (sion_filedesc->state != SION_FILESTATE_SEROPEN)
698  && (sion_filedesc->state != SION_FILESTATE_SEROPENMASTER)
699  && (sion_filedesc->state != SION_FILESTATE_SEROPENRANK)
700  && (sion_filedesc->state != SION_FILESTATE_PAROPENMAPPEDMASTER)
701  ) {
702  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));
703  }
704 
705 
706  if (sion_filedesc->mode == SION_FILEMODE_READ) { /* READ */
707 
708  if (sion_filedesc->state == SION_FILESTATE_SEROPEN) {
709  rc = _sion_seek_on_all_ranks_read(sion_filedesc, rank, currentblocknr, posinblk);
710  }
711  else if (sion_filedesc->state == SION_FILESTATE_SEROPENMASTER) {
712  rc = _sion_seek_on_all_ranks_read_master(sion_filedesc, rank, currentblocknr, posinblk);
713  }
714  else if ((sion_filedesc->state == SION_FILESTATE_SEROPENRANK) ||
715  (sion_filedesc->state == SION_FILESTATE_PAROPEN)) {
716  rc = _sion_seek_on_current_rank_read(sion_filedesc, rank, currentblocknr, posinblk);
717  }
718  else if (sion_filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
719  rc = _sion_seek_on_all_ranks_read_mapped(sion_filedesc, rank, currentblocknr, posinblk);
720  }
721  } else { /* WRITE */
722  if (sion_filedesc->state == SION_FILESTATE_SEROPEN) {
723  rc = _sion_seek_on_all_ranks_write(sion_filedesc, rank, currentblocknr, posinblk);
724  }
725  else if (sion_filedesc->state == SION_FILESTATE_SEROPENRANK) {
726  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 ...");
727  }
728  else if (sion_filedesc->state == SION_FILESTATE_PAROPEN) {
729  rc = _sion_seek_on_current_rank_write(sion_filedesc, rank, currentblocknr, posinblk);
730  }
731  else if (sion_filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
732  rc = _sion_seek_on_all_ranks_write_mapped(sion_filedesc, rank, currentblocknr, posinblk);
733  }
734 
735  }
736 
737  /* TBD: implement sion_open and sion_seek_fp for multi-files */
738  if(fileptr!=NULL) {
739  if(sion_filedesc->fileptr->flags&SION_FILE_FLAG_ANSI) {
740  *fileptr=sion_filedesc->fileptr->fileptr;
741  sion_filedesc->fileptr_exported=1;
742 
743  } else {
744  *fileptr=NULL;
745  sion_filedesc->fileptr_exported=0;
746  }
747  }
748 
749  DPRINTFP((1, "sion_seek_fp", -1, "leave seek rc=%d\n",rc));
750 
751  return (rc);
752 }
753 
764 int sion_feof(int sid)
765 {
766  int rc = SION_NOT_SUCCESS;
767  sion_int64 maxpos;
768 
769  _sion_filedesc *sion_filedesc;
770  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
771  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
772  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"sion_feof: invalid sion_filedesc, aborting %d ...\n", sid));
773  }
774 
775  DPRINTFP((8, "sion_feof", -1, "enter feof sid=%d currentpos=%15lld\n", sid, sion_filedesc->currentpos));
776 
777  /* check and update current position */
778  _sion_update_fileposition(sion_filedesc);
779 
780  maxpos = sion_filedesc->startpos
781  + sion_filedesc->currentblocknr * sion_filedesc->globalskip + sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
782 
783  DPRINTFP((16, "sion_feof", -1,
784  " after flush sid=%d currentpos=%15lld maxpos= %lld startpos=%lld curblknr=%d\n",
785  sid, sion_filedesc->currentpos, maxpos, sion_filedesc->startpos, sion_filedesc->currentblocknr));
786 
787  if (sion_filedesc->currentpos < maxpos) {
788  /* end of current block not reached */
789  rc = 0;
790  DPRINTFP((16, "sion_feof", -1, " end of current block %d not reached sid=%d\n",
791  sion_filedesc->currentblocknr, sid));
792  } else {
793  if (sion_filedesc->currentblocknr < sion_filedesc->lastchunknr) {
794 
795  /* apply hint for freeing current chunk */
796  _sion_apply_hints(sion_filedesc,SION_HINTS_FREE_TYPE_CHUNK);
797 
798  /* end of current block reached, skip to next block */
799  sion_filedesc->currentblocknr++;
800  sion_filedesc->currentpos = sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip;
801 
802  /* apply hint for access current (new) chunk */
803  _sion_apply_hints(sion_filedesc,SION_HINTS_ACCESS_TYPE_CHUNK);
804 
805  _sion_file_purge(sion_filedesc->fileptr);
806  _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->currentpos);
807  rc = SION_NOT_SUCCESS;
808  DPRINTFP((8, "sion_feof", -1,
809  " end of block %d reached, skipping to next %lld -> %lld position=%lld gs=%lld sid=%d\n",
810  sion_filedesc->currentblocknr - 1,
811  sion_filedesc->currentpos, _sion_file_get_position(sion_filedesc->fileptr), sion_filedesc->currentpos, sion_filedesc->globalskip, sid));
812  }
813  else {
814  /* end of last block reached */
815  DPRINTFP((8, "sion_feof", -1, " end of last block %d reached sid=%d\n", sion_filedesc->currentblocknr, sid));
816  rc = SION_SUCCESS;
817  }
818  }
819 
820  DPRINTFP((8, "sion_feof", -1, "leave feof sid=%d currentpos=%15lld rc=%d\n", sid, sion_filedesc->currentpos, rc));
821 
822  return (rc);
823 }
824 
834 sion_int64 sion_bytes_avail_in_block(int sid)
835 {
836  return(sion_bytes_avail_in_chunk(sid));
837 }
838 
849 sion_int64 sion_bytes_avail_in_chunk(int sid)
850 {
851  sion_int64 maxpos;
852  sion_int64 bytes_avail=SION_SIZE_NOT_VALID;
853  _sion_filedesc *sion_filedesc;
854 
855  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
856  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
857  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"sion_bytes_avail_in_chunk: invalid sion_filedesc, aborting %d ...\n", sid));
858  }
859 
860 
861  _sion_update_fileposition(sion_filedesc);
862 
863  maxpos = sion_filedesc->startpos
864  + sion_filedesc->currentblocknr * sion_filedesc->globalskip + sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
865 
866  bytes_avail = maxpos - sion_filedesc->currentpos;
867 
868  DPRINTFP((8, "sion_bytes_avail_in_chunk", -1,
869  "leave sid=%d rank=%4d currentpos=%lld maxpos= %lld -> bytes to read %lld\n",
870  sid, sion_filedesc->rank, sion_filedesc->currentpos, maxpos, bytes_avail));
871 
872  return (bytes_avail);
873 }
874 
885 sion_int64 sion_get_position(int sid)
886 {
887  _sion_filedesc *sion_filedesc;
888 
889  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
890  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
891  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"sion_get_position: invalid sion_filedesc, aborting %d ...\n", sid));
892  }
893 
894 
895  _sion_file_flush(sion_filedesc->fileptr);
896 
897  return (_sion_file_get_position(sion_filedesc->fileptr));
898 
899 }
900 
901 int sion_set_fp_closed(int sid)
902 {
903  int rc = SION_SUCCESS;
904  _sion_filedesc *sion_filedesc;
905 
906  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
907  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
908  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_set_fp_closed: invalid sion_filedesc, aborting %d ...\n", sid));
909  }
910  sion_filedesc->state = SION_FILESTATE_CLOSE;
911  return (rc);
912 }
913 
914 int sion_set_second_fp(int sid, FILE *secondfd)
915 {
916  int rc = SION_SUCCESS;
917  _sion_filedesc *sion_filedesc;
918 
919 
920  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
921  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
922  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_set_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
923  }
924 
925  if(!(sion_filedesc->fileptr->flags&SION_FILE_FLAG_ANSI)) {
926  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));
927  }
928 
929  _sion_file_set_second_fileptr(sion_filedesc->fileptr,secondfd);
930 
931  _sion_print_filedesc(sion_filedesc, 512, "sion_set_second_fd", 1);
932  /*
933  if (sion_filedesc->mode == SION_FILEMODE_READ) {
934  sion_seek(sid, SION_CURRENT_RANK, 0, 0);
935  }
936  */
937  return (rc);
938 }
939 
940 int sion_unset_second_fp(int sid)
941 {
942  int rc = SION_SUCCESS;
943  _sion_filedesc *sion_filedesc;
944 
945  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
946  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
947  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_unset_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
948  }
949 
950  if(!(sion_filedesc->fileptr->flags&SION_FILE_FLAG_ANSI)) {
951  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));
952  }
953 
955  return (rc);
956 }
957 
958 int sion_optimize_fp_buffer(int sid)
959 {
960  int rc = SION_SUCCESS;
961  _sion_filedesc *sion_filedesc;
962 
963  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
964  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
965  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_set_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
966  }
967 
968  sion_filedesc->fpbuffer = (char *) malloc(sion_filedesc->fsblksize);
969  if (sion_filedesc->fpbuffer == NULL) {
970  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));
971  }
972  sion_filedesc->fpbuffer_size = sion_filedesc->fsblksize;
973 
974  rc=_sion_file_set_buffer(sion_filedesc->fileptr, sion_filedesc->fpbuffer, sion_filedesc->fpbuffer_size);
975  return (rc);
976 }
977 
985 int sion_flush(int sid)
986 {
987  int rc = SION_SUCCESS;
988  _sion_filedesc *sion_filedesc;
989 
990  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
991  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
992  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_unset_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
993  }
994  rc = _sion_flush_block(sion_filedesc);
995  return (rc);
996 }
997 
1008 int sion_ensure_free_space(int sid, sion_int64 bytes)
1009 {
1010  _sion_filedesc *sion_filedesc;
1011  sion_int64 byteswritten;
1012  int rc = SION_SUCCESS;
1013 
1014  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
1015  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
1016  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_ensure_free_space: invalid sion_filedesc, returning %d ...\n", sid));
1017  }
1018 
1019  DPRINTFP((8, "_sion_ensure_free_space", -1, "enter ensure_free sid=%d bytes=%lld\n", sid, bytes));
1020 
1021  if (sion_filedesc->mode != SION_FILEMODE_WRITE) {
1022  DPRINTFP((8, "_sion_ensure_free_space", -1, "invalid opened\n"));
1023  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));
1024  }
1025  if (!sion_filedesc->usecoll) {
1026  if (sion_filedesc->fileptr == NULL) {
1027  DPRINTFP((8, "_sion_ensure_free_space", -1, "file not opened\n"));
1028  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));
1029  }
1030  }
1031 
1032  if (bytes > sion_filedesc->chunksize) {
1033  DPRINTFP((8, "_sion_ensure_free_space", -1, "could not write %lld bytes, chunksize=%lld\n", bytes, sion_filedesc->chunksize));
1034  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));
1035  }
1036 
1037  _sion_flush_block(sion_filedesc);
1038 
1039  DPRINTFP((16, "_sion_ensure_free_space", -1,
1040  " after getpos sid=%d fileposition is %lld bytes=%lld\n", sid, sion_filedesc->currentpos, bytes));
1041 
1042  byteswritten = sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
1043 
1044  DPRINTFP((16, "_sion_ensure_free_space", -1,
1045  " sid=%d byteswritten(%lld) + new bytes (%lld) = %lld\n", sid, byteswritten, bytes, byteswritten + bytes));
1046 
1047  if ((byteswritten + bytes) > sion_filedesc->chunksize) {
1048  /* not enough space for writing next data */
1049  _sion_create_new_block(sion_filedesc);
1050  }
1051 
1052  DPRINTFP((8, "_sion_ensure_free_space", -1,
1053  "leave ensure_free sid=%d fileposition is %lld bw+bytes=%lld <= chunksize=%lld (fsblksize=%d)\n",
1054  sid, sion_filedesc->currentpos, byteswritten + bytes, sion_filedesc->chunksize, sion_filedesc->fsblksize));
1055 
1056 
1057  return (rc);
1058 
1059 }
1060 
1061 int sion_is_thread_safe() {
1062 #ifdef SION_PTHREADS
1063  return(SION_SUCCESS);
1064 #else
1065  return(SION_NOT_SUCCESS);
1066 #endif
1067 }
1068 
1078 int sion_get_sizeof(int sid, int *numbytes, int *numfds) {
1079  _sion_filedesc *sion_filedesc;
1080  int rc=SION_NOT_SUCCESS;
1081 
1082  *numbytes=SION_SIZE_NOT_VALID;
1083  *numfds=SION_SIZE_NOT_VALID;
1084 
1085  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
1086  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
1087  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"sion_get_sizeof: invalid sion_filedesc, returning %d ...\n", sid));
1088  }
1089  DPRINTFP((2, "sion_get_sizeof", -1, "enter sid=%d\n", sid));
1090 
1091  rc=_sion_get_size_of_filedesc(sion_filedesc,numbytes,numfds);
1092 
1093  DPRINTFP((2, "sion_get_sizeof", -1, "leave sid=%d numbytes=%d numfds=%d\n", sid, *numbytes, *numfds));
1094 
1095  return (rc);
1096 
1097 }
1098 
1099 
1100 #define DFUNCTION "sion_dup"
1101 
1116 int sion_dup(int sid, int mode, int rank, uint64_t key)
1117 {
1118  int new_sid = SION_ID_NOT_VALID;
1119  _sion_filedesc *sion_filedesc;
1120 
1121  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
1122  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
1123  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_dup: invalid sion_filedesc, returning %d ...\n", sid));
1124  }
1125  DPRINTFP((8, DFUNCTION, -1, "enter sid=%d\n", sid));
1126 
1127  if (sion_filedesc->mode != SION_FILEMODE_READ) {
1128  DPRINTFP((8, DFUNCTION, -1, "invalid opened\n"));
1129  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));
1130  }
1131 
1132  new_sid=_sion_dup(sid, mode, rank, key);
1133 
1134  DPRINTFP((8, DFUNCTION, -1, "leave sid=%d new_sid=%d\n", sid, new_sid));
1135 
1136  return (new_sid);
1137 
1138 }
1139 #undef DFUNCTION
1140 
1141 #define DFUNCTION "sion_dedup"
1142 
1150 int sion_dedup(int sid)
1151 {
1152  int rc = 0;
1153  DPRINTFP((8, DFUNCTION, -1, "enter sid=%d\n", sid));
1154 
1155  rc=_sion_dedup(sid);
1156 
1157  DPRINTFP((8, DFUNCTION, -1, "leave sid=%d rc=%d\n", sid, rc));
1158 
1159  return (rc);
1160 
1161 }
1162 #undef DFUNCTION
1163 
1164 #define DFUNCTION "sion_lock_register_lock_callbacks"
1165 
1175 int sion_lock_register_lock_callbacks(int lock(void *), int unlock(void *), void *lock_data)
1176 {
1177  int rc = 0;
1178  DPRINTFP((8, DFUNCTION, -1, "enter\n"));
1179 
1180  rc=_sion_lock_register_lock_callbacks(lock,unlock,lock_data);
1181 
1182  DPRINTFP((8, DFUNCTION, -1, "leave rc=%d\n", rc));
1183 
1184  return (rc);
1185 }
1186 #undef DFUNCTION
1187 
1188 #define DFUNCTION "sion_lock_user_callbacks_defined"
1189 
1195 {
1196  int rc = 0;
1197  DPRINTFP((8, DFUNCTION, -1, "enter\n"));
1198 
1199  rc=_sion_lock_user_callbacks_defined();
1200 
1201  DPRINTFP((8, DFUNCTION, -1, "leave rc=%d\n", rc));
1202 
1203  return (rc);
1204 }
1205 #undef DFUNCTION
int sion_feof(int sid)
Function that indicates whether the end of file is reached for this task.
Definition: sion_common.c:764
sion_int64 _sion_file_write(const void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Write data to file.
Definition: sion_file.c:141
sion_int64 _sion_file_get_position(_sion_fileptr *sion_fileptr)
Get new position in file.
Definition: sion_file.c:241
int _sion_buffer_flush(_sion_filedesc *sion_filedesc)
Flush buffer.
Definition: sion_buffer.c:164
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:1116
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:219
sion_int64 sion_bytes_avail_in_block(int sid)
Return the number of bytes available in the current chunk.
Definition: sion_common.c:834
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:849
int _sion_buffer_get_data_ptr(_sion_filedesc *sion_filedesc, void **data, sion_int64 *bytes)
Pop all data from buffer.
Definition: sion_buffer.c:139
Sion File Descriptor Structure.
Definition: sion_filedesc.h:79
int sion_get_endianness(void)
Return endianness.
Definition: sion_tools.c:32
int sion_ensure_free_space(int sid, sion_int64 bytes)
Funtion to ensure that enough space is available for writing.
Definition: sion_common.c:1008
sion_int64 * all_blockcount
sion_int64 sion_get_position(int sid)
Function that returns the current file position.
Definition: sion_common.c:885
int sion_get_file_endianness(int sid)
Returns edianness of data in file sid.
Definition: sion_common.c:249
#define SION_FILESTATE_SEROPEN
Definition: sion_filedesc.h:29
int _sion_file_purge(_sion_fileptr *sion_fileptr)
Purge data to file.
Definition: sion_file.c:285
sion_int64 _sion_file_read(void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Read data from file.
Definition: sion_file.c:166
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:309
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:1175
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:103
int _sion_free_io_info(sion_io_stat_t *p)
frees an io_info data structure
int _sion_vcdtype(int sid)
Definition: sion_fd.c:58
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:303
int _sion_dedup(int sid)
Destroy a duplicated sion file descriptor.
Definition: sion_dup.c:157
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:80
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:215
size_t sion_fwrite(const void *data, size_t size, size_t nitems, int sid)
Write data to sion file.
Definition: sion_common.c:466
int sion_endianness_swap_needed(int sid)
Returns whether or not byte swapping is needed for sid.
Definition: sion_common.c:273
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:53
#define SION_FILE_FLAG_ANSI
Definition: sion_file.h:22
int _sion_dup(int sid, int mode, int rank, uint64_t key)
Create a duplicated sion file descriptor.
Definition: sion_dup.c:52
#define SION_FILEMODE_READ
Definition: sion_filedesc.h:37
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:653
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:1194
#define SION_FILESTATE_PAROPEN
Definition: sion_filedesc.h:28
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:332
int sion_get_sizeof(int sid, int *numbytes, int *numfds)
Function returns size of internal data structure for sid.
Definition: sion_common.c:1078
int _sion_file_unset_second_fileptr(_sion_fileptr *sion_fileptr)
Unset second fileptr for file if opened with ANSI.
Definition: sion_file.c:354
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:88
sion_int64 * blocksizes
#define SION_FILESTATE_PAROPENMAPPEDMASTER
Definition: sion_filedesc.h:32
sion_int32 currentblocknr
Definition: sion_filedesc.h:97
#define SION_FILESTATE_SEROPENRANK
Definition: sion_filedesc.h:30
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:48
#define SION_FILESTATE_CLOSE
Definition: sion_filedesc.h:35
size_t sion_fread(void *data, size_t size, size_t nitems, int sid)
Read data from sion file.
Definition: sion_common.c:585
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:38
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:1150
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:31
sion_int64 * all_blocksizes
int _sion_file_flush(_sion_fileptr *sion_fileptr)
Flush data to file.
Definition: sion_file.c:263
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:181
_sion_filedesc ** multifiles
_sion_fileptr * fileptr
Definition: sion_filedesc.h:82
int sion_seek_fp(int sid, int rank, int currentblocknr, sion_int64 posinblk, FILE **fileptr)
Deprecated. Use sion_seek() instead.
Definition: sion_common.c:676
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:985