diff --git a/include/villas/nodes/file.h b/include/villas/nodes/file.h index d8e24e5e1..3c7fa4684 100644 --- a/include/villas/nodes/file.h +++ b/include/villas/nodes/file.h @@ -50,6 +50,7 @@ struct file { int flush; /**< Flush / upload file contents after each write. */ struct task task; /**< Timer file descriptor. Blocks until 1 / rate seconds are elapsed. */ double rate; /**< The read rate. */ + size_t buffer_size; /**< Defines size of stream buffer. No buffer is created if value is set to zero. */ enum epoch_mode { FILE_EPOCH_DIRECT, diff --git a/lib/nodes/file.c b/lib/nodes/file.c index 96bf81fcf..8bc926fcf 100644 --- a/lib/nodes/file.c +++ b/lib/nodes/file.c @@ -89,8 +89,9 @@ int file_parse(struct node *n, json_t *cfg) f->eof = FILE_EOF_EXIT; f->epoch_mode = FILE_EPOCH_DIRECT; f->flush = 0; + f->buffer_size = 0; - ret = json_unpack_ex(cfg, &err, 0, "{ s: s, s?: s, s?: { s?: s, s?: F, s?: s, s?: F }, s?: { s?: b } }", + ret = json_unpack_ex(cfg, &err, 0, "{ s: s, s?: s, s?: { s?: s, s?: F, s?: s, s?: F }, s?: { s?: b, s?: i } }", "uri", &uri_tmpl, "format", &format, "in", @@ -99,7 +100,8 @@ int file_parse(struct node *n, json_t *cfg) "epoch_mode", &epoch_mode, "epoch", &epoch_flt, "out", - "flush", &f->flush + "flush", &f->flush, + "buffer_size", &f->buffer_size ); if (ret) jerror(&err, "Failed to parse configuration of node %s", node_name(n)); @@ -219,6 +221,13 @@ int file_start(struct node *n) if (ret) return ret; + if (f->buffer_size) { + ret = setvbuf(f->io.output.stream.std, NULL, _IOFBF, f->buffer_size); + if(ret) + return ret; + } + + /* Create timer */ ret = task_init(&f->task, f->rate, CLOCK_REALTIME); if (ret)