10 #define _XOPEN_SOURCE 700 17 #include "sion_buffer.h" 18 #include "sion_common.h" 19 #include "sion_const.h" 20 #include "sion_debug.h" 22 #include "sion_error_handler.h" 24 #include "sion_file.h" 25 #include "sion_filedesc.h" 26 #include "sion_hints.h" 27 #include "sion_internal.h" 28 #include "sion_internal_positioning.h" 29 #include "sion_internal_seek.h" 30 #include "sion_lock.h" 32 sion_io_stat_t *sion_get_io_info_buddy(
int sid,
int roles,
int flag);
34 int sion_get_locations(
int sid,
int *ntasks,
int *maxchunks, int64_t *globalskip, int64_t *start_of_varheader,
35 int64_t **sion_chunksizes, int64_t **sion_globalranks, int64_t **sion_blockcount, int64_t **sion_blocksizes)
37 int rc = SION_SUCCESS;
38 _sion_filedesc *sion_filedesc;
39 #ifdef SION_SERIAL_MASTER 43 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
44 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
46 DPRINTFP((1,
"sion_get_locations", -1,
"enter\n"));
48 #ifdef SION_SERIAL_MASTER 49 if ((sion_filedesc->state == SION_FILESTATE_SEROPENMASTER) && (sion_filedesc->all_blockcount == NULL)) {
53 _sion_alloc_filedesc_arrays(sion_filedesc);
54 _sion_alloc_filedesc_block_arrays_only(sion_filedesc);
56 for (i = 0; i < sion_filedesc->ntasks; i++) {
57 int lfile = sion_filedesc->mapping[i * 2 + 0];
58 int lrank = sion_filedesc->mapping[i * 2 + 1];
59 sion_filedesc->all_chunksizes[i] = sion_filedesc->multifiles[lfile]->all_chunksizes[lrank];
60 sion_filedesc->all_globalranks[i] = sion_filedesc->multifiles[lfile]->all_globalranks[lrank];
61 sion_filedesc->all_blockcount[i] = sion_filedesc->multifiles[lfile]->all_blockcount[lrank];
63 for (i = 0; i < sion_filedesc->ntasks; i++) {
64 int lfile = sion_filedesc->mapping[i * 2 + 0];
65 int lrank = sion_filedesc->mapping[i * 2 + 1];
67 help = sion_filedesc->multifiles[lfile];
68 for (blknum = 0; blknum < sion_filedesc->all_blockcount[i]; blknum++) {
69 sion_filedesc->all_blocksizes[sion_filedesc->ntasks * blknum + i] = help->all_blocksizes[help->ntasks * blknum + lrank];
75 *ntasks = sion_filedesc->ntasks;
76 *maxchunks = sion_filedesc->maxusedchunks;
77 *sion_chunksizes = sion_filedesc->all_chunksizes;
78 *sion_globalranks = sion_filedesc->all_globalranks;
79 *sion_blockcount = sion_filedesc->all_blockcount;
80 *sion_blocksizes = sion_filedesc->all_blocksizes;
81 *globalskip = sion_filedesc->globalskip;
82 *start_of_varheader = sion_filedesc->start_of_varheader;
84 DPRINTFP((1,
"sion_get_locations", -1,
"leave\n"));
89 int _sion_close_sid(
int sid)
91 int rc = SION_SUCCESS;
92 _sion_filedesc *sion_filedesc;
94 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
95 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"_sion_close: invalid sion_filedesc, aborting %d ...\n", sid);
97 rc = _sion_close(sion_filedesc);
99 if (rc == SION_SUCCESS) {
101 _sion_free_filedesc(sion_filedesc);
109 int rc = SION_SUCCESS;
110 _sion_filedesc *sion_filedesc;
112 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
113 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
115 DPRINTFP((1,
"sion_get_current_location", -1,
"enter\n"));
117 *currentchunknr = sion_filedesc->currentblocknr;
118 *currentpos = sion_filedesc->currentpos - (sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip);
119 *maxchunks = sion_filedesc->lastchunknr + 1;
120 *chunksizes = sion_filedesc->blocksizes;
122 DPRINTFP((1,
"sion_get_current_location", -1,
"leave\n"));
128 int rc = SION_SUCCESS;
129 _sion_filedesc *sion_filedesc;
131 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
132 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
134 DPRINTFP((1,
"sion_get_mapping", -1,
"enter\n"));
136 if (sion_filedesc->mapping_size > 0) {
137 *mapping_size = sion_filedesc->mapping_size;
138 *mapping = sion_filedesc->mapping;
142 *numfiles = sion_filedesc->nfiles;
144 DPRINTFP((1,
"sion_get_mapping", -1,
"leave (mapping_size=%d)\n", *mapping_size));
151 _sion_filedesc *sion_filedesc;
153 DPRINTFP((1,
"sion_get_file_endianness", -1,
"enter (sid=%d)\n", sid));
155 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
156 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
159 DPRINTFP((1,
"sion_get_file_endianness", -1,
"leave (sid=%d)\n", sid));
161 return (sion_filedesc->endianness >> 8) & 1;
168 DPRINTFP((1,
"sion_endianness_swap_needed", -1,
"enter (sid=%d)\n", sid));
172 DPRINTFP((1,
"sion_endianness_swap_needed", -1,
"leave (swap_needed=%d)\n", swap_needed));
179 int rc = SION_SUCCESS;
180 _sion_filedesc *sion_filedesc;
182 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
183 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
185 DPRINTFP((1,
"sion_get_current_locations", -1,
"enter\n"));
187 *ntasks = sion_filedesc->ntasks;
188 *sion_currentpos = sion_filedesc->all_currentpos;
189 *sion_currentblocknr = sion_filedesc->all_currentblocknr;
191 DPRINTFP((1,
"sion_get_current_locations", -1,
"leave\n"));
195 int sion_get_number_of_files(
int sid)
197 _sion_filedesc *sion_filedesc;
199 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
200 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
203 return sion_filedesc->nfiles;
206 int sion_get_filenumber(
int sid)
208 _sion_filedesc *sion_filedesc;
210 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
211 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
214 return sion_filedesc->filenumber;
217 int sion_is_serial_opened(
int sid)
219 _sion_filedesc *sion_filedesc;
221 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
222 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
225 return sion_filedesc->state == SION_FILESTATE_SEROPEN || sion_filedesc->state == SION_FILESTATE_SEROPENRANK
226 || sion_filedesc->state == SION_FILESTATE_SEROPENMASTER;
229 int sion_using_hints(
int sid)
231 _sion_filedesc *sion_filedesc;
233 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
234 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
237 return sion_filedesc->usehints;
240 int64_t sion_get_bytes_written(
int sid)
242 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
243 if (filedesc == NULL) {
244 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
247 if (filedesc->mode == SION_FILEMODE_WRITE) {
248 if (filedesc->usebuffer) {
249 _sion_buffer_flush(filedesc);
251 return filedesc->size;
253 return SION_SIZE_NOT_VALID;
257 int64_t sion_get_bytes_read(
int sid)
259 _sion_filedesc *sion_filedesc;
260 int64_t bytes = SION_SIZE_NOT_VALID;
262 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
263 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
266 if (sion_filedesc->mode == SION_FILEMODE_READ) {
268 sion_filedesc->currentpos = _sion_file_get_position(sion_filedesc->fileptr);
271 for (i = 0; i < sion_filedesc->currentblocknr; i++) {
272 bytes += sion_filedesc->blocksizes[i];
275 bytes += sion_filedesc->currentpos - (sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip);
284 return sion_get_io_info_by_spec(sid, SION_ROLE_COLLECTOR | SION_ROLE_WRITER | SION_ROLE_NOWRITER, SION_GET_IO_INFO_FLAG_NONE);
288 sion_io_stat_t *sion_get_io_info_by_spec(
int sid,
int roles,
int flag)
290 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
291 if (filedesc == NULL) {
292 _sion_errorprint(0, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
297 if (filedesc->usebuddy) {
298 return sion_get_io_info_buddy(sid, roles, flag);
306 return _sion_free_io_info(p);
309 size_t sion_fwrite(
const void *data,
size_t size,
size_t nitems,
int sid)
311 int64_t bytes_to_write, bbytes;
312 _sion_filedesc *sion_filedesc;
316 DPRINTFP((1,
"sion_fwrite", -1,
"enter size=%ld nitems=%ld\n", (
long)size, (
long)nitems));
318 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
319 return _sion_errorprint(SION_ANSI_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
322 _sion_check_on_collective_mode(sion_filedesc);
324 bytes_to_write = size * nitems;
327 if (sion_filedesc->usebuffer) {
328 const char *data_ptr = data;
330 int64_t bytes_buffered = _sion_buffer_push(sion_filedesc, data_ptr, bytes_to_write);
331 bytes_to_write -= bytes_buffered;
332 data_ptr += bytes_buffered;
334 while (bytes_to_write > 0) {
336 _sion_buffer_get_data_ptr(sion_filedesc, &bdata, &bbytes);
337 frc = _sion_write_multi_chunk(sion_filedesc, bdata, bbytes);
339 return _sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID, _SION_ERROR_RETURN, sion_filedesc->rank,
340 "could not write data (%d bytes) to file (sid=%d) ...", (
int)bbytes, sid);
344 bytes_buffered = _sion_buffer_push(sion_filedesc, data_ptr, bytes_to_write);
345 bytes_to_write -= bytes_buffered;
346 data_ptr += bytes_buffered;
349 rc = size ? nitems : 0;
353 frc = _sion_write_multi_chunk(sion_filedesc, data, bytes_to_write);
354 if (frc != bytes_to_write) {
355 return _sion_errorprint_on_rank(SION_ANSI_SIZE_NOT_VALID, _SION_ERROR_RETURN, sion_filedesc->rank,
356 "could not write data (%d bytes) to file (frc=%d sid=%d) ...", (
int)bytes_to_write, (
int)frc, sid);
358 rc = size ? nitems : 0;
361 DPRINTFP((1,
"sion_fwrite", -1,
"leave rc=%ld\n", (
long)rc));
365 size_t sion_fread(
void *data,
size_t size,
size_t nitems,
int sid)
367 _sion_filedesc *sion_filedesc;
370 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
371 return _sion_errorprint(SION_ANSI_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid sion_filedesc, aborting %d ...\n", sid);
375 return _sion_errorprint(SION_ANSI_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"invalid pointer, aborting %d ...\n", data);
378 DPRINTFP((1,
"sion_fread", -1,
"enter\n"));
379 DPRINTFP((4,
"sion_fread", -1,
" parameter size=%zu nitems=%zu\n", size, nitems));
381 _sion_check_on_collective_mode(sion_filedesc);
384 bread = _sion_read_multi_chunk(sion_filedesc, data, size * nitems);
385 DPRINTFP((256,
"sion_fread", -1,
" _sion_file_read returns %zu\n", bread));
388 bread = size ? bread / size : 0;
390 DPRINTFP((4,
"sion_fread", -1,
" return value %zu\n", bread));
391 DPRINTFP((1,
"sion_fread", -1,
"leave\n"));
401 DPRINTFP((1, __func__, -1,
" enter seek with sid=%d\n", sid));
403 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
404 if (filedesc == NULL) {
405 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_seek: invalid sion_filedesc, aborting %d ...\n", sid);
409 if ((filedesc->mode != SION_FILEMODE_READ) && (filedesc->mode != SION_FILEMODE_WRITE)) {
410 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
411 "sion_seek: unknown file open state !(READ|WRITE), aborting %d ...", sid);
413 if (filedesc->usebuffer) {
414 _sion_buffer_flush(filedesc);
416 if ((filedesc->state != SION_FILESTATE_PAROPEN) && (filedesc->state != SION_FILESTATE_SEROPEN)
417 && (filedesc->state != SION_FILESTATE_SEROPENMASTER) && (filedesc->state != SION_FILESTATE_SEROPENRANK)
418 && (filedesc->state != SION_FILESTATE_PAROPENMAPPEDMASTER)) {
419 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
420 "sion_seek: unknown file open state !(PAR|SER|SERRANK|MAPPED), aborting %d ...", sid);
424 if (filedesc->mode == SION_FILEMODE_READ) {
425 rc = _sion_seek_on_current_rank_read(filedesc, offset, whence);
427 if (filedesc->state == SION_FILESTATE_SEROPENRANK) {
428 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
429 "sion_seek: seek not supported for this type (write, sion_open_rank), aborting ...");
431 rc = _sion_seek_on_current_rank_write(filedesc, offset, whence);
435 DPRINTFP((1, __func__, -1,
"leave seek rc=%d\n", rc));
441 DPRINTFP((1, __func__, -1,
" enter seek with sid=%d\n", sid));
443 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
444 if (filedesc == NULL) {
445 return _sion_errorprint(
446 SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_seek_chunk: invalid sion_filedesc, aborting %d ...\n", sid);
452 new_blocknr = offset;
455 new_blocknr = _sion_get_current_chunk_number(filedesc) + offset;
458 new_blocknr = filedesc->lastchunknr + offset;
461 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_seek_block: seek mode not supported, aborting ...\n");
464 if (new_blocknr < 0) {
465 return _sion_errorprint(
466 SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_seek_chunk: cannot seek before first block, aborting ...\n");
468 if (filedesc->mode == SION_FILEMODE_READ && new_blocknr > filedesc->lastchunknr) {
469 return _sion_errorprint(
470 SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_seek_chunk: cannot seek past last block in read mode, aborting ...\n");
473 _sion_apply_hints(filedesc, SION_HINTS_FREE_TYPE_CHUNK);
474 _sion_chunk_sequence sequence = _sion_chunk_sequence_from_filedesc(filedesc);
475 _sion_range chunk = _sion_chunk_sequence_chunk_from_number(&sequence, new_blocknr);
476 filedesc->currentpos = chunk.start;
477 filedesc->currentblocknr = new_blocknr;
478 _sion_apply_hints(filedesc, SION_HINTS_ACCESS_TYPE_CHUNK);
480 _sion_file_set_position(filedesc->fileptr, filedesc->currentpos);
482 DPRINTFP((1, __func__, -1,
"leave seek rc=%d\n", SION_SUCCESS));
488 DPRINTFP((1, __func__, -1,
" enter switch_logical_file with sid=%d\n", sid));
490 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
491 if (filedesc == NULL) {
492 return _sion_errorprint(
493 SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_seek_chunk: invalid sion_filedesc, aborting %d ...\n", sid);
497 if (filedesc->mode == SION_FILEMODE_READ) {
498 if (filedesc->state == SION_FILESTATE_SEROPEN) {
499 rc = _sion_switch_logical_file_read(filedesc, file_number);
500 }
else if (filedesc->state == SION_FILESTATE_SEROPENMASTER) {
501 rc = _sion_switch_logical_file_read_master(filedesc, file_number);
502 }
else if (filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
503 rc = _sion_switch_logical_file_read_mapped(filedesc, file_number);
504 }
else if ((filedesc->state == SION_FILESTATE_SEROPENRANK) || (filedesc->state == SION_FILESTATE_PAROPEN)) {
505 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
506 "sion_switch_logical_file: switching logical file not supported for this type (sion_open_rank, sion_paropen_...), " 509 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
510 "sion_switch_logical_file: switching logical file not supported for unknown file state, aborting ...\n");
513 if (filedesc->state == SION_FILESTATE_SEROPEN) {
514 rc = _sion_switch_logical_file_write(filedesc, file_number);
515 }
else if (filedesc->state == SION_FILESTATE_PAROPENMAPPEDMASTER) {
516 rc = _sion_switch_logical_file_write_mapped(filedesc, file_number);
517 }
else if ((filedesc->state == SION_FILESTATE_SEROPENRANK) || (filedesc->state == SION_FILESTATE_PAROPEN)) {
518 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
519 "sion_switch_logical_file: switching logical file not supported for this type (sion_open_rank, sion_paropen_...), " 522 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, filedesc->rank,
523 "sion_switch_logical_file: switching logical file not supported for unknown file state, aborting ...\n");
527 DPRINTFP((1, __func__, -1,
"leave switch_logical_file rc=%d\n", rc));
533 int rc = SION_NOT_SUCCESS;
536 _sion_filedesc *sion_filedesc;
537 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
538 return _sion_errorprint(SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"sion_feof: invalid sion_filedesc, aborting %d ...\n", sid);
541 DPRINTFP((8,
"sion_feof", -1,
"enter feof sid=%d currentpos=%15lld\n", sid, sion_filedesc->currentpos));
543 maxpos = sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip
544 + sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
546 DPRINTFP((16,
"sion_feof", -1,
" after flush sid=%d currentpos=%15lld maxpos= %lld startpos=%lld curblknr=%d\n", sid,
547 sion_filedesc->currentpos, maxpos, sion_filedesc->startpos, sion_filedesc->currentblocknr));
549 if (sion_filedesc->currentpos < maxpos) {
552 DPRINTFP((16,
"sion_feof", -1,
" end of current block %d not reached sid=%d\n", sion_filedesc->currentblocknr, sid));
554 if (sion_filedesc->currentblocknr < sion_filedesc->lastchunknr) {
556 _sion_apply_hints(sion_filedesc, SION_HINTS_FREE_TYPE_CHUNK);
559 sion_filedesc->currentblocknr++;
560 sion_filedesc->currentpos = sion_filedesc->startpos + sion_filedesc->currentblocknr * sion_filedesc->globalskip;
563 _sion_apply_hints(sion_filedesc, SION_HINTS_ACCESS_TYPE_CHUNK);
565 _sion_file_set_position(sion_filedesc->fileptr, sion_filedesc->currentpos);
566 rc = SION_NOT_SUCCESS;
567 DPRINTFP((8,
"sion_feof", -1,
" end of block %d reached, skipping to next %lld -> %lld position=%lld gs=%lld sid=%d\n",
568 sion_filedesc->currentblocknr - 1, sion_filedesc->currentpos, _sion_file_get_position(sion_filedesc->fileptr),
569 sion_filedesc->currentpos, sion_filedesc->globalskip, sid));
572 DPRINTFP((8,
"sion_feof", -1,
" end of last block %d reached sid=%d\n", sion_filedesc->currentblocknr, sid));
577 DPRINTFP((8,
"sion_feof", -1,
"leave feof sid=%d currentpos=%15lld rc=%d\n", sid, sion_filedesc->currentpos, rc));
589 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
590 if (filedesc == NULL) {
591 return _sion_errorprint(
592 SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"sion_bytes_avail_in_chunk: invalid filedesc, aborting %d ...\n", sid);
595 assert(filedesc->mode & SION_FILEMODE_WRITE);
597 _sion_limited_chunk_sequence sequence = _sion_limited_chunk_sequence_from_filedesc(filedesc);
599 if (_sion_limited_chunk_sequence_position_oob(&sequence, filedesc->currentpos)) {
602 _sion_range chunk = _sion_limited_chunk_sequence_chunk_from_physical_position(&sequence, filedesc->currentpos);
603 bytes_avail = chunk.length;
606 DPRINTFP((8, __func__, -1,
"leave sid=%d rank=%4d currentpos=%lld maxpos= %lld -> bytes to read %lld\n",
607 sid, filedesc->rank, filedesc->currentpos, bytes_avail));
614 _sion_filedesc *sion_filedesc;
616 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
617 return _sion_errorprint(
618 SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"sion_get_position: invalid sion_filedesc, aborting %d ...\n", sid);
621 return _sion_file_get_position(sion_filedesc->fileptr);
624 int sion_optimize_fp_buffer(
int sid)
626 int rc = SION_SUCCESS;
627 _sion_filedesc *sion_filedesc;
629 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
630 return _sion_errorprint(
631 SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_optimize_fp_buffer: invalid sion_filedesc, aborting %d ...\n", sid);
634 sion_filedesc->fpbuffer = malloc(sion_filedesc->fsblksize);
635 if (sion_filedesc->fpbuffer == NULL) {
636 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, sion_filedesc->rank,
637 "sion_optimize_fp_buffer: cannot allocate internal buffer of size %lu , aborting ...",
638 (
unsigned long)sion_filedesc->fsblksize);
640 sion_filedesc->fpbuffer_size = sion_filedesc->fsblksize;
642 rc = _sion_file_set_buffer(sion_filedesc->fileptr, sion_filedesc->fpbuffer, sion_filedesc->fpbuffer_size);
648 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
649 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(filedesc = _sion_vcdtovcon(sid))) {
650 return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_flush: invalid sion_filedesc, aborting %d ...\n", sid);
658 _sion_filedesc *sion_filedesc;
659 int64_t byteswritten;
660 int rc = SION_SUCCESS;
662 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
663 return _sion_errorprint(
664 SION_NOT_SUCCESS, _SION_ERROR_RETURN,
"sion_ensure_free_space: invalid sion_filedesc, returning %d ...\n", sid);
667 DPRINTFP((8,
"_sion_ensure_free_space", -1,
"enter ensure_free sid=%d bytes=%lld\n", sid, bytes));
669 if (sion_filedesc->mode != SION_FILEMODE_WRITE) {
670 DPRINTFP((8,
"_sion_ensure_free_space", -1,
"invalid opened\n"));
671 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, sion_filedesc->rank,
672 "sion_ensure_free_space[%2d]: file is opened invalid sion_mode, returning ...", sion_filedesc->rank);
674 if (!sion_filedesc->usecoll) {
675 if (sion_filedesc->fileptr == NULL) {
676 DPRINTFP((8,
"_sion_ensure_free_space", -1,
"file not opened\n"));
677 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, sion_filedesc->rank,
678 "sion_ensure_free_space[%2d]: file is not open, returning ...", sion_filedesc->rank);
682 if (bytes > sion_filedesc->chunksize) {
683 DPRINTFP((8,
"_sion_ensure_free_space", -1,
"could not write %lld bytes, chunksize=%lld\n", bytes, sion_filedesc->chunksize));
684 return _sion_errorprint_on_rank(SION_NOT_SUCCESS, _SION_ERROR_RETURN, sion_filedesc->rank,
685 "sion_ensure_free_space[%2d]: could not write %lld bytes, chunksize=%lld, returning ...", sion_filedesc->rank, bytes,
686 sion_filedesc->chunksize);
689 DPRINTFP((16,
"_sion_ensure_free_space", -1,
" after getpos sid=%d fileposition is %lld bytes=%lld\n", sid,
690 sion_filedesc->currentpos, bytes));
692 byteswritten = sion_filedesc->blocksizes[sion_filedesc->currentblocknr];
694 DPRINTFP((16,
"_sion_ensure_free_space", -1,
" sid=%d byteswritten(%lld) + new bytes (%lld) = %lld\n", sid, byteswritten, bytes,
695 byteswritten + bytes));
697 DPRINTFP((8,
"_sion_ensure_free_space", -1,
698 "leave ensure_free sid=%d fileposition is %lld bw+bytes=%lld <= chunksize=%lld (fsblksize=%d)\n", sid,
699 sion_filedesc->currentpos, byteswritten + bytes, sion_filedesc->chunksize, sion_filedesc->fsblksize));
704 int sion_is_thread_safe()
709 return SION_NOT_SUCCESS;
715 _sion_filedesc *sion_filedesc;
716 int rc = SION_NOT_SUCCESS;
718 *numbytes = SION_SIZE_NOT_VALID;
719 *numfds = SION_SIZE_NOT_VALID;
721 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
722 return _sion_errorprint(
723 SION_SIZE_NOT_VALID, _SION_ERROR_RETURN,
"sion_get_sizeof: invalid sion_filedesc, returning %d ...\n", sid);
725 DPRINTFP((2,
"sion_get_sizeof", -1,
"enter sid=%d\n", sid));
727 rc = _sion_get_size_of_filedesc(sion_filedesc, numbytes, numfds);
729 DPRINTFP((2,
"sion_get_sizeof", -1,
"leave sid=%d numbytes=%d numfds=%d\n", sid, *numbytes, *numfds));
734 #define DFUNCTION "sion_dup" 735 int sion_dup(
int sid,
int mode,
int rank, uint64_t key)
737 int new_sid = SION_ID_NOT_VALID;
738 _sion_filedesc *sion_filedesc;
740 if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
741 return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
"sion_dup: invalid sion_filedesc, returning %d ...\n", sid);
743 DPRINTFP((8, DFUNCTION, -1,
"enter sid=%d\n", sid));
745 if (sion_filedesc->mode != SION_FILEMODE_READ) {
746 DPRINTFP((8, DFUNCTION, -1,
"invalid opened\n"));
747 return _sion_errorprint_on_rank(SION_ID_NOT_VALID, _SION_ERROR_RETURN, sion_filedesc->rank,
748 DFUNCTION
"[%2d]: file is not opened in read mode, returning ...", sion_filedesc->rank);
751 new_sid = _sion_dup(sid, mode, rank, key);
753 DPRINTFP((8, DFUNCTION, -1,
"leave sid=%d new_sid=%d\n", sid, new_sid));
759 #define DFUNCTION "sion_dedup" 763 DPRINTFP((8, DFUNCTION, -1,
"enter sid=%d\n", sid));
765 rc = _sion_dedup(sid);
767 DPRINTFP((8, DFUNCTION, -1,
"leave sid=%d rc=%d\n", sid, rc));
773 #define DFUNCTION "sion_lock_register_lock_callbacks" 777 DPRINTFP((8, DFUNCTION, -1,
"enter\n"));
779 rc = _sion_lock_register_lock_callbacks(lock, unlock, lock_data);
781 DPRINTFP((8, DFUNCTION, -1,
"leave rc=%d\n", rc));
787 #define DFUNCTION "sion_lock_user_callbacks_defined" 791 DPRINTFP((8, DFUNCTION, -1,
"enter\n"));
793 rc = _sion_lock_user_callbacks_defined();
795 DPRINTFP((8, DFUNCTION, -1,
"leave rc=%d\n", rc));
801 char *sion_get_fname(
int sid)
803 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
805 return filedesc->fname;
808 int64_t sion_get_chunksize(
int sid)
810 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
812 return filedesc->chunksize;
815 int32_t sion_get_globalrank(
int sid)
817 _sion_filedesc *filedesc = _sion_get_filedesc(sid);
819 return filedesc->globalrank;
827 char c[
sizeof(long)];
831 return u.c[
sizeof(long) - 1] == 1;
834 int sion_get_version(
int *main_version,
int *sub_version,
int *patch_level,
int *fileformat_version)
836 *main_version = SION_MAIN_VERSION;
837 *sub_version = SION_SUB_VERSION;
838 *patch_level = SION_VERSION_PATCHLEVEL;
839 *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.
int sion_seek(int sid, int64_t offset, sion_seek_mode whence)
moves the file pointer inside a logical file
int sion_feof(int sid)
Function that indicates whether the end of file is reached for this task.
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 sion file.
int sion_get_file_endianness(int sid)
Returns edianness of data in file sid.
interpret the offset relative to the beginning of the file
interpret the offset relative to the end of the file
int sion_get_version(int *main_version, int *sub_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
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.
int sion_ensure_free_space(int sid, int64_t bytes)
Funtion 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 sion 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.