summaryrefslogtreecommitdiffstats
path: root/src/stream.c
diff options
context:
space:
mode:
authorGravatar Gediminas Jakutis <gediminas@varciai.lt> 2021-03-10 15:40:52 +0200
committerGravatar Gediminas Jakutis <gediminas@varciai.lt> 2021-03-10 15:40:52 +0200
commit4dcfe9c0a8b03915d93420d523d6bdc1884bd137 (patch)
tree603a0874ce026aabe2bfca79b9f63ef8fbe47274 /src/stream.c
parentb36a641c699dcd21e82aaa73971f9744dac61aa1 (diff)
downloadalgos-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.c62
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;