SIONlib  1.7.7
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-2019 **
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 #ifdef _SION_CUDA
27 #include <cuda_runtime.h>
28 #endif
29 
30 #include "sion.h"
31 #include "sion_debug.h"
32 #include "sion_error_handler.h"
33 #include "sion_filedesc.h"
34 #include "sion_tools.h"
35 #include "sion_fd.h"
36 #include "sion_file.h"
37 #include "sion_metadata.h"
38 #include "sion_internal.h"
39 #include "sion_internal_seek.h"
40 #include "sion_hints.h"
41 #include "sion_printts.h"
42 #include "sion_buffer.h"
43 #include "sion_dup.h"
44 #include "sion_lock.h"
45 #include "sion_buddy_common.h"
46 
47 
48 sion_io_stat_t* sion_get_io_info_buddy(int sid, int roles, int flag);
49 
84 int sion_get_locations(int sid,
85  int *ntasks,
86  int *maxchunks,
87  sion_int64 *globalskip,
88  sion_int64 *start_of_varheader,
89  sion_int64 **sion_chunksizes,
90  sion_int64 **sion_globalranks,
91  sion_int64 **sion_blockcount,
92  sion_int64 **sion_blocksizes ) {
93  int rc = SION_SUCCESS;
94  _sion_filedesc *sion_filedesc;
95 #ifdef SION_SERIAL_MASTER
96  _sion_filedesc *help;
97 #endif
98 
99  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
100  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
101  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
102  }
103  DPRINTFP((1, "sion_get_locations", -1, "enter\n"));
104 
105 #ifdef SION_SERIAL_MASTER
106  if((sion_filedesc->state == SION_FILESTATE_SEROPENMASTER) &&
107  (sion_filedesc->all_blockcount==NULL) ) {
108  int i;
109 
110  /* collect info from sub files */
111  _sion_alloc_filedesc_arrays(sion_filedesc);
113 
114  for (i = 0; i < sion_filedesc->ntasks; i++) {
115  int lfile=sion_filedesc->mapping[i*2+0];
116  int lrank=sion_filedesc->mapping[i*2+1];
117  sion_filedesc->all_chunksizes[i] = sion_filedesc->multifiles[lfile]->all_chunksizes[lrank];
118  sion_filedesc->all_globalranks[i] = sion_filedesc->multifiles[lfile]->all_globalranks[lrank];
119  sion_filedesc->all_blockcount[i] = sion_filedesc->multifiles[lfile]->all_blockcount[lrank];
120  }
121  for (i = 0; i < sion_filedesc->ntasks; i++) {
122  int lfile=sion_filedesc->mapping[i*2+0];
123  int lrank=sion_filedesc->mapping[i*2+1];
124  int blknum;
125  help=sion_filedesc->multifiles[lfile];
126  for (blknum = 0; blknum < sion_filedesc->all_blockcount[i]; blknum++) {
127  sion_filedesc->all_blocksizes[sion_filedesc->ntasks * blknum + i] =
128  help->all_blocksizes[help->ntasks * blknum + lrank];
129  }
130  }
131  }
132 #endif
133 
134  *ntasks = sion_filedesc->ntasks;
135  *maxchunks = sion_filedesc->maxusedchunks;
136  *sion_chunksizes = sion_filedesc->all_chunksizes;
137  *sion_globalranks = sion_filedesc->all_globalranks;
138  *sion_blockcount = sion_filedesc->all_blockcount;
139  *sion_blocksizes = sion_filedesc->all_blocksizes;
140  *globalskip = sion_filedesc->globalskip;
141  *start_of_varheader = sion_filedesc->start_of_varheader;
142 
143  DPRINTFP((1, "sion_get_locations", -1, "leave\n"));
144 
145  return (rc);
146 }
147 
148 int _sion_close_sid(int sid)
149 {
150  int rc = SION_SUCCESS;
151  _sion_filedesc *sion_filedesc;
152 
153  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
154  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
155  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"_sion_close: invalid sion_filedesc, aborting %d ...\n", sid));
156  }
157  rc=_sion_close(sion_filedesc);
158 
159  if(rc==SION_SUCCESS) {
160  _sion_freevcd(sid);
161  _sion_free_filedesc(sion_filedesc);
162  }
163 
164  return(rc);
165 
166 }
167 
185 int sion_get_current_location(int sid, int *currentchunknr, sion_int64 *currentpos, int *maxchunks, sion_int64 **chunksizes)
186 {
187  int rc = SION_SUCCESS;
188  _sion_filedesc *sion_filedesc;
189 
190  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
191  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
192  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
193  }
194  DPRINTFP((1, "sion_get_current_location", -1, "enter\n"));
195 
196  *currentchunknr = sion_filedesc->currentblocknr;
197  *currentpos = sion_filedesc->currentpos - (sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip);
198  *maxchunks = sion_filedesc->lastchunknr+1;
199  *chunksizes = sion_filedesc->blocksizes;
200 
201  DPRINTFP((1, "sion_get_current_location", -1, "leave\n"));
202  return (rc);
203 }
204 
219 int sion_get_mapping(int sid,
220  int *mapping_size,
221  sion_int32 **mapping,
222  int *numfiles ) {
223  int rc = SION_SUCCESS;
224  _sion_filedesc *sion_filedesc;
225 
226  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
227  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
228  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
229  }
230  DPRINTFP((1, "sion_get_mapping", -1, "enter\n"));
231 
232  if(sion_filedesc->mapping_size>0) {
233  *mapping_size=sion_filedesc->mapping_size;
234  *mapping=sion_filedesc->mapping;
235  } else {
236  *mapping_size=-1;
237  }
238  *numfiles=sion_filedesc->nfiles;
239 
240  DPRINTFP((1, "sion_get_mapping", -1, "leave (mapping_size=%d)\n",*mapping_size));
241 
242  return (rc);
243 }
244 
254 {
255  _sion_filedesc *sion_filedesc;
256 
257  DPRINTFP((1, "sion_get_file_endianness", -1, "enter (sid=%d)\n",sid));
258 
259  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
260  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
261  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
262  }
263 
264  DPRINTFP((1, "sion_get_file_endianness", -1, "leave (sid=%d)\n",sid));
265  /* return endianness of user data */
266  return ((sion_filedesc->endianness >> 8) & 1);
267 }
268 
278 {
279  int swap_needed = 0;
280 
281  DPRINTFP((1, "sion_endianness_swap_needed", -1, "enter (sid=%d)\n",sid));
282 
283  swap_needed = (sion_get_file_endianness(sid) != sion_get_endianness());
284 
285  DPRINTFP((1, "sion_endianness_swap_needed", -1, "leave (swap_needed=%d)\n",
286  swap_needed));
287 
288  return swap_needed;
289 }
290 
308  int *ntasks,
309  sion_int64 **sion_currentpos,
310  sion_int64 **sion_currentblocknr)
311 {
312  int rc = SION_SUCCESS;
313  _sion_filedesc *sion_filedesc;
314 
315  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
316  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
317  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
318  }
319  DPRINTFP((1, "sion_get_current_locations", -1, "enter\n"));
320 
321  *ntasks = sion_filedesc->ntasks;
322  *sion_currentpos = sion_filedesc->all_currentpos;
323  *sion_currentblocknr = sion_filedesc->all_currentblocknr;
324 
325  DPRINTFP((1, "sion_get_current_locations", -1, "leave\n"));
326  return (rc);
327 }
328 
329 int sion_get_number_of_files(int sid)
330 {
331  _sion_filedesc *sion_filedesc;
332 
333  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
334  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
335  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
336  }
337 
338  return (sion_filedesc->nfiles);
339 }
340 
341 int sion_get_filenumber(int sid)
342 {
343  _sion_filedesc *sion_filedesc;
344 
345  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
346  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
347  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
348  }
349 
350  return (sion_filedesc->filenumber);
351 }
352 
353 int sion_is_serial_opened(int sid)
354 {
355  _sion_filedesc *sion_filedesc;
356 
357  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
358  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
359  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
360  }
361 
362  return (sion_filedesc->state == SION_FILESTATE_SEROPEN
363  || sion_filedesc->state == SION_FILESTATE_SEROPENRANK
364  || sion_filedesc->state == SION_FILESTATE_SEROPENMASTER);
365 }
366 
367 int sion_using_hints(int sid)
368 {
369  _sion_filedesc *sion_filedesc;
370 
371  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
372  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
373  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
374  }
375 
376  return (sion_filedesc->usehints);
377 }
378 
379 sion_int64 sion_get_bytes_written(int sid)
380 {
381  _sion_filedesc *sion_filedesc;
382  sion_int64 bytes=SION_SIZE_NOT_VALID;
383 
384  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
385  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
386  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
387  }
388 
389  if (sion_filedesc->mode == SION_FILEMODE_WRITE) {
390  int i;
391  if (sion_filedesc->usebuffer) {
392  _sion_buffer_flush(sion_filedesc);
393  }
394  _sion_flush_block(sion_filedesc);
395  bytes=0;
396  for(i=0;i<=sion_filedesc->lastchunknr;i++) bytes+=sion_filedesc->blocksizes[i];
397  }
398 
399  return (bytes);
400 }
401 
402 sion_int64 sion_get_bytes_read(int sid)
403 {
404  _sion_filedesc *sion_filedesc;
405  sion_int64 bytes=SION_SIZE_NOT_VALID;
406 
407  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
408  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
409  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
410  }
411 
412  if (sion_filedesc->mode == SION_FILEMODE_READ) {
413  int i;
414  _sion_file_purge(sion_filedesc->fileptr);
415  sion_filedesc->currentpos = _sion_file_get_position(sion_filedesc->fileptr);
416 
417  bytes=0;
418  for(i=0;i<sion_filedesc->currentblocknr;i++) bytes+=sion_filedesc->blocksizes[i];
419  /* current chunk */
420  bytes+=sion_filedesc->currentpos - (sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip);
421  }
422 
423  return (bytes);
424 }
425 
426 /* return list of filenames created and the size of their payload, and the task role on this file */
427 sion_io_stat_t* sion_get_io_info(int sid) {
428 
429  return(sion_get_io_info_by_spec(sid,SION_ROLE_COLLECTOR|SION_ROLE_WRITER|SION_ROLE_NOWRITER,SION_GET_IO_INFO_FLAG_NONE));
430 
431 }
432 
433 /* return list of filenames created and the size of their payload, and the task role on this file */
434 sion_io_stat_t* sion_get_io_info_by_spec(int sid, int roles, int flag) {
435  _sion_filedesc *sion_filedesc;
436  sion_io_stat_t *p=NULL;
437 
438  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
439  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
440  _sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid);
441  return(NULL);
442  }
443 
444  /* branch to buddy CP */
445  if(sion_filedesc->usebuddy) {
446  p=sion_get_io_info_buddy(sid,roles,flag);
447  }
448 
449  return (p);
450 }
451 
452 int sion_free_io_info(sion_io_stat_t *p) {
453  return (_sion_free_io_info(p));
454 }
455 
456 
470 size_t sion_fwrite(const void *data, size_t size, size_t nitems, int sid)
471 {
472  sion_int64 bytes_to_write, bbytes;
473  _sion_filedesc *sion_filedesc;
474  size_t rc=0, frc;
475  void *bdata;
476 
477  DPRINTFP((1, "sion_fwrite", -1, "enter size=%ld nitems=%ld\n",(long) size, (long) nitems));
478 
479  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
480  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
481  return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
482  }
483 
484  _sion_check_on_collective_mode(sion_filedesc);
485 
486  bytes_to_write=size*nitems;
487 
488  /* buffering? */
489  if(sion_filedesc->usebuffer) {
490 
491  /* create a new block if needed and check size of input */
492  if(!sion_ensure_free_space(sid,bytes_to_write)) {
493  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
494  "could not ensure free space for this buffered block of size %d, returning sid=%d ...",
495  (int) bytes_to_write, sid));
496  }
497 
498  char *data_ptr=(void *) data;
499  sion_int64 bytes_left = sion_filedesc->chunksize -
500  sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
501  bbytes = sion_filedesc->buffer_ptr;
502 
503  /* check for enough space in current block */
504  if (bbytes + bytes_to_write > bytes_left) {
505  /* not enough space for buffer + bytes_to_write => flush first */
506  _sion_buffer_get_data_ptr(sion_filedesc,&bdata,&bbytes);
507  if(sion_ensure_free_space(sid,bbytes)) {
508  frc = _sion_file_write(bdata, bbytes, sion_filedesc->fileptr);
509  if(frc != bbytes) {
510  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
511  "could not write data (%d bytes) to file (sid=%d) ...", (int) bbytes, sid));
512  }
513  } else {
514  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
515  "could not ensure free space for this buffered block of size %d, returning sid=%d ...",
516  (int) bbytes, sid));
517  }
518  /* increase current position */
519  sion_filedesc->currentpos+=bbytes;
520  }
521  /* buffer data */
522  sion_int64 bytes_buffered=_sion_buffer_push(sion_filedesc,data_ptr,bytes_to_write);
523  bytes_to_write-=bytes_buffered;
524  data_ptr+=bytes_buffered;
525 
526  while(bytes_to_write>0) {
527  /* flush filled buffer to file, not all data could be stored */
528  _sion_buffer_get_data_ptr(sion_filedesc,&bdata,&bbytes);
529  if(sion_ensure_free_space(sid,bbytes)) {
530  frc = _sion_file_write(bdata, bbytes, sion_filedesc->fileptr);
531  if(frc != bbytes) {
532  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
533  "could not write data (%d bytes) to file (sid=%d) ...", (int) bbytes, sid));
534  }
535  } else {
536  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
537  "could not ensure free space for this buffered block of size %d, returning sid=%d ...",
538  (int) bbytes, sid));
539  }
540  /* increase current position */
541  sion_filedesc->currentpos+=bbytes;
542 
543  /* next try to push data into buffer */
544  bytes_buffered=_sion_buffer_push(sion_filedesc,data_ptr,bytes_to_write);
545  bytes_to_write-=bytes_buffered;
546  data_ptr+=bytes_buffered;
547  }
548  /* reset value since it will be used later */
549  bytes_to_write=size*nitems;
550  /* return code: bytes stored */
551  rc=(size_t) (size ? bytes_to_write / size : 0);
552 
553  } else {
554  /* normal write */
555  if(sion_ensure_free_space(sid,bytes_to_write)) {
556 #ifdef _SION_CUDA
557  struct cudaPointerAttributes attrs;
558  cudaError_t err = cudaPointerGetAttributes(&attrs, data);
559  if ((err == cudaSuccess) && _sion_cuda_ptr_is_device(attrs) ) {
560  char* buffer = malloc(sion_filedesc->fsblksize);
561  const char* data_ = data;
562  while (frc < bytes_to_write) {
563  sion_int64 to_write = (bytes_to_write - frc) > sion_filedesc->fsblksize ? sion_filedesc->fsblksize : (bytes_to_write - frc);
564  cudaMemcpy(buffer, data_, to_write, cudaMemcpyDeviceToHost);
565  sion_int64 frc_ = _sion_file_write(buffer, to_write, sion_filedesc->fileptr);
566  if (frc_ != to_write) break;
567  frc += frc_;
568  data_ += frc_;
569  }
570  free(buffer);
571  } else {
572  frc = _sion_file_write(data, bytes_to_write, sion_filedesc->fileptr);
573  }
574 #else
575  frc = _sion_file_write(data, bytes_to_write, sion_filedesc->fileptr);
576 #endif
577 
578  if(frc != bytes_to_write) {
579  return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->rank,
580  "could not write data (%d bytes) to file (frc=%d sid=%d) ...", (int) bytes_to_write, (int) frc, sid));
581  }
582 
583  rc=(size_t) (size ? bytes_to_write / size : 0);
584  } else {
585  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));
586  }
587  /* increase current position */
588  sion_filedesc->currentpos+=bytes_to_write;
589  }
590 
591  DPRINTFP((1, "sion_fwrite", -1, "leave rc=%ld\n",(long) rc));
592  return(rc);
593 }
594 
609 size_t sion_fread( void *data, size_t size, size_t nitems, int sid) {
610  _sion_filedesc *sion_filedesc;
611  sion_int64 bytes, bread, bytes_left;
612 
613  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
614  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
615  return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid sion_filedesc, aborting %d ...\n", sid));
616  }
617  if (!data) {
618  /* FIXME: replace SION_ANSI_SIZE_NOT_VALID? */
619  return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,"invalid pointer, aborting %d ...\n", data));
620  }
621 
622  /* check and update current position */
623  _sion_update_fileposition(sion_filedesc);
624 
625  bytes_left = sion_filedesc->startpos +
626  sion_filedesc->currentblocknr * sion_filedesc->globalskip +
627  sion_filedesc->blocksizes[sion_filedesc->currentblocknr] -
628  sion_filedesc->currentpos;
629 
630  DPRINTFP((1, "sion_fread", -1, "enter\n"));
631  DPRINTFP((4, "sion_fread", -1, " parameter size=%ld nitems=%ld\n",(long) size,(long) nitems));
632 
633  _sion_check_on_collective_mode(sion_filedesc);
634 
635  bread=0;
636  bytes=size*nitems;
637 
638  /* Check size. bytes_left == 0 is handled by sion_feof */
639  if((sion_filedesc->chunksize < bytes) || ((bytes_left < bytes) &&
640  (bytes_left != 0))) {
641  /* FIXME: replace SION_ANSI_SIZE_NOT_VALID? */
642  return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,"not enough bytes left in chunk, aborting (%ld < %ld) ...\n", bytes_left, bytes));
643  }
644 
645  if(!sion_feof(sid)) {
646 #ifdef _SION_CUDA
647  struct cudaPointerAttributes attrs;
648  cudaError_t err = cudaPointerGetAttributes(&attrs, data);
649  if ((err == cudaSuccess) && _sion_cuda_ptr_is_device(attrs) ) {
650  char* buffer = malloc(sion_filedesc->fsblksize);
651  char* data_ = data;
652  while (bread < bytes) {
653  sion_int64 to_read = (bytes - bread) > sion_filedesc->fsblksize ? sion_filedesc->fsblksize : (bytes - bread);
654  sion_int64 bread_ = _sion_file_read(buffer, to_read, sion_filedesc->fileptr);
655  if (bread_ != to_read) break;
656  cudaMemcpy(data_, buffer, bread_, cudaMemcpyHostToDevice);
657  bread += bread_;
658  data_ += bread_;
659  }
660  free(buffer);
661  } else {
662  bread=_sion_file_read(data,bytes,sion_filedesc->fileptr);
663  DPRINTFP((256, "sion_fread", -1, " _sion_file_read returns %ld\n",(long) bread));
664  }
665 #else
666  bread=_sion_file_read(data,bytes,sion_filedesc->fileptr);
667  DPRINTFP((256, "sion_fread", -1, " _sion_file_read returns %ld\n",(long) bread));
668 #endif
669  }
670  if(bread!=bytes) {
671  return (size_t) (size ? bread / size : 0);
672  }
673 
674  bread = size ? bread / size : 0;
675 
676  /* increase current position */
677  sion_filedesc->currentpos+=bytes;
678 
679  DPRINTFP((4, "sion_fread", -1, " return value %ld\n",(long) bread));
680  DPRINTFP((1, "sion_fread", -1, "leave\n"));
681  return(bread);
682 }
683 
698 int sion_seek(int sid, int rank, int currentblocknr, sion_int64 posinblk)
699 {
700  FILE *fileptr;
701  int rc=0;
702  /* TBD: check if not sion_open and multi file */
703  rc=sion_seek_fp(sid,rank,currentblocknr,posinblk,&fileptr);
704  return(rc);
705 
706 }
707 
721 int sion_seek_fp(int sid, int rank, int currentblocknr, sion_int64 posinblk, FILE **fileptr)
722 {
723  int rc = SION_SUCCESS;
724  _sion_filedesc *sion_filedesc;
725 
726  DPRINTFP((1, "sion_seek_fp", -1, " enter seek with sid=%d\n", sid));
727  assert((_sion_vcdtype(sid) == SION_FILEDESCRIPTOR));
728 
729  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
730  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
731  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_seek: invalid sion_filedesc, aborting %d ...\n", sid));
732  }
733 
734  /* check state */
735  if ((sion_filedesc->mode != SION_FILEMODE_READ) && (sion_filedesc->mode != SION_FILEMODE_WRITE)) {
736  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));
737  }
738  if (sion_filedesc->usebuffer) {
739  _sion_buffer_flush(sion_filedesc);
740  }
741  if ( (sion_filedesc->state != SION_FILESTATE_PAROPEN)
742  && (sion_filedesc->state != SION_FILESTATE_SEROPEN)
743  && (sion_filedesc->state != SION_FILESTATE_SEROPENMASTER)
744  && (sion_filedesc->state != SION_FILESTATE_SEROPENRANK)
745  && (sion_filedesc->state != SION_FILESTATE_PAROPENMAPPEDMASTER)
746  ) {
747  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));
748  }
749 
750 
751  if (sion_filedesc->mode == SION_FILEMODE_READ) { /* READ */
752 
753  if (sion_filedesc->state == SION_FILESTATE_SEROPEN) {
754  rc = _sion_seek_on_all_ranks_read(sion_filedesc, rank, currentblocknr, posinblk);
755  }
756  else if (sion_filedesc->state == SION_FILESTATE_SEROPENMASTER) {
757  rc = _sion_seek_on_all_ranks_read_master(sion_filedesc, rank, currentblocknr, posinblk);
758  }
759  else if ((sion_filedesc->state == SION_FILESTATE_SEROPENRANK) ||
760  (sion_filedesc->state == SION_FILESTATE_PAROPEN)) {
761  rc = _sion_seek_on_current_rank_read(sion_filedesc, rank, currentblocknr, posinblk);
762  }
763  else if (sion_filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
764  rc = _sion_seek_on_all_ranks_read_mapped(sion_filedesc, rank, currentblocknr, posinblk);
765  }
766  } else { /* WRITE */
767  if (sion_filedesc->state == SION_FILESTATE_SEROPEN) {
768  rc = _sion_seek_on_all_ranks_write(sion_filedesc, rank, currentblocknr, posinblk);
769  }
770  else if (sion_filedesc->state == SION_FILESTATE_SEROPENRANK) {
771  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 ...");
772  }
773  else if (sion_filedesc->state == SION_FILESTATE_PAROPEN) {
774  rc = _sion_seek_on_current_rank_write(sion_filedesc, rank, currentblocknr, posinblk);
775  }
776  else if (sion_filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
777  rc = _sion_seek_on_all_ranks_write_mapped(sion_filedesc, rank, currentblocknr, posinblk);
778  }
779 
780  }
781 
782  /* TBD: implement sion_open and sion_seek_fp for multi-files */
783  if(fileptr!=NULL) {
784  if(sion_filedesc->fileptr->flags&SION_FILE_FLAG_ANSI) {
785  *fileptr=sion_filedesc->fileptr->fileptr;
786  sion_filedesc->fileptr_exported=1;
787 
788  } else {
789  *fileptr=NULL;
790  sion_filedesc->fileptr_exported=0;
791  }
792  }
793 
794  DPRINTFP((1, "sion_seek_fp", -1, "leave seek rc=%d\n",rc));
795 
796  return (rc);
797 }
798 
809 int sion_feof(int sid)
810 {
811  int rc = SION_NOT_SUCCESS;
812  sion_int64 maxpos;
813 
814  _sion_filedesc *sion_filedesc;
815  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
816  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
817  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"sion_feof: invalid sion_filedesc, aborting %d ...\n", sid));
818  }
819 
820  DPRINTFP((8, "sion_feof", -1, "enter feof sid=%d currentpos=%15lld\n", sid, sion_filedesc->currentpos));
821 
822  /* check and update current position */
823  _sion_update_fileposition(sion_filedesc);
824 
825  maxpos = sion_filedesc->startpos
826  + sion_filedesc->currentblocknr * sion_filedesc->globalskip + sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
827 
828  DPRINTFP((16, "sion_feof", -1,
829  " after flush sid=%d currentpos=%15lld maxpos= %lld startpos=%lld curblknr=%d\n",
830  sid, sion_filedesc->currentpos, maxpos, sion_filedesc->startpos, sion_filedesc->currentblocknr));
831 
832  if (sion_filedesc->currentpos < maxpos) {
833  /* end of current block not reached */
834  rc = 0;
835  DPRINTFP((16, "sion_feof", -1, " end of current block %d not reached sid=%d\n",
836  sion_filedesc->currentblocknr, sid));
837  } else {
838  if (sion_filedesc->currentblocknr < sion_filedesc->lastchunknr) {
839 
840  /* apply hint for freeing current chunk */
841  _sion_apply_hints(sion_filedesc,SION_HINTS_FREE_TYPE_CHUNK);
842 
843  /* end of current block reached, skip to next block */
844  sion_filedesc->currentblocknr++;
845  sion_filedesc->currentpos = sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip;
846 
847  /* apply hint for access current (new) chunk */
848  _sion_apply_hints(sion_filedesc,SION_HINTS_ACCESS_TYPE_CHUNK);
849 
850  _sion_file_purge(sion_filedesc->fileptr);
851  _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->currentpos);
852  rc = SION_NOT_SUCCESS;
853  DPRINTFP((8, "sion_feof", -1,
854  " end of block %d reached, skipping to next %lld -> %lld position=%lld gs=%lld sid=%d\n",
855  sion_filedesc->currentblocknr - 1,
856  sion_filedesc->currentpos, _sion_file_get_position(sion_filedesc->fileptr), sion_filedesc->currentpos, sion_filedesc->globalskip, sid));
857  }
858  else {
859  /* end of last block reached */
860  DPRINTFP((8, "sion_feof", -1, " end of last block %d reached sid=%d\n", sion_filedesc->currentblocknr, sid));
861  rc = SION_SUCCESS;
862  }
863  }
864 
865  DPRINTFP((8, "sion_feof", -1, "leave feof sid=%d currentpos=%15lld rc=%d\n", sid, sion_filedesc->currentpos, rc));
866 
867  return (rc);
868 }
869 
879 sion_int64 sion_bytes_avail_in_block(int sid)
880 {
881  return(sion_bytes_avail_in_chunk(sid));
882 }
883 
894 sion_int64 sion_bytes_avail_in_chunk(int sid)
895 {
896  sion_int64 maxpos;
897  sion_int64 bytes_avail=SION_SIZE_NOT_VALID;
898  _sion_filedesc *sion_filedesc;
899 
900  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
901  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
902  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"sion_bytes_avail_in_chunk: invalid sion_filedesc, aborting %d ...\n", sid));
903  }
904 
905 
906  _sion_update_fileposition(sion_filedesc);
907 
908  maxpos = sion_filedesc->startpos
909  + sion_filedesc->currentblocknr * sion_filedesc->globalskip + sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
910 
911  bytes_avail = maxpos - sion_filedesc->currentpos;
912 
913  DPRINTFP((8, "sion_bytes_avail_in_chunk", -1,
914  "leave sid=%d rank=%4d currentpos=%lld maxpos= %lld -> bytes to read %lld\n",
915  sid, sion_filedesc->rank, sion_filedesc->currentpos, maxpos, bytes_avail));
916 
917  return (bytes_avail);
918 }
919 
930 sion_int64 sion_get_position(int sid)
931 {
932  _sion_filedesc *sion_filedesc;
933 
934  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
935  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
936  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"sion_get_position: invalid sion_filedesc, aborting %d ...\n", sid));
937  }
938 
939 
940  _sion_file_flush(sion_filedesc->fileptr);
941 
942  return (_sion_file_get_position(sion_filedesc->fileptr));
943 
944 }
945 
946 int sion_set_fp_closed(int sid)
947 {
948  int rc = SION_SUCCESS;
949  _sion_filedesc *sion_filedesc;
950 
951  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
952  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
953  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_set_fp_closed: invalid sion_filedesc, aborting %d ...\n", sid));
954  }
955  sion_filedesc->state = SION_FILESTATE_CLOSE;
956  return (rc);
957 }
958 
959 int sion_set_second_fp(int sid, FILE *secondfd)
960 {
961  int rc = SION_SUCCESS;
962  _sion_filedesc *sion_filedesc;
963 
964 
965  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
966  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
967  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_set_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
968  }
969 
970  if(!(sion_filedesc->fileptr->flags&SION_FILE_FLAG_ANSI)) {
971  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));
972  }
973 
974  _sion_file_set_second_fileptr(sion_filedesc->fileptr,secondfd);
975 
976  _sion_print_filedesc(sion_filedesc, 512, "sion_set_second_fd", 1);
977  /*
978  if (sion_filedesc->mode == SION_FILEMODE_READ) {
979  sion_seek(sid, SION_CURRENT_RANK, 0, 0);
980  }
981  */
982  return (rc);
983 }
984 
985 int sion_unset_second_fp(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 
995  if(!(sion_filedesc->fileptr->flags&SION_FILE_FLAG_ANSI)) {
996  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));
997  }
998 
1000  return (rc);
1001 }
1002 
1003 int sion_optimize_fp_buffer(int sid)
1004 {
1005  int rc = SION_SUCCESS;
1006  _sion_filedesc *sion_filedesc;
1007 
1008  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
1009  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
1010  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_set_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
1011  }
1012 
1013  sion_filedesc->fpbuffer = (char *) malloc(sion_filedesc->fsblksize);
1014  if (sion_filedesc->fpbuffer == NULL) {
1015  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));
1016  }
1017  sion_filedesc->fpbuffer_size = sion_filedesc->fsblksize;
1018 
1019  rc=_sion_file_set_buffer(sion_filedesc->fileptr, sion_filedesc->fpbuffer, sion_filedesc->fpbuffer_size);
1020  return (rc);
1021 }
1022 
1030 int sion_flush(int sid)
1031 {
1032  int rc = SION_SUCCESS;
1033  _sion_filedesc *sion_filedesc;
1034 
1035  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
1036  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
1037  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_unset_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
1038  }
1039  rc = _sion_flush_block(sion_filedesc);
1040  return (rc);
1041 }
1042 
1053 int sion_ensure_free_space(int sid, sion_int64 bytes)
1054 {
1055  _sion_filedesc *sion_filedesc;
1056  sion_int64 byteswritten;
1057  int rc = SION_SUCCESS;
1058 
1059  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
1060  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
1061  return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,"sion_ensure_free_space: invalid sion_filedesc, returning %d ...\n", sid));
1062  }
1063 
1064  DPRINTFP((8, "_sion_ensure_free_space", -1, "enter ensure_free sid=%d bytes=%lld\n", sid, bytes));
1065 
1066  if (sion_filedesc->mode != SION_FILEMODE_WRITE) {
1067  DPRINTFP((8, "_sion_ensure_free_space", -1, "invalid opened\n"));
1068  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));
1069  }
1070  if (!sion_filedesc->usecoll) {
1071  if (sion_filedesc->fileptr == NULL) {
1072  DPRINTFP((8, "_sion_ensure_free_space", -1, "file not opened\n"));
1073  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));
1074  }
1075  }
1076 
1077  if (bytes > sion_filedesc->chunksize) {
1078  DPRINTFP((8, "_sion_ensure_free_space", -1, "could not write %lld bytes, chunksize=%lld\n", bytes, sion_filedesc->chunksize));
1079  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));
1080  }
1081 
1082  _sion_flush_block(sion_filedesc);
1083 
1084  DPRINTFP((16, "_sion_ensure_free_space", -1,
1085  " after getpos sid=%d fileposition is %lld bytes=%lld\n", sid, sion_filedesc->currentpos, bytes));
1086 
1087  byteswritten = sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
1088 
1089  DPRINTFP((16, "_sion_ensure_free_space", -1,
1090  " sid=%d byteswritten(%lld) + new bytes (%lld) = %lld\n", sid, byteswritten, bytes, byteswritten + bytes));
1091 
1092  if ((byteswritten + bytes) > sion_filedesc->chunksize) {
1093  /* not enough space for writing next data */
1094  _sion_create_new_block(sion_filedesc);
1095  }
1096 
1097  DPRINTFP((8, "_sion_ensure_free_space", -1,
1098  "leave ensure_free sid=%d fileposition is %lld bw+bytes=%lld <= chunksize=%lld (fsblksize=%d)\n",
1099  sid, sion_filedesc->currentpos, byteswritten + bytes, sion_filedesc->chunksize, sion_filedesc->fsblksize));
1100 
1101 
1102  return (rc);
1103 
1104 }
1105 
1106 int sion_is_thread_safe() {
1107 #ifdef SION_PTHREADS
1108  return(SION_SUCCESS);
1109 #else
1110  return(SION_NOT_SUCCESS);
1111 #endif
1112 }
1113 
1123 int sion_get_sizeof(int sid, int *numbytes, int *numfds) {
1124  _sion_filedesc *sion_filedesc;
1125  int rc=SION_NOT_SUCCESS;
1126 
1127  *numbytes=SION_SIZE_NOT_VALID;
1128  *numfds=SION_SIZE_NOT_VALID;
1129 
1130  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
1131  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
1132  return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,"sion_get_sizeof: invalid sion_filedesc, returning %d ...\n", sid));
1133  }
1134  DPRINTFP((2, "sion_get_sizeof", -1, "enter sid=%d\n", sid));
1135 
1136  rc=_sion_get_size_of_filedesc(sion_filedesc,numbytes,numfds);
1137 
1138  DPRINTFP((2, "sion_get_sizeof", -1, "leave sid=%d numbytes=%d numfds=%d\n", sid, *numbytes, *numfds));
1139 
1140  return (rc);
1141 
1142 }
1143 
1144 
1145 #define DFUNCTION "sion_dup"
1161 int sion_dup(int sid, int mode, int rank, uint64_t key)
1162 {
1163  int new_sid = SION_ID_NOT_VALID;
1164  _sion_filedesc *sion_filedesc;
1165 
1166  if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
1167  || !(sion_filedesc = _sion_vcdtovcon(sid))) {
1168  return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,"sion_dup: invalid sion_filedesc, returning %d ...\n", sid));
1169  }
1170  DPRINTFP((8, DFUNCTION, -1, "enter sid=%d\n", sid));
1171 
1172  if (sion_filedesc->mode != SION_FILEMODE_READ) {
1173  DPRINTFP((8, DFUNCTION, -1, "invalid opened\n"));
1174  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));
1175  }
1176 
1177  new_sid=_sion_dup(sid, mode, rank, key);
1178 
1179  DPRINTFP((8, DFUNCTION, -1, "leave sid=%d new_sid=%d\n", sid, new_sid));
1180 
1181  return (new_sid);
1182 
1183 }
1184 #undef DFUNCTION
1185 
1186 #define DFUNCTION "sion_dedup"
1195 int sion_dedup(int sid)
1196 {
1197  int rc = 0;
1198  DPRINTFP((8, DFUNCTION, -1, "enter sid=%d\n", sid));
1199 
1200  rc=_sion_dedup(sid);
1201 
1202  DPRINTFP((8, DFUNCTION, -1, "leave sid=%d rc=%d\n", sid, rc));
1203 
1204  return (rc);
1205 
1206 }
1207 #undef DFUNCTION
1208 
1209 #define DFUNCTION "sion_lock_register_lock_callbacks"
1220 int sion_lock_register_lock_callbacks(int lock(void *), int unlock(void *), void *lock_data)
1221 {
1222  int rc = 0;
1223  DPRINTFP((8, DFUNCTION, -1, "enter\n"));
1224 
1225  rc=_sion_lock_register_lock_callbacks(lock,unlock,lock_data);
1226 
1227  DPRINTFP((8, DFUNCTION, -1, "leave rc=%d\n", rc));
1228 
1229  return (rc);
1230 }
1231 #undef DFUNCTION
1232 
1233 #define DFUNCTION "sion_lock_user_callbacks_defined"
1240 {
1241  int rc = 0;
1242  DPRINTFP((8, DFUNCTION, -1, "enter\n"));
1243 
1244  rc=_sion_lock_user_callbacks_defined();
1245 
1246  DPRINTFP((8, DFUNCTION, -1, "leave rc=%d\n", rc));
1247 
1248  return (rc);
1249 }
1250 #undef DFUNCTION
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:185
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:307
size_t sion_fread(void *data, size_t size, size_t nitems, int sid)
Read data from sion file.
Definition: sion_common.c:609
int sion_get_file_endianness(int sid)
Returns edianness of data in file sid.
Definition: sion_common.c:253
int sion_endianness_swap_needed(int sid)
Returns whether or not byte swapping is needed for sid.
Definition: sion_common.c:277
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:84
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:219
size_t sion_fwrite(const void *data, size_t size, size_t nitems, int sid)
Write data to sion file.
Definition: sion_common.c:470
callback wrappers for OMP thread safe fd manipulation
int _sion_buffer_get_data_ptr(_sion_filedesc *sion_filedesc, void **data, sion_int64 *bytes)
Pop all data from buffer.
Definition: sion_buffer.c:152
int _sion_buffer_flush(_sion_filedesc *sion_filedesc)
Flush buffer.
Definition: sion_buffer.c:177
sion_int64 _sion_buffer_push(_sion_filedesc *sion_filedesc, const void *data, sion_int64 bytes)
Push data to buffer.
Definition: sion_buffer.c:106
sion_int64 sion_get_position(int sid)
Function that returns the current file position.
Definition: sion_common.c:930
int sion_seek_fp(int sid, int rank, int currentblocknr, sion_int64 posinblk, FILE **fileptr)
Deprecated. Use sion_seek() instead.
Definition: sion_common.c:721
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:894
int sion_flush(int sid)
Flushed sion file.
Definition: sion_common.c:1030
int sion_ensure_free_space(int sid, sion_int64 bytes)
Funtion to ensure that enough space is available for writing.
Definition: sion_common.c:1053
int sion_feof(int sid)
Function that indicates whether the end of file is reached for this task.
Definition: sion_common.c:809
sion_int64 sion_bytes_avail_in_block(int sid)
Return the number of bytes available in the current chunk.
Definition: sion_common.c:879
int sion_lock_user_callbacks_defined()
Function which return flag, if user callback for locking are registered.
Definition: sion_common.c:1239
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:698
int sion_dup(int sid, int mode, int rank, uint64_t key)
Function which duplicates a sion file descriptor.
Definition: sion_common.c:1161
int sion_get_sizeof(int sid, int *numbytes, int *numfds)
Function returns size of internal data structure for sid.
Definition: sion_common.c:1123
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:1220
int sion_dedup(int sid)
Function which destroy a duplicated sion file descriptor.
Definition: sion_common.c:1195
int sion_get_endianness(void)
Return endianness.
Definition: sion_tools.c:32
int _sion_dup(int sid, int mode, int rank, uint64_t key)
Create a duplicated sion file descriptor.
Definition: sion_dup.c:52
int _sion_dedup(int sid)
Destroy a duplicated sion file descriptor.
Definition: sion_dup.c:157
void * _sion_vcdtovcon(int sid)
Definition: sion_fd.c:53
int _sion_vcdtype(int sid)
Definition: sion_fd.c:58
int _sion_freevcd(int sid)
Definition: sion_fd.c:48
#define SION_FILEDESCRIPTOR
Definition: sion_fd.h:17
int _sion_file_flush(_sion_fileptr *sion_fileptr)
Flush data to file.
Definition: sion_file.c:434
int _sion_file_unset_second_fileptr(_sion_fileptr *sion_fileptr)
Unset second fileptr for file if opened with ANSI.
Definition: sion_file.c:551
sion_int64 _sion_file_set_position(_sion_fileptr *sion_fileptr, sion_int64 startpointer)
Set new position in file.
Definition: sion_file.c:367
int _sion_file_purge(_sion_fileptr *sion_fileptr)
Purge data to file.
Definition: sion_file.c:467
sion_int64 _sion_file_get_position(_sion_fileptr *sion_fileptr)
Get new position in file.
Definition: sion_file.c:401
int _sion_file_set_buffer(_sion_fileptr *sion_fileptr, char *buffer, sion_int32 buffer_size)
Set buffer of fp.
Definition: sion_file.c:495
sion_int64 _sion_file_write(const void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Write data to file.
Definition: sion_file.c:221
sion_int64 _sion_file_read(void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Read data from file.
Definition: sion_file.c:257
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:529
#define SION_FILE_FLAG_ANSI
Definition: sion_file.h:25
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.
int _sion_get_size_of_filedesc(_sion_filedesc *sion_filedesc, int *numbytes, int *numfds)
get size of internal data structure sion_filedesc
int _sion_alloc_filedesc_arrays(_sion_filedesc *sion_filedesc)
Allocate memory for the internal sion arrays.
int _sion_print_filedesc(_sion_filedesc *sion_filedesc, int level, char *desc, int flag)
Print the initialized sion file description.
#define SION_FILEMODE_WRITE
Definition: sion_filedesc.h:38
#define SION_FILEMODE_READ
Definition: sion_filedesc.h:37
#define SION_FILESTATE_SEROPENRANK
Definition: sion_filedesc.h:30
#define SION_FILESTATE_PAROPEN
Definition: sion_filedesc.h:28
#define SION_FILESTATE_SEROPENMASTER
Definition: sion_filedesc.h:31
#define SION_FILESTATE_CLOSE
Definition: sion_filedesc.h:35
#define SION_FILESTATE_SEROPEN
Definition: sion_filedesc.h:29
#define SION_FILESTATE_PAROPENMAPPEDMASTER
Definition: sion_filedesc.h:32
int _sion_create_new_block(_sion_filedesc *sion_filedesc)
Create a new block for the internal data structure.
int _sion_free_io_info(sion_io_stat_t *p)
frees an io_info data structure
int _sion_flush_block(_sion_filedesc *sion_filedesc)
Update the internal data structure.
int _sion_check_on_collective_mode(_sion_filedesc *sion_filedesc)
check if a collective operation are already called,
int _sion_update_fileposition(_sion_filedesc *sion_filedesc)
Update the internal data structure (check fileposition)
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.
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_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.
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.
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_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.
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 Time Stamp Header.
Sion File Descriptor Structure.
Definition: sion_filedesc.h:79
sion_int64 * all_blocksizes
sion_int64 start_of_varheader
sion_int64 * all_chunksizes
sion_int64 * all_currentpos
sion_int64 * blocksizes
sion_int64 * all_currentblocknr
sion_int32 fileptr_exported
_sion_filedesc ** multifiles
sion_int64 * all_globalranks
sion_int32 currentblocknr
Definition: sion_filedesc.h:97
sion_int32 fpbuffer_size
Definition: sion_filedesc.h:88
_sion_fileptr * fileptr
Definition: sion_filedesc.h:82
sion_int64 * all_blockcount