diff options
author | 2021-03-10 15:40:52 +0200 | |
---|---|---|
committer | 2021-03-10 15:40:52 +0200 | |
commit | 4dcfe9c0a8b03915d93420d523d6bdc1884bd137 (patch) | |
tree | 603a0874ce026aabe2bfca79b9f63ef8fbe47274 /src/stream.c | |
parent | b36a641c699dcd21e82aaa73971f9744dac61aa1 (diff) | |
download | algos-ld1-4dcfe9c0a8b03915d93420d523d6bdc1884bd137.tar.gz algos-ld1-4dcfe9c0a8b03915d93420d523d6bdc1884bd137.tar.bz2 algos-ld1-4dcfe9c0a8b03915d93420d523d6bdc1884bd137.zip |
now with uncached arrays!
Signed-off-by: Gediminas Jakutis <gediminas@varciai.lt>
Diffstat (limited to 'src/stream.c')
-rw-r--r-- | src/stream.c | 62 |
1 files changed, 59 insertions, 3 deletions
diff --git a/src/stream.c b/src/stream.c index b7bc39e..da8d9c8 100644 --- a/src/stream.c +++ b/src/stream.c @@ -99,6 +99,56 @@ err: return ret; } +struct entry_l *file_get_array(struct stream * const in, struct entry_l * const store) +{ + struct entry ent; + struct entry_l *ret = NULL; + ssize_t bytes_read; + + if (in->index < in->n) { + do { + try(0 > (bytes_read = pread(in->fd, &ent, sizeof(ent), in->index * in->settings->stride)), err, NULL, "Writing to stream failed with %i", errno); + } while (bytes_read != sizeof(ent)); + + ++in->index; + store->val = ent.val; + ret = store; + } + +err: + return ret; +} + +int file_put_array(struct stream * const in, const struct entry_l * const data) +{ + int ret = 0; + ssize_t bytes_written; + + if (in->index < in->n) { + do { + try(0 > (bytes_written = pwrite(in->fd, data, sizeof(data->val), in->index * in->settings->stride)), err, errno, "Writing to stream failed with %i", ret); + } while (bytes_written != sizeof(data->val)); + ++in->index; + } + +err: + return ret; +} + +int file_transfer(struct stream * const src, struct stream * const dest) +{ + int ret = 0; + int tmp; + + /* just a simple switcheroo of file descriptors */ + + tmp = src->fd; + src->fd = dest->fd; + dest->fd = tmp; + + return ret; +} + /* generic, naïve and slow copy routine when an optimized one cannot be used */ int stream_copy_range(struct stream * const restrict src, struct stream * const restrict dest) { @@ -138,9 +188,15 @@ int stream_shallow_copy(struct stream const * const restrict src, struct stream dest->put = src->put; dest->copy = src->copy; - dest->type = src->settings->access == cached ? stream_cache : stream_lite; - - try_s((ret = cache_create(dest)), err); + if (src->settings->access == cached) { + dest->fd = -1; + dest->type = stream_lite; + try_s((ret = cache_create(dest)), err); + } else { + dest->name = src->name; + dest->type = stream_lite; + try_s((ret = stream_open_lite(dest)), err); + } err: return ret; |