10 #define _XOPEN_SOURCE 700 18 #include "sion_buffer.h" 19 #include "sion_common.h" 20 #include "sion_const.h" 21 #include "sion_debug.h" 23 #include "sion_error_handler.h" 25 #include "sion_file.h" 26 #include "sion_filedesc.h" 27 #include "sion_hints.h" 28 #include "sion_internal.h" 29 #include "sion_internal_positioning.h" 30 #include "sion_internal_seek.h" 31 #include "sion_lock.h" 33 sion_io_stat_t *sion_get_io_info_buddy(
int sid,
int roles,
int flag);
35 int sion_get_locations(
int sid,
int *ntasks,
int *maxchunks, int64_t *globalskip, int64_t *start_of_varheader,
36 int64_t **sion_chunksizes, int64_t **sion_globalranks, int64_t **sion_blockcount, int64_t **sion_blocksizes)
38 int rc = SION_SUCCESS;
39 _sion_filedesc *sion_filedesc;
40 #ifdef SION_SERIAL_MASTER 44 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
45 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
47 DPRINTFP((1,
"sion_get_locations", -1,
"enter\n"));
49 #ifdef SION_SERIAL_MASTER 50 if ((sion_filedesc->state == SION_FILESTATE_SEROPENMASTER) && (sion_filedesc->all_blockcount == NULL)) {
54 _sion_alloc_filedesc_arrays(sion_filedesc);
55 _sion_alloc_filedesc_block_arrays_only(sion_filedesc);
57 for (i = 0; i < sion_filedesc->ntasks; i++) {
58 int lfile = sion_filedesc->mapping[i * 2 + 0];
59 int lrank = sion_filedesc->mapping[i * 2 + 1];
60 sion_filedesc->all_chunksizes[i] = sion_filedesc->multifiles[lfile]->all_chunksizes[lrank];
61 sion_filedesc->all_globalranks[i] = sion_filedesc->multifiles[lfile]->all_globalranks[lrank];
62 sion_filedesc->all_blockcount[i] = sion_filedesc->multifiles[lfile]->all_blockcount[lrank];
64 for (i = 0; i < sion_filedesc->ntasks; i++) {
65 int lfile = sion_filedesc->mapping[i * 2 + 0];
66 int lrank = sion_filedesc->mapping[i * 2 + 1];
68 help = sion_filedesc->multifiles[lfile];
69 for (blknum = 0; blknum < sion_filedesc->all_blockcount[i]; blknum++) {
70 sion_filedesc->all_blocksizes[sion_filedesc->ntasks * blknum + i] = help->all_blocksizes[help->ntasks * blknum + lrank];
76 *ntasks = sion_filedesc->ntasks;
77 *maxchunks = sion_filedesc->maxusedchunks;
78 *sion_chunksizes = sion_filedesc->all_chunksizes;
79 *sion_globalranks = sion_filedesc->all_globalranks;
80 *sion_blockcount = sion_filedesc->all_blockcount;
81 *sion_blocksizes = sion_filedesc->all_blocksizes;
82 *globalskip = sion_filedesc->globalskip;
83 *start_of_varheader = sion_filedesc->start_of_varheader;
85 DPRINTFP((1,
"sion_get_locations", -1,
"leave\n"));
92 int rc = SION_SUCCESS;
93 _sion_filedesc *sion_filedesc;
95 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
96 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
98 DPRINTFP((1,
"sion_get_current_location", -1,
"enter\n"));
100 *currentchunknr = sion_filedesc->currentblocknr;
101 *currentpos = sion_filedesc->currentpos - (sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip);
102 *maxchunks = sion_filedesc->lastchunknr + 1;
103 *chunksizes = sion_filedesc->blocksizes;
105 DPRINTFP((1,
"sion_get_current_location", -1,
"leave\n"));
111 int rc = SION_SUCCESS;
112 _sion_filedesc *sion_filedesc;
114 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
115 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
117 DPRINTFP((1,
"sion_get_mapping", -1,
"enter\n"));
119 if (sion_filedesc->mapping_size > 0) {
120 *mapping_size = sion_filedesc->mapping_size;
121 *mapping = sion_filedesc->mapping;
125 *numfiles = sion_filedesc->nfiles;
127 DPRINTFP((1,
"sion_get_mapping", -1,
"leave (mapping_size=%d)\n", *mapping_size));
134 _sion_filedesc *sion_filedesc;
136 DPRINTFP((1,
"sion_get_file_endianness", -1,
"enter (sid=%d)\n", sid));
138 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
139 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
142 DPRINTFP((1,
"sion_get_file_endianness", -1,
"leave (sid=%d)\n", sid));
144 return (sion_filedesc->endianness >> 8) & 1;
151 DPRINTFP((1,
"sion_endianness_swap_needed", -1,
"enter (sid=%d)\n", sid));
155 DPRINTFP((1,
"sion_endianness_swap_needed", -1,
"leave (swap_needed=%d)\n", swap_needed));
162 int rc = SION_SUCCESS;
163 _sion_filedesc *sion_filedesc;
165 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
166 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
168 DPRINTFP((1,
"sion_get_current_locations", -1,
"enter\n"));
170 *ntasks = sion_filedesc->ntasks;
171 *sion_currentpos = sion_filedesc->all_currentpos;
172 *sion_currentblocknr = sion_filedesc->all_currentblocknr;
174 DPRINTFP((1,
"sion_get_current_locations", -1,
"leave\n"));
178 int sion_get_number_of_files(
int sid)
180 _sion_filedesc *sion_filedesc;
182 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
183 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
186 return sion_filedesc->nfiles;
189 int sion_get_filenumber(
int sid)
191 _sion_filedesc *sion_filedesc;
193 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
194 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
197 return sion_filedesc->filenumber;
200 int sion_is_serial_opened(
int sid)
202 _sion_filedesc *sion_filedesc;
204 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
205 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
208 return sion_filedesc->state == SION_FILESTATE_SEROPEN || sion_filedesc->state == SION_FILESTATE_SEROPENRANK
209 || sion_filedesc->state == SION_FILESTATE_SEROPENMASTER;
212 int sion_using_hints(
int sid)
214 _sion_filedesc *sion_filedesc;
216 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
217 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
220 return sion_filedesc->usehints;
223 int64_t sion_get_bytes_written(
int sid)
225 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
226 if (filedesc == NULL) {
227 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
230 if (filedesc->mode == SION_FILEMODE_WRITE) {
231 if (filedesc->usebuffer) {
232 _sion_buffer_flush(filedesc);
234 return filedesc->size;
236 return SION_SIZE_NOT_VALID;
240 int64_t sion_get_bytes_read(
int sid)
242 _sion_filedesc *sion_filedesc;
243 int64_t bytes = SION_SIZE_NOT_VALID;
245 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
246 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
249 if (sion_filedesc->mode == SION_FILEMODE_READ) {
251 sion_filedesc->currentpos = _sion_file_get_position(sion_filedesc->fileptr);
254 for (i = 0; i < sion_filedesc->currentblocknr; i++) {
255 bytes += sion_filedesc->blocksizes[i];
258 bytes += sion_filedesc->currentpos - (sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip);
267 return sion_get_io_info_by_spec(sid, SION_ROLE_COLLECTOR | SION_ROLE_WRITER | SION_ROLE_NOWRITER, SION_GET_IO_INFO_FLAG_NONE);
271 sion_io_stat_t *sion_get_io_info_by_spec(
int sid,
int roles,
int flag)
273 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
274 if (filedesc == NULL) {
275 _sion_errorprint(0, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
280 if (filedesc->usebuddy) {
281 return sion_get_io_info_buddy(sid, roles, flag);
289 return _sion_free_io_info(p);
292 size_t sion_write(
const void *data,
size_t size,
size_t nitems,
int sid)
294 int64_t bytes_to_write, bbytes;
295 _sion_filedesc *sion_filedesc;
299 DPRINTFP((1, __func__, -1,
"enter size=%ld nitems=%ld\n", (
long)size, (
long)nitems));
301 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
302 return _sion_errorprint(SION_ANSI_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
305 _sion_check_on_collective_mode(sion_filedesc);
307 bytes_to_write = size * nitems;
310 if (sion_filedesc->usebuffer) {
311 const char *data_ptr = data;
313 int64_t bytes_buffered = _sion_buffer_push(sion_filedesc, data_ptr, bytes_to_write);
314 bytes_to_write -= bytes_buffered;
315 data_ptr += bytes_buffered;
317 while (bytes_to_write > 0) {
319 _sion_buffer_get_data_ptr(sion_filedesc, &bdata, &bbytes);
320 frc = _sion_write_multi_chunk(sion_filedesc, bdata, bbytes);
322 return _sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID, _SION_ERROR_RETURN, sion_filedesc->rank,
323 "could not write data (%d bytes) to file (sid=%d) ...", (
int)bbytes, sid);
327 bytes_buffered = _sion_buffer_push(sion_filedesc, data_ptr, bytes_to_write);
328 bytes_to_write -= bytes_buffered;
329 data_ptr += bytes_buffered;
332 rc = size ? nitems : 0;
336 frc = _sion_write_multi_chunk(sion_filedesc, data, bytes_to_write);
337 if (frc != bytes_to_write) {
338 return _sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID, _SION_ERROR_RETURN, sion_filedesc->rank,
339 "could not write data (%d bytes) to file (frc=%d sid=%d) ...", (
int)bytes_to_write, (
int)frc, sid);
341 rc = size ? nitems : 0;
344 DPRINTFP((1, __func__, -1,
"leave rc=%ld\n", (
long)rc));
348 size_t sion_fwrite(
const void *data,
size_t size,
size_t nitems,
int sid)
353 size_t sion_read(
void *data,
size_t size,
size_t nitems,
int sid)
355 _sion_filedesc *sion_filedesc;
358 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
359 return _sion_errorprint(SION_ANSI_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
363 return _sion_errorprint(SION_ANSI_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid pointer, aborting %d ...\n", data);
366 DPRINTFP((1, __func__, -1,
"enter\n"));
367 DPRINTFP((4, __func__, -1,
" parameter size=%zu nitems=%zu\n", size, nitems));
369 _sion_check_on_collective_mode(sion_filedesc);
372 bread = _sion_read_multi_chunk(sion_filedesc, data, size * nitems);
373 DPRINTFP((256, __func__, -1,
" _sion_file_read returns %zu\n", bread));
376 bread = size ? bread / size : 0;
378 DPRINTFP((4, __func__, -1,
" return value %zu\n", bread));
379 DPRINTFP((1, __func__, -1,
"leave\n"));
384 size_t sion_fread(
void *data,
size_t size,
size_t nitems,
int sid)
386 return sion_read(data, size, nitems, sid);
394 DPRINTFP((1, __func__, -1,
" enter seek with sid=%d\n", sid));
396 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
397 if (filedesc == NULL) {
398 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_seek: invalid sion_filedesc, aborting %d ...\n", sid);
402 if ((filedesc->mode != SION_FILEMODE_READ) && (filedesc->mode != SION_FILEMODE_WRITE)) {
403 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
404 "sion_seek: unknown file open state !(READ|WRITE), aborting %d ...", sid);
406 if (filedesc->usebuffer) {
407 _sion_buffer_flush(filedesc);
409 if ((filedesc->state != SION_FILESTATE_PAROPEN) && (filedesc->state != SION_FILESTATE_SEROPEN)
410 && (filedesc->state != SION_FILESTATE_SEROPENMASTER) && (filedesc->state != SION_FILESTATE_SEROPENRANK)
411 && (filedesc->state != SION_FILESTATE_PAROPENMAPPEDMASTER)) {
412 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
413 "sion_seek: unknown file open state !(PAR|SER|SERRANK|MAPPED), aborting %d ...", sid);
417 if (filedesc->mode == SION_FILEMODE_READ) {
418 rc = _sion_seek_on_current_rank_read(filedesc, offset, whence);
420 if (filedesc->state == SION_FILESTATE_SEROPENRANK) {
421 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
422 "sion_seek: seek not supported for this type (write, sion_open_rank), aborting ...");
424 rc = _sion_seek_on_current_rank_write(filedesc, offset, whence);
428 DPRINTFP((1, __func__, -1,
"leave seek rc=%d\n", rc));
434 DPRINTFP((1, __func__, -1,
" enter seek with sid=%d\n", sid));
436 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
437 if (filedesc == NULL) {
438 return _sion_errorprint(
439 SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_seek_chunk: invalid sion_filedesc, aborting %d ...\n", sid);
445 new_blocknr = offset;
448 new_blocknr = _sion_get_current_chunk_number(filedesc) + offset;
451 new_blocknr = filedesc->lastchunknr + offset;
454 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_seek_block: seek mode not supported, aborting ...\n");
457 if (new_blocknr < 0) {
458 return _sion_errorprint(
459 SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_seek_chunk: cannot seek before first block, aborting ...\n");
461 if (filedesc->mode == SION_FILEMODE_READ && new_blocknr > filedesc->lastchunknr) {
462 return _sion_errorprint(
463 SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_seek_chunk: cannot seek past last block in read mode, aborting ...\n");
466 _sion_apply_hints(filedesc, SION_HINTS_FREE_TYPE_CHUNK);
467 _sion_chunk_sequence sequence = _sion_chunk_sequence_from_filedesc(filedesc);
468 _sion_range chunk = _sion_chunk_sequence_chunk_from_number(&sequence, new_blocknr);
469 filedesc->currentpos = chunk.start;
470 filedesc->currentblocknr = new_blocknr;
471 _sion_apply_hints(filedesc, SION_HINTS_ACCESS_TYPE_CHUNK);
473 _sion_file_set_position(filedesc->fileptr, filedesc->currentpos);
475 DPRINTFP((1, __func__, -1,
"leave seek rc=%d\n", SION_SUCCESS));
481 DPRINTFP((1, __func__, -1,
" enter switch_logical_file with sid=%d\n", sid));
483 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
484 if (filedesc == NULL) {
485 return _sion_errorprint(
486 SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_seek_chunk: invalid sion_filedesc, aborting %d ...\n", sid);
490 if (filedesc->mode == SION_FILEMODE_READ) {
491 if (filedesc->state == SION_FILESTATE_SEROPEN) {
492 rc = _sion_switch_logical_file_read(filedesc, file_number);
493 }
else if (filedesc->state == SION_FILESTATE_SEROPENMASTER) {
494 rc = _sion_switch_logical_file_read_master(filedesc, file_number);
495 }
else if (filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
496 rc = _sion_switch_logical_file_read_mapped(filedesc, file_number);
497 }
else if ((filedesc->state == SION_FILESTATE_SEROPENRANK) || (filedesc->state == SION_FILESTATE_PAROPEN)) {
498 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
499 "sion_switch_logical_file: switching logical file not supported for this type (sion_open_rank, sion_paropen_...), " 502 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
503 "sion_switch_logical_file: switching logical file not supported for unknown file state, aborting ...\n");
506 if (filedesc->state == SION_FILESTATE_SEROPEN) {
507 rc = _sion_switch_logical_file_write(filedesc, file_number);
508 }
else if (filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
509 rc = _sion_switch_logical_file_write_mapped(filedesc, file_number);
510 }
else if ((filedesc->state == SION_FILESTATE_SEROPENRANK) || (filedesc->state == SION_FILESTATE_PAROPEN)) {
511 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
512 "sion_switch_logical_file: switching logical file not supported for this type (sion_open_rank, sion_paropen_...), " 515 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
516 "sion_switch_logical_file: switching logical file not supported for unknown file state, aborting ...\n");
520 DPRINTFP((1, __func__, -1,
"leave switch_logical_file rc=%d\n", rc));
526 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
527 if (filedesc == NULL) {
528 return _sion_errorprint(-1, _SION_ERROR_RETURN,
"%s: invalid file descriptor (%d)\n", __func__, sid);
531 return _sion_get_logical_position(filedesc);
536 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
537 DPRINTFP((8, __func__, -1,
"enter eof sid=%d\n", sid));
539 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"sion_eof: invalid filedesc, aborting %d ...\n", sid);
543 if (filedesc->mode == SION_FILEMODE_WRITE) {
544 DPRINTFP((64, __func__, -1,
"file opened for writing, no eof\n"));
545 eof = SION_NOT_SUCCESS;
547 _sion_limited_chunk_sequence sequence = _sion_limited_chunk_sequence_from_filedesc(filedesc);
548 DPRINTFP((64, __func__, -1,
" current position: %" PRId64
", eof: %" PRId64
"\n", filedesc->currentpos, sequence.ubound));
549 eof = (_sion_limited_chunk_sequence_position_oob(&sequence, filedesc->currentpos)) ? SION_SUCCESS : SION_NOT_SUCCESS;
551 DPRINTFP((8, __func__, -1,
"leave feof sid=%d rc=%d\n", sid, eof));
567 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
568 if (filedesc == NULL) {
569 return _sion_errorprint(
570 SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"sion_bytes_avail_in_chunk: invalid filedesc, aborting %d ...\n", sid);
573 assert(filedesc->mode == SION_FILEMODE_READ);
575 _sion_limited_chunk_sequence sequence = _sion_limited_chunk_sequence_from_filedesc(filedesc);
577 if (_sion_limited_chunk_sequence_position_oob(&sequence, filedesc->currentpos)) {
580 _sion_range chunk = _sion_limited_chunk_sequence_chunk_from_physical_position(&sequence, filedesc->currentpos);
581 bytes_avail = chunk.length;
584 DPRINTFP((8, __func__, -1,
"leave sid=%d rank=%4d currentpos=%lld maxpos= %lld -> bytes to read %lld\n", sid, filedesc->rank,
585 filedesc->currentpos, bytes_avail));
592 _sion_filedesc *sion_filedesc;
594 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
595 return _sion_errorprint(
596 SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"sion_get_position: invalid sion_filedesc, aborting %d ...\n", sid);
599 return _sion_file_get_position(sion_filedesc->fileptr);
602 int sion_optimize_fp_buffer(
int sid)
604 int rc = SION_SUCCESS;
605 _sion_filedesc *sion_filedesc;
607 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
608 return _sion_errorprint(
609 SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_optimize_fp_buffer: invalid sion_filedesc, aborting %d ...\n", sid);
612 sion_filedesc->fpbuffer = malloc(sion_filedesc->fsblksize);
613 if (sion_filedesc->fpbuffer == NULL) {
614 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, sion_filedesc->rank,
615 "sion_optimize_fp_buffer: cannot allocate internal buffer of size %lu , aborting ...",
616 (
unsigned long)sion_filedesc->fsblksize);
618 sion_filedesc->fpbuffer_size = sion_filedesc->fsblksize;
620 rc = _sion_file_set_buffer(sion_filedesc->fileptr, sion_filedesc->fpbuffer, sion_filedesc->fpbuffer_size);
626 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
627 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(filedesc = _sion_vcdtovcon(sid))) {
628 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_flush: invalid sion_filedesc, aborting %d ...\n", sid);
636 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
639 return _sion_errorprint(
640 SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_ensure_free_space: invalid filedesc, returning %d ...\n", sid);
643 DPRINTFP((8,
"_sion_ensure_free_space", -1,
"enter ensure_free sid=%d bytes=%lld\n", sid, bytes));
645 if (filedesc->mode != SION_FILEMODE_WRITE) {
646 DPRINTFP((8,
"_sion_ensure_free_space", -1,
"invalid opened\n"));
647 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
648 "sion_ensure_free_space[%2d]: file is opened invalid sion_mode, returning ...", filedesc->rank);
650 if (!filedesc->usecoll) {
651 if (filedesc->fileptr == NULL) {
652 DPRINTFP((8,
"_sion_ensure_free_space", -1,
"file not opened\n"));
653 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
654 "sion_ensure_free_space[%2d]: file is not open, returning ...", filedesc->rank);
658 DPRINTFP((16,
"_sion_ensure_free_space", -1,
" after getpos sid=%d fileposition is %lld bytes=%lld\n", sid,
659 filedesc->currentpos, bytes));
661 int64_t byteswritten = filedesc->blocksizes[filedesc->currentblocknr];
663 DPRINTFP((16,
"_sion_ensure_free_space", -1,
" sid=%d byteswritten(%lld) + new bytes (%lld) = %lld\n", sid, byteswritten, bytes,
664 byteswritten + bytes));
666 DPRINTFP((8,
"_sion_ensure_free_space", -1,
667 "leave ensure_free sid=%d fileposition is %lld bw+bytes=%lld <= chunksize=%lld (fsblksize=%d)\n", sid, filedesc->currentpos,
668 byteswritten + bytes, filedesc->chunksize, filedesc->fsblksize));
673 int sion_is_thread_safe()
678 return SION_NOT_SUCCESS;
684 _sion_filedesc *sion_filedesc;
685 int rc = SION_NOT_SUCCESS;
687 *numbytes = SION_SIZE_NOT_VALID;
688 *numfds = SION_SIZE_NOT_VALID;
690 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
691 return _sion_errorprint(
692 SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"sion_get_sizeof: invalid sion_filedesc, returning %d ...\n", sid);
694 DPRINTFP((2,
"sion_get_sizeof", -1,
"enter sid=%d\n", sid));
696 rc = _sion_get_size_of_filedesc(sion_filedesc, numbytes, numfds);
698 DPRINTFP((2,
"sion_get_sizeof", -1,
"leave sid=%d numbytes=%d numfds=%d\n", sid, *numbytes, *numfds));
703 #define DFUNCTION "sion_dup" 704 int sion_dup(
int sid,
int mode,
int rank, uint64_t key)
706 int new_sid = SION_ID_NOT_VALID;
707 _sion_filedesc *sion_filedesc;
709 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
710 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_dup: invalid sion_filedesc, returning %d ...\n", sid);
712 DPRINTFP((8, DFUNCTION, -1,
"enter sid=%d\n", sid));
714 if (sion_filedesc->mode != SION_FILEMODE_READ) {
715 DPRINTFP((8, DFUNCTION, -1,
"invalid opened\n"));
716 return _sion_errorprint_on_rank(SION_ID_NOT_VALID, _SION_ERROR_RETURN, sion_filedesc->rank,
717 DFUNCTION
"[%2d]: file is not opened in read mode, returning ...", sion_filedesc->rank);
720 new_sid = _sion_dup(sid, mode, rank, key);
722 DPRINTFP((8, DFUNCTION, -1,
"leave sid=%d new_sid=%d\n", sid, new_sid));
728 #define DFUNCTION "sion_dedup" 732 DPRINTFP((8, DFUNCTION, -1,
"enter sid=%d\n", sid));
734 rc = _sion_dedup(sid);
736 DPRINTFP((8, DFUNCTION, -1,
"leave sid=%d rc=%d\n", sid, rc));
742 #define DFUNCTION "sion_lock_register_lock_callbacks" 746 DPRINTFP((8, DFUNCTION, -1,
"enter\n"));
748 rc = _sion_lock_register_lock_callbacks(lock, unlock, lock_data);
750 DPRINTFP((8, DFUNCTION, -1,
"leave rc=%d\n", rc));
756 #define DFUNCTION "sion_lock_user_callbacks_defined" 760 DPRINTFP((8, DFUNCTION, -1,
"enter\n"));
762 rc = _sion_lock_user_callbacks_defined();
764 DPRINTFP((8, DFUNCTION, -1,
"leave rc=%d\n", rc));
770 char *sion_get_fname(
int sid)
772 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
774 return filedesc->fname;
777 int64_t sion_get_chunksize(
int sid)
779 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
781 return filedesc->chunksize;
784 int32_t sion_get_globalrank(
int sid)
786 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
788 return filedesc->globalrank;
791 int sion_get_number_of_logical_files(
int sid)
793 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
795 return filedesc->ntasks;
798 int64_t *sion_get_chunksizes(
int sid)
800 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
802 return filedesc->all_chunksizes;
805 int32_t sion_get_fsblksize(
int sid)
807 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
809 return filedesc->fsblksize;
817 char c[
sizeof(long)];
821 return u.c[
sizeof(long) - 1] == 1;
824 int sion_get_version(
int *major_version,
int *minor_version,
int *patch_level,
int *fileformat_version)
829 *fileformat_version = SION_FILEFORMAT_VERSION;
int sion_dedup(int sid)
Function which destroy a duplicated sion file descriptor.
sion_seek_mode
determines how offsets are interpreted for seek operations
int sion_get_mapping(int sid, int *mapping_size, int32_t **mapping, int *numfiles)
Returns pointers to the internal field mapping.
int sion_get_locations(int sid, int *ntasks, int *maxchunks, int64_t *globalskip, int64_t *start_of_varheader, int64_t **sion_chunksizes, int64_t **sion_globalranks, int64_t **sion_blockcount, int64_t **sion_blocksizes)
Returns pointers to internal fields.
int sion_dup(int sid, int mode, int rank, uint64_t key)
Function which duplicates a sion file descriptor.
int64_t sion_bytes_avail_in_block(int sid)
Return the number of bytes available in the current chunk.
int sion_get_sizeof(int sid, int *numbytes, int *numfds)
Function returns size of internal data structure for sid.
int64_t sion_tell(int sid)
Inspect position of file pointer in logical file.
int sion_seek(int sid, int64_t offset, sion_seek_mode whence)
moves the file pointer inside a logical file
size_t sion_read(void *data, size_t size, size_t nitems, int sid)
Read data from SIONlib file.
int sion_feof(int sid)
Function that indicates whether the end of this logical file has been reached.
size_t sion_write(const void *data, size_t size, size_t nitems, int sid)
Write data to a SIONlib file.
int sion_endianness_swap_needed(int sid)
Returns whether or not byte swapping is needed for sid.
interpret the offset relative to the current position in the file
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...
size_t sion_fread(void *data, size_t size, size_t nitems, int sid)
Read data from a SIONlib file.
int sion_get_file_endianness(int sid)
Returns edianness of data in file sid.
int sion_eof(int sid)
Function that indicates whether the end of this logical file has been reached.
#define SION_VERSION_MAJOR
the major version number
interpret the offset relative to the end of the file
int sion_get_version(int *major_version, int *minor_version, int *patch_level, int *fileformat_version)
Return version numbers.
int64_t sion_bytes_avail_in_chunk(int sid)
Function that returns the number of bytes available in the current chunk.
int sion_switch_logical_file(int sid, int file_number)
moves the file pointer to a different logical file
int sion_seek_chunk(int sid, int32_t offset, sion_seek_mode whence)
moves the file pointer by increments of entire chunks inside the logical file
interpret the offset relative to the beginning of the file
int sion_flush(int sid)
Flushed sion file.
int sion_get_current_location(int sid, int *currentchunknr, int64_t *currentpos, int *maxchunks, int64_t **chunksizes)
Returns current position in file and pointer fiels containing chunk sizes.
#define SION_VERSION_PATCH
the patch level
#define SION_VERSION_MINOR
the minor version number
int sion_ensure_free_space(int sid, int64_t bytes)
Function to ensure that enough space is available for writing.
size_t sion_fwrite(const void *data, size_t size, size_t nitems, int sid)
Write data to a SIONlib file.
int sion_get_current_locations(int sid, int *ntasks, int64_t **sion_currentpos, int64_t **sion_currentblocknr)
Returns current position in file and pointer fiels containing chunk sizes.
int sion_lock_user_callbacks_defined()
Function which return flag, if user callback for locking are registered.
int64_t sion_get_position(int sid)
Function that returns the current file position.
int sion_get_endianness(void)
Return endianness.