24 #ifndef __USE_FILE_OFFSET64 25 #define __USE_FILE_OFFSET64 33 #include "sion_debug.h" 34 #include "sion_filedesc.h" 35 #include "sion_tools.h" 37 #include "sion_file.h" 39 #include "sion_internal.h" 40 #include "sion_internal_seek.h" 41 #include "sion_hints.h" 43 #include "sion_buffer.h" 45 #include "sion_lock.h" 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;
91 #ifdef SION_SERIAL_MASTER 93 int i, lfile, lrank, blknum;
96 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
97 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
98 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
100 DPRINTFP((1,
"sion_get_locations", -1,
"enter\n"));
102 #ifdef SION_SERIAL_MASTER 103 if((sion_filedesc->
state == SION_FILESTATE_SEROPENMASTER) &&
107 _sion_alloc_filedesc_arrays(sion_filedesc);
108 _sion_alloc_filedesc_block_arrays_only(sion_filedesc);
110 for (i = 0; i < sion_filedesc->
ntasks; i++) {
111 lfile=sion_filedesc->
mapping[i*2+0]; lrank=sion_filedesc->
mapping[i*2+1];
116 for (i = 0; i < sion_filedesc->
ntasks; i++) {
117 lfile=sion_filedesc->
mapping[i*2+0]; lrank=sion_filedesc->
mapping[i*2+1];
119 for (blknum = 0; blknum < sion_filedesc->
all_blockcount[i]; blknum++) {
127 *ntasks = sion_filedesc->
ntasks;
136 DPRINTFP((1,
"sion_get_locations", -1,
"leave\n"));
141 int _sion_close_sid(
int sid)
143 int rc = SION_SUCCESS;
146 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
147 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
148 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"_sion_close: invalid sion_filedesc, aborting %d ...\n", sid));
150 rc=_sion_close(sion_filedesc);
152 if(rc==SION_SUCCESS) {
154 _sion_free_filedesc(sion_filedesc);
180 int rc = SION_SUCCESS;
183 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
184 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
185 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
187 DPRINTFP((1,
"sion_get_current_location", -1,
"enter\n"));
194 DPRINTFP((1,
"sion_get_current_location", -1,
"leave\n"));
214 sion_int32 **mapping,
216 int rc = SION_SUCCESS;
219 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
220 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
221 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
223 DPRINTFP((1,
"sion_get_mapping", -1,
"enter\n"));
227 *mapping=sion_filedesc->
mapping;
231 *numfiles=sion_filedesc->
nfiles;
233 DPRINTFP((1,
"sion_get_mapping", -1,
"leave (mapping_size=%d)\n",*mapping_size));
250 DPRINTFP((1,
"sion_get_file_endianness", -1,
"enter (sid=%d)\n",sid));
252 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
253 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
254 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
257 DPRINTFP((1,
"sion_get_file_endianness", -1,
"leave (sid=%d)\n",sid));
259 return ((sion_filedesc->
endianness >> 8) & 1);
274 DPRINTFP((1,
"sion_endianness_swap_needed", -1,
"enter (sid=%d)\n",sid));
278 DPRINTFP((1,
"sion_endianness_swap_needed", -1,
"leave (swap_needed=%d)\n",
302 sion_int64 **sion_currentpos,
303 sion_int64 **sion_currentblocknr)
305 int rc = SION_SUCCESS;
308 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
309 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
310 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
312 DPRINTFP((1,
"sion_get_current_locations", -1,
"enter\n"));
314 *ntasks = sion_filedesc->
ntasks;
318 DPRINTFP((1,
"sion_get_current_locations", -1,
"leave\n"));
322 int sion_get_number_of_files(
int sid)
326 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
327 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
328 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
331 return (sion_filedesc->
nfiles);
334 int sion_get_filenumber(
int sid)
338 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
339 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
340 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
346 int sion_is_serial_opened(
int sid)
350 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
351 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
352 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
355 return (sion_filedesc->
state == SION_FILESTATE_SEROPEN
356 || sion_filedesc->
state == SION_FILESTATE_SEROPENRANK
357 || sion_filedesc->
state == SION_FILESTATE_SEROPENMASTER);
360 int sion_using_hints(
int sid)
364 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
365 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
366 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
372 sion_int64 sion_get_bytes_written(
int sid)
375 sion_int64 bytes=SION_SIZE_NOT_VALID;
378 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
379 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
380 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
383 if (sion_filedesc->
mode == SION_FILEMODE_WRITE) {
385 _sion_buffer_flush(sion_filedesc);
387 _sion_flush_block(sion_filedesc);
395 sion_int64 sion_get_bytes_read(
int sid)
398 sion_int64 bytes=SION_SIZE_NOT_VALID;
401 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
402 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
403 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
406 if (sion_filedesc->
mode == SION_FILEMODE_READ) {
407 _sion_file_purge(sion_filedesc->
fileptr);
432 size_t sion_fwrite(
const void *data,
size_t size,
size_t nitems,
int sid)
434 sion_int64 bytes_buffered, bytes_to_write, bbytes, bytes_left;
440 DPRINTFP((1,
"sion_fwrite", -1,
"enter size=%ld nitems=%ld\n",(
long) size, (
long) nitems));
442 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
443 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
444 return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
447 _sion_check_on_collective_mode(sion_filedesc);
449 bytes_to_write=size*nitems;
456 return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->
rank,
457 "could not ensure free space for this buffered block of size %d, returning sid=%d ...",
458 (
int) bytes_to_write, sid));
461 data_ptr=(
void *) data;
467 if (bbytes + bytes_to_write > bytes_left) {
469 _sion_buffer_get_data_ptr(sion_filedesc,&bdata,&bbytes);
471 frc = _sion_file_write(bdata, bbytes, sion_filedesc->
fileptr);
473 return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->
rank,
474 "could not write data (%d bytes) to file (sid=%d) ...", (
int) bbytes, sid));
477 return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->
rank,
478 "could not ensure free space for this buffered block of size %d, returning sid=%d ...",
485 bytes_buffered=_sion_buffer_push(sion_filedesc,data_ptr,bytes_to_write);
486 bytes_to_write-=bytes_buffered;
487 data_ptr+=bytes_buffered;
489 while(bytes_to_write>0) {
491 _sion_buffer_get_data_ptr(sion_filedesc,&bdata,&bbytes);
493 frc = _sion_file_write(bdata, bbytes, sion_filedesc->
fileptr);
495 return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->
rank,
496 "could not write data (%d bytes) to file (sid=%d) ...", (
int) bbytes, sid));
499 return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->
rank,
500 "could not ensure free space for this buffered block of size %d, returning sid=%d ...",
507 bytes_buffered=_sion_buffer_push(sion_filedesc,data_ptr,bytes_to_write);
508 bytes_to_write-=bytes_buffered;
509 data_ptr+=bytes_buffered;
512 bytes_to_write=size*nitems;
514 rc=(size_t) (size ? bytes_to_write / size : 0);
519 frc = _sion_file_write(data, bytes_to_write, sion_filedesc->
fileptr);
520 if(frc != bytes_to_write) {
521 return(_sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,sion_filedesc->
rank,
522 "could not write data (%d bytes) to file (frc=%d sid=%d) ...", (
int) bytes_to_write, (
int) frc, sid));
525 rc=(size_t) (size ? bytes_to_write / size : 0);
528 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));
534 DPRINTFP((1,
"sion_fwrite", -1,
"leave rc=%ld\n",(
long) rc));
552 size_t sion_fread(
void *data,
size_t size,
size_t nitems,
int sid) {
554 sion_int64 bytes, bread, bytes_left;
556 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
557 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
558 return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid));
562 return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"invalid pointer, aborting %d ...\n", data));
566 _sion_update_fileposition(sion_filedesc);
568 bytes_left = sion_filedesc->
startpos +
573 DPRINTFP((1,
"sion_fread", -1,
"enter\n"));
574 DPRINTFP((4,
"sion_fread", -1,
" parameter size=%ld nitems=%ld\n",(
long) size,(
long) nitems));
576 _sion_check_on_collective_mode(sion_filedesc);
582 if((sion_filedesc->
chunksize < bytes) || ((bytes_left < bytes) &&
583 (bytes_left != 0))) {
585 return(_sion_errorprint(SION_ANSI_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"not enough bytes left in chunk, aborting (%ld < %ld) ...\n", bytes_left, bytes));
589 bread=_sion_file_read(data,bytes,sion_filedesc->
fileptr);
590 DPRINTFP((256,
"sion_fread", -1,
" _sion_file_read returns %ld\n",(
long) bread));
593 return (
size_t) (size ? bread / size : 0);
596 bread = size ? bread / size : 0;
601 DPRINTFP((4,
"sion_fread", -1,
" return value %ld\n",(
long) bread));
602 DPRINTFP((1,
"sion_fread", -1,
"leave\n"));
620 int sion_seek(
int sid,
int rank,
int currentblocknr, sion_int64 posinblk)
625 rc=
sion_seek_fp(sid,rank,currentblocknr,posinblk,&fileptr);
643 int sion_seek_fp(
int sid,
int rank,
int currentblocknr, sion_int64 posinblk, FILE **fileptr)
645 int rc = SION_SUCCESS;
648 DPRINTFP((1,
"sion_seek_fp", -1,
" enter seek with sid=%d\n", sid));
649 assert((_sion_vcdtype(sid) == SION_FILEDESCRIPTOR));
651 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
652 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
653 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_seek: invalid sion_filedesc, aborting %d ...\n", sid));
657 if ((sion_filedesc->
mode != SION_FILEMODE_READ) && (sion_filedesc->
mode != SION_FILEMODE_WRITE)) {
658 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));
661 _sion_buffer_flush(sion_filedesc);
663 if ( (sion_filedesc->
state != SION_FILESTATE_PAROPEN)
664 && (sion_filedesc->
state != SION_FILESTATE_SEROPEN)
665 && (sion_filedesc->
state != SION_FILESTATE_SEROPENMASTER)
666 && (sion_filedesc->
state != SION_FILESTATE_SEROPENRANK)
667 && (sion_filedesc->
state != SION_FILESTATE_PAROPENMAPPEDMASTER)
669 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));
673 if (sion_filedesc->
mode == SION_FILEMODE_READ) {
675 if (sion_filedesc->
state == SION_FILESTATE_SEROPEN) {
676 rc = _sion_seek_on_all_ranks_read(sion_filedesc, rank, currentblocknr, posinblk);
678 else if (sion_filedesc->
state == SION_FILESTATE_SEROPENMASTER) {
679 rc = _sion_seek_on_all_ranks_read_master(sion_filedesc, rank, currentblocknr, posinblk);
681 else if ((sion_filedesc->
state == SION_FILESTATE_SEROPENRANK) ||
682 (sion_filedesc->
state == SION_FILESTATE_PAROPEN)) {
683 rc = _sion_seek_on_current_rank_read(sion_filedesc, rank, currentblocknr, posinblk);
685 else if (sion_filedesc->
state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
686 rc = _sion_seek_on_all_ranks_read_mapped(sion_filedesc, rank, currentblocknr, posinblk);
689 if (sion_filedesc->
state == SION_FILESTATE_SEROPEN) {
690 rc = _sion_seek_on_all_ranks_write(sion_filedesc, rank, currentblocknr, posinblk);
692 else if (sion_filedesc->
state == SION_FILESTATE_SEROPENRANK) {
693 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 else if (sion_filedesc->
state == SION_FILESTATE_PAROPEN) {
696 rc = _sion_seek_on_current_rank_write(sion_filedesc, rank, currentblocknr, posinblk);
698 else if (sion_filedesc->
state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
699 rc = _sion_seek_on_all_ranks_write_mapped(sion_filedesc, rank, currentblocknr, posinblk);
706 if(sion_filedesc->
fileptr->flags&SION_FILE_FLAG_ANSI) {
707 *fileptr=sion_filedesc->
fileptr->fileptr;
716 DPRINTFP((1,
"sion_seek_fp", -1,
"leave seek rc=%d\n",rc));
733 int rc = SION_NOT_SUCCESS;
737 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
738 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
739 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"sion_feof: invalid sion_filedesc, aborting %d ...\n", sid));
742 DPRINTFP((8,
"sion_feof", -1,
"enter feof sid=%d currentpos=%15lld\n", sid, sion_filedesc->
currentpos));
745 _sion_update_fileposition(sion_filedesc);
750 DPRINTFP((16,
"sion_feof", -1,
751 " after flush sid=%d currentpos=%15lld maxpos= %lld startpos=%lld curblknr=%d\n",
757 DPRINTFP((16,
"sion_feof", -1,
" end of current block %d not reached sid=%d\n",
763 rc = _sion_apply_hints(sion_filedesc,SION_HINTS_FREE_TYPE_CHUNK);
770 rc = _sion_apply_hints(sion_filedesc,SION_HINTS_ACCESS_TYPE_CHUNK);
772 _sion_file_purge(sion_filedesc->
fileptr);
774 rc = SION_NOT_SUCCESS;
775 DPRINTFP((8,
"sion_feof", -1,
776 " end of block %d reached, skipping to next %lld -> %lld position=%lld gs=%lld sid=%d\n",
782 DPRINTFP((8,
"sion_feof", -1,
" end of last block %d reached sid=%d\n", sion_filedesc->
currentblocknr, sid));
787 DPRINTFP((8,
"sion_feof", -1,
"leave feof sid=%d currentpos=%15lld rc=%d\n", sid, sion_filedesc->
currentpos, rc));
819 sion_int64 bytes_avail=SION_SIZE_NOT_VALID;
822 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
823 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
824 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"sion_bytes_avail_in_chunk: invalid sion_filedesc, aborting %d ...\n", sid));
828 _sion_update_fileposition(sion_filedesc);
833 bytes_avail = maxpos - sion_filedesc->
currentpos;
835 DPRINTFP((8,
"sion_bytes_avail_in_chunk", -1,
836 "leave sid=%d rank=%4d currentpos=%lld maxpos= %lld -> bytes to read %lld\n",
837 sid, sion_filedesc->
rank, sion_filedesc->
currentpos, maxpos, bytes_avail));
839 return (bytes_avail);
856 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
857 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
858 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"sion_get_position: invalid sion_filedesc, aborting %d ...\n", sid));
862 _sion_file_flush(sion_filedesc->
fileptr);
864 return (_sion_file_get_position(sion_filedesc->
fileptr));
868 int sion_set_fp_closed(
int sid)
870 int rc = SION_SUCCESS;
873 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
874 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
875 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_set_fp_closed: invalid sion_filedesc, aborting %d ...\n", sid));
877 sion_filedesc->
state = SION_FILESTATE_CLOSE;
881 int sion_set_second_fp(
int sid, FILE *secondfd)
883 int rc = SION_SUCCESS;
887 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
888 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
889 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_set_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
892 if(!(sion_filedesc->
fileptr->flags&SION_FILE_FLAG_ANSI)) {
893 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));
896 _sion_file_set_second_fileptr(sion_filedesc->
fileptr,secondfd);
898 _sion_print_filedesc(sion_filedesc, 512,
"sion_set_second_fd", 1);
907 int sion_unset_second_fp(
int sid)
909 int rc = SION_SUCCESS;
912 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
913 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
914 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_unset_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
917 if(!(sion_filedesc->
fileptr->flags&SION_FILE_FLAG_ANSI)) {
918 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));
921 _sion_file_unset_second_fileptr(sion_filedesc->
fileptr);
925 int sion_optimize_fp_buffer(
int sid)
927 int rc = SION_SUCCESS;
930 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
931 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
932 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_set_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
936 if (sion_filedesc->
fpbuffer == NULL) {
937 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));
954 int rc = SION_SUCCESS;
957 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
958 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
959 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_unset_second_fp: invalid sion_filedesc, aborting %d ...\n", sid));
961 rc = _sion_flush_block(sion_filedesc);
978 sion_int64 byteswritten;
979 int rc = SION_SUCCESS;
981 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
982 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
983 return(_sion_errorprint(SION_NOT_SUCCESS,_SION_ERROR_RETURN,
"sion_ensure_free_space: invalid sion_filedesc, returning %d ...\n", sid));
986 DPRINTFP((8,
"_sion_ensure_free_space", -1,
"enter ensure_free sid=%d bytes=%lld\n", sid, bytes));
988 if (sion_filedesc->
mode != SION_FILEMODE_WRITE) {
989 DPRINTFP((8,
"_sion_ensure_free_space", -1,
"invalid opened\n"));
990 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 if (sion_filedesc->
fileptr == NULL) {
993 DPRINTFP((8,
"_sion_ensure_free_space", -1,
"file not opened\n"));
994 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));
998 DPRINTFP((8,
"_sion_ensure_free_space", -1,
"could not write %lld bytes, chunksize=%lld\n", bytes, sion_filedesc->
chunksize));
999 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));
1002 _sion_flush_block(sion_filedesc);
1004 DPRINTFP((16,
"_sion_ensure_free_space", -1,
1005 " after getpos sid=%d fileposition is %lld bytes=%lld\n", sid, sion_filedesc->
currentpos, bytes));
1009 DPRINTFP((16,
"_sion_ensure_free_space", -1,
1010 " sid=%d byteswritten(%lld) + new bytes (%lld) = %lld\n", sid, byteswritten, bytes, byteswritten + bytes));
1012 if ((byteswritten + bytes) > sion_filedesc->
chunksize) {
1014 _sion_create_new_block(sion_filedesc);
1017 DPRINTFP((8,
"_sion_ensure_free_space", -1,
1018 "leave ensure_free sid=%d fileposition is %lld bw+bytes=%lld <= chunksize=%lld (fsblksize=%d)\n",
1026 int sion_is_thread_safe() {
1027 #ifdef SION_PTHREADS 1028 return(SION_SUCCESS);
1030 return(SION_NOT_SUCCESS);
1045 int rc=SION_NOT_SUCCESS;
1047 *numbytes=SION_SIZE_NOT_VALID;
1048 *numfds=SION_SIZE_NOT_VALID;
1050 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
1051 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
1052 return(_sion_errorprint(SION_SIZE_NOT_VALID,_SION_ERROR_RETURN,
"sion_get_sizeof: invalid sion_filedesc, returning %d ...\n", sid));
1054 DPRINTFP((2,
"sion_get_sizeof", -1,
"enter sid=%d\n", sid));
1056 rc=_sion_get_size_of_filedesc(sion_filedesc,numbytes,numfds);
1058 DPRINTFP((2,
"sion_get_sizeof", -1,
"leave sid=%d numbytes=%d numfds=%d\n", sid, *numbytes, *numfds));
1065 #define DFUNCTION "sion_dup" 1081 int sion_dup(
int sid,
int mode,
int rank, uint64_t key)
1083 int new_sid = SION_ID_NOT_VALID;
1086 if ((sid<0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR)
1087 || !(sion_filedesc = _sion_vcdtovcon(sid))) {
1088 return(_sion_errorprint(SION_ID_NOT_VALID,_SION_ERROR_RETURN,
"sion_dup: invalid sion_filedesc, returning %d ...\n", sid));
1090 DPRINTFP((8, DFUNCTION, -1,
"enter sid=%d\n", sid));
1092 if (sion_filedesc->
mode != SION_FILEMODE_READ) {
1093 DPRINTFP((8, DFUNCTION, -1,
"invalid opened\n"));
1094 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));
1097 new_sid=_sion_dup(sid, mode, rank, key);
1099 DPRINTFP((8, DFUNCTION, -1,
"leave sid=%d new_sid=%d\n", sid, new_sid));
1106 #define DFUNCTION "sion_dedup" 1117 int rc = SION_SUCCESS;
1118 DPRINTFP((8, DFUNCTION, -1,
"enter sid=%d\n", sid));
1120 rc=_sion_dedup(sid);
1122 DPRINTFP((8, DFUNCTION, -1,
"leave sid=%d rc=%d\n", sid, rc));
1129 #define DFUNCTION "sion_lock_register_lock_callbacks" 1142 int rc = SION_SUCCESS;
1143 DPRINTFP((8, DFUNCTION, -1,
"enter\n"));
1145 rc=_sion_lock_register_lock_callbacks(lock,unlock,lock_data);
1147 DPRINTFP((8, DFUNCTION, -1,
"leave rc=%d\n", rc));
1153 #define DFUNCTION "sion_lock_user_callbacks_defined" 1161 int rc = SION_SUCCESS;
1162 DPRINTFP((8, DFUNCTION, -1,
"enter\n"));
1164 rc=_sion_lock_user_callbacks_defined();
1166 DPRINTFP((8, DFUNCTION, -1,
"leave rc=%d\n", rc));
int sion_feof(int sid)
Function that indicates whether the end of file is reached for this task.
int sion_dup(int sid, int mode, int rank, uint64_t key)
Function which duplicates a sion file descriptor.
sion_int64 sion_bytes_avail_in_block(int sid)
Return the number of bytes available in the current chunk.
sion_int64 sion_bytes_avail_in_chunk(int sid)
Function that returns the number of bytes available in the current chunk.
Sion File Descriptor Structure.
int sion_get_endianness(void)
Return endianness.
int sion_ensure_free_space(int sid, sion_int64 bytes)
Funtion to ensure that enough space is available for writing.
sion_int64 * all_blockcount
sion_int64 sion_get_position(int sid)
Function that returns the current file position.
int sion_get_file_endianness(int sid)
Returns edianness of data in file sid.
sion_int64 * all_currentpos
sion_int64 * all_globalranks
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...
sion_int64 * all_currentblocknr
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.
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.
int sion_get_mapping(int sid, int *mapping_size, sion_int32 **mapping, int *numfiles)
Returns pointers to the internal field mapping.
size_t sion_fwrite(const void *data, size_t size, size_t nitems, int sid)
Write data to sion file.
int sion_endianness_swap_needed(int sid)
Returns whether or not byte swapping is needed for sid.
int sion_seek(int sid, int rank, int currentblocknr, sion_int64 posinblk)
Function to set the file pointer to a new position.
int sion_lock_user_callbacks_defined()
Function which return flag, if user callback for locking are registered.
int sion_get_sizeof(int sid, int *numbytes, int *numfds)
Function returns size of internal data structure for sid.
sion_int32 currentblocknr
sion_int64 * all_chunksizes
size_t sion_fread(void *data, size_t size, size_t nitems, int sid)
Read data from sion file.
int sion_dedup(int sid)
Function which destroy a duplicated sion file descriptor.
sion_int64 start_of_varheader
sion_int64 * all_blocksizes
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.
_sion_filedesc ** multifiles
int sion_seek_fp(int sid, int rank, int currentblocknr, sion_int64 posinblk, FILE **fileptr)
Deprecated. Use sion_seek() instead.
int sion_flush(int sid)
Flushed sion file.