From 6411fc5ca7febd8af9e31ad8f9ca2f198bdc5064 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 10 Sep 2020 11:11:42 +0200 Subject: [PATCH] warn about unused return values for *_{init,destroy}() functions --- common | 2 +- include/villas/hook_list.hpp | 4 ++-- include/villas/io.h | 6 +++--- include/villas/kernel/if.h | 4 ++-- include/villas/memory.h | 2 +- include/villas/memory_type.h | 2 +- include/villas/node.h | 4 ++-- include/villas/node_direction.h | 6 +++--- include/villas/path.h | 4 ++-- include/villas/pool.h | 4 ++-- include/villas/queue.h | 4 ++-- include/villas/queue_signalled.h | 14 ++++++------- include/villas/signal.h | 8 +++---- include/villas/signal_list.h | 4 ++-- lib/formats/iotagent_ul.cpp | 2 +- lib/formats/json.cpp | 2 +- lib/formats/json_reserve.cpp | 2 +- lib/formats/protobuf.cpp | 2 +- lib/formats/value.cpp | 5 +---- lib/formats/villas_human.cpp | 2 +- lib/hook.cpp | 4 +++- lib/hooks/average.cpp | 4 +++- lib/hooks/limit_value.cpp | 4 +++- lib/kernel/if.cpp | 12 +++++++++-- lib/nodes/amqp.cpp | 5 +++-- lib/nodes/can.cpp | 8 +++---- lib/nodes/comedi.cpp | 5 +++-- lib/nodes/ethercat.cpp | 10 ++++++--- lib/nodes/example.cpp | 5 +++-- lib/nodes/exec.cpp | 5 +++-- lib/nodes/file.cpp | 5 +++-- lib/nodes/fpga.cpp | 8 +++---- lib/nodes/iec61850.cpp | 4 +++- lib/nodes/iec61850_sv.cpp | 8 ++++--- lib/nodes/infiniband.cpp | 5 +++-- lib/nodes/influxdb.cpp | 6 +++--- lib/nodes/mqtt.cpp | 36 +++++++++++++++++--------------- lib/nodes/nanomsg.cpp | 14 +++++++++---- lib/nodes/ngsi.cpp | 5 +++-- lib/nodes/opal.cpp | 5 +++-- lib/nodes/rtp.cpp | 5 +++-- lib/nodes/shmem.cpp | 6 +++--- lib/nodes/signal_generator.cpp | 7 +++++-- lib/nodes/socket.cpp | 5 +++-- lib/nodes/stats.cpp | 5 +++-- lib/nodes/test_rtt.cpp | 9 +++++--- lib/nodes/uldaq.cpp | 5 +++-- lib/nodes/websocket.cpp | 15 +++++++++---- lib/nodes/zeromq.cpp | 15 +++++++++---- lib/pool.cpp | 4 +++- lib/shmem.cpp | 8 ++++++- lib/signal.cpp | 12 ++++++++--- lib/super_node.cpp | 30 +++++++++++++++++--------- src/villas-pipe.cpp | 15 +++++++++---- tests/unit/io.cpp | 6 ++++-- tests/unit/main.cpp | 3 ++- 56 files changed, 240 insertions(+), 151 deletions(-) diff --git a/common b/common index 7f356d91d..9533016a4 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 7f356d91d5fe81e91ec552583fb5b307ccaa723d +Subproject commit 9533016a49e2880af995d69758eead89488b0b69 diff --git a/include/villas/hook_list.hpp b/include/villas/hook_list.hpp index 563e6366a..abd61747d 100644 --- a/include/villas/hook_list.hpp +++ b/include/villas/hook_list.hpp @@ -39,9 +39,9 @@ struct sample; struct vpath; struct vnode; -int hook_list_init(struct vlist *hs); +int hook_list_init(struct vlist *hs) __attribute__ ((warn_unused_result)); -int hook_list_destroy(struct vlist *hs); +int hook_list_destroy(struct vlist *hs) __attribute__ ((warn_unused_result)); /** Parses an object of hooks * diff --git a/include/villas/io.h b/include/villas/io.h index 23f6b701e..57e0d5611 100644 --- a/include/villas/io.h +++ b/include/villas/io.h @@ -76,11 +76,11 @@ struct io { const struct format_type *_vt; }; -int io_init(struct io *io, const struct format_type *fmt, struct vlist *signals, int flags); +int io_init(struct io *io, const struct format_type *fmt, struct vlist *signals, int flags) __attribute__ ((warn_unused_result)); -int io_init2(struct io *io, const struct format_type *fmt, const char *dt, int flags); +int io_init2(struct io *io, const struct format_type *fmt, const char *dt, int flags) __attribute__ ((warn_unused_result)); -int io_destroy(struct io *io); +int io_destroy(struct io *io) __attribute__ ((warn_unused_result)); int io_check(struct io *io); diff --git a/include/villas/kernel/if.h b/include/villas/kernel/if.h index 607d238be..f2bfd4610 100644 --- a/include/villas/kernel/if.h +++ b/include/villas/kernel/if.h @@ -62,7 +62,7 @@ struct interface { * @retval >0 Success. A pointer to the new interface. * @retval 0 Error. The creation failed. */ -int if_init(struct interface * , struct rtnl_link *link); +int if_init(struct interface * , struct rtnl_link *link) __attribute__ ((warn_unused_result)); /** Get name of interface */ const char * if_name(struct interface *); @@ -71,7 +71,7 @@ const char * if_name(struct interface *); * * @param i A pointer to the interface structure. */ -int if_destroy(struct interface *i); +int if_destroy(struct interface *i) __attribute__ ((warn_unused_result)); /** Start interface. * diff --git a/include/villas/memory.h b/include/villas/memory.h index f881789c3..58f72571e 100644 --- a/include/villas/memory.h +++ b/include/villas/memory.h @@ -64,7 +64,7 @@ struct memory_allocation { }; /** Initilialize memory subsystem */ -int memory_init(int hugepages); +int memory_init(int hugepages) __attribute__ ((warn_unused_result)); int memory_lock(size_t lock); diff --git a/include/villas/memory_type.h b/include/villas/memory_type.h index 9c2ec9fcc..a0c96487f 100644 --- a/include/villas/memory_type.h +++ b/include/villas/memory_type.h @@ -60,4 +60,4 @@ extern struct memory_type *memory_default; struct memory_type * memory_ib(struct vnode *n, struct memory_type *parent); struct memory_type * memory_managed(void *ptr, size_t len); -int memory_mmap_init(int hugepages); +int memory_mmap_init(int hugepages) __attribute__ ((warn_unused_result)); diff --git a/include/villas/node.h b/include/villas/node.h index 49c307cd0..d14becc49 100644 --- a/include/villas/node.h +++ b/include/villas/node.h @@ -101,7 +101,7 @@ struct vnode { }; /** Initialize node with default values */ -int node_init(struct vnode *n, struct vnode_type *vt); +int node_init(struct vnode *n, struct vnode_type *vt) __attribute__ ((warn_unused_result)); /** Do initialization after parsing the configuration */ int node_prepare(struct vnode *n); @@ -166,7 +166,7 @@ int node_restart(struct vnode *n); * * @see node_type::destroy */ -int node_destroy(struct vnode *n); +int node_destroy(struct vnode *n) __attribute__ ((warn_unused_result)); /** Return a pointer to a string which should be used to print this node. * diff --git a/include/villas/node_direction.h b/include/villas/node_direction.h index 9e2faa8e4..fe051ecd5 100644 --- a/include/villas/node_direction.h +++ b/include/villas/node_direction.h @@ -55,7 +55,9 @@ struct vnode_direction { json_t *cfg; /**< A JSON object containing the configuration of the node. */ }; -int node_direction_init(struct vnode_direction *nd, enum NodeDir dir, struct vnode *n); +int node_direction_init(struct vnode_direction *nd, enum NodeDir dir, struct vnode *n) __attribute__ ((warn_unused_result)); + +int node_direction_destroy(struct vnode_direction *nd, struct vnode *n) __attribute__ ((warn_unused_result)); int node_direction_parse(struct vnode_direction *nd, struct vnode *n, json_t *cfg); @@ -67,8 +69,6 @@ int node_direction_start(struct vnode_direction *nd, struct vnode *n); int node_direction_stop(struct vnode_direction *nd, struct vnode *n); -int node_direction_destroy(struct vnode_direction *nd, struct vnode *n); - struct vlist * node_direction_get_signals(struct vnode_direction *nd); /** @} */ diff --git a/include/villas/path.h b/include/villas/path.h index 84c29940c..253c145a1 100644 --- a/include/villas/path.h +++ b/include/villas/path.h @@ -98,7 +98,7 @@ struct vpath { }; /** Initialize internal data structures. */ -int path_init(struct vpath *p); +int path_init(struct vpath *p) __attribute__ ((warn_unused_result)); int path_prepare(struct vpath *p); @@ -127,7 +127,7 @@ int path_stop(struct vpath *p); * * @param i A pointer to the path structure. */ -int path_destroy(struct vpath *p); +int path_destroy(struct vpath *p) __attribute__ ((warn_unused_result)); /** Fills the provided buffer with a string representation of the path. * diff --git a/include/villas/pool.h b/include/villas/pool.h index b53aa6b80..09c426571 100644 --- a/include/villas/pool.h +++ b/include/villas/pool.h @@ -57,10 +57,10 @@ struct pool { * @retval 0 The pool has been successfully initialized. * @retval <>0 There was an error during the pool initialization. */ -int pool_init(struct pool *p, size_t cnt, size_t blocksz, struct memory_type *mem = memory_default); +int pool_init(struct pool *p, size_t cnt, size_t blocksz, struct memory_type *mem = memory_default) __attribute__ ((warn_unused_result)); /** Destroy and release memory used by pool. */ -int pool_destroy(struct pool *p); +int pool_destroy(struct pool *p) __attribute__ ((warn_unused_result)); /** Pop up to \p cnt values from the stack an place them in the array \p blocks. * diff --git a/include/villas/queue.h b/include/villas/queue.h index 9a5cdbad4..e70a46145 100644 --- a/include/villas/queue.h +++ b/include/villas/queue.h @@ -71,10 +71,10 @@ struct queue { }; /** Initialize MPMC queue */ -int queue_init(struct queue *q, size_t size, struct memory_type *mem = memory_default); +int queue_init(struct queue *q, size_t size, struct memory_type *mem = memory_default) __attribute__ ((warn_unused_result)); /** Desroy MPMC queue and release memory */ -int queue_destroy(struct queue *q); +int queue_destroy(struct queue *q) __attribute__ ((warn_unused_result)); /** Return estimation of current queue usage. * diff --git a/include/villas/queue_signalled.h b/include/villas/queue_signalled.h index 86dc3b4d5..810cf0a42 100644 --- a/include/villas/queue_signalled.h +++ b/include/villas/queue_signalled.h @@ -64,19 +64,19 @@ struct queue_signalled { #define queue_signalled_available(q) queue_available(&((q)->queue)) -int queue_signalled_init(struct queue_signalled *qs, size_t size, struct memory_type *mem = memory_default, enum QueueSignalledMode mode = QueueSignalledMode::AUTO, int flags = 0); +int queue_signalled_init(struct queue_signalled *qs, size_t size, struct memory_type *mem = memory_default, enum QueueSignalledMode mode = QueueSignalledMode::AUTO, int flags = 0) __attribute__ ((warn_unused_result)); -int queue_signalled_destroy(struct queue_signalled *qs); +int queue_signalled_destroy(struct queue_signalled *qs) __attribute__ ((warn_unused_result)); -int queue_signalled_push(struct queue_signalled *qs, void *ptr); +int queue_signalled_push(struct queue_signalled *qs, void *ptr) __attribute__ ((warn_unused_result)); -int queue_signalled_pull(struct queue_signalled *qs, void **ptr); +int queue_signalled_pull(struct queue_signalled *qs, void **ptr) __attribute__ ((warn_unused_result)); -int queue_signalled_push_many(struct queue_signalled *qs, void *ptr[], size_t cnt); +int queue_signalled_push_many(struct queue_signalled *qs, void *ptr[], size_t cnt) __attribute__ ((warn_unused_result)); -int queue_signalled_pull_many(struct queue_signalled *qs, void *ptr[], size_t cnt); +int queue_signalled_pull_many(struct queue_signalled *qs, void *ptr[], size_t cnt) __attribute__ ((warn_unused_result)); -int queue_signalled_close(struct queue_signalled *qs); +int queue_signalled_close(struct queue_signalled *qs) __attribute__ ((warn_unused_result)); /** Returns a file descriptor which can be used with poll / select to wait for new data */ int queue_signalled_fd(struct queue_signalled *qs); diff --git a/include/villas/signal.h b/include/villas/signal.h index 1701a9b96..6f8861676 100644 --- a/include/villas/signal.h +++ b/include/villas/signal.h @@ -55,16 +55,16 @@ struct signal { }; /** Initialize a signal with default values. */ -int signal_init(struct signal *s); +int signal_init(struct signal *s) __attribute__ ((warn_unused_result)); /** Destroy a signal and release memory. */ -int signal_destroy(struct signal *s); +int signal_destroy(struct signal *s) __attribute__ ((warn_unused_result)); /** Allocate memory for a new signal, and initialize it with provided values. */ -struct signal * signal_create(const char *name, const char *unit, enum SignalType fmt); +struct signal * signal_create(const char *name, const char *unit, enum SignalType fmt) __attribute__ ((warn_unused_result)); /** Destroy and release memory of signal. */ -int signal_free(struct signal *s); +int signal_free(struct signal *s) __attribute__ ((warn_unused_result)); /** Increase reference counter. */ int signal_incref(struct signal *s); diff --git a/include/villas/signal_list.h b/include/villas/signal_list.h index b670fc978..61fbdf91b 100644 --- a/include/villas/signal_list.h +++ b/include/villas/signal_list.h @@ -30,9 +30,9 @@ /* Forward declarations */ struct vlist; -int signal_list_init(struct vlist *list); +int signal_list_init(struct vlist *list) __attribute__ ((warn_unused_result)); -int signal_list_destroy(struct vlist *list); +int signal_list_destroy(struct vlist *list) __attribute__ ((warn_unused_result)); int signal_list_parse(struct vlist *list, json_t *cfg); diff --git a/lib/formats/iotagent_ul.cpp b/lib/formats/iotagent_ul.cpp index 548e8b1e8..75eb8e7f7 100644 --- a/lib/formats/iotagent_ul.cpp +++ b/lib/formats/iotagent_ul.cpp @@ -66,7 +66,7 @@ __attribute__((constructor(110))) static void UNIQUE(__ctor)() { p.format.sprint = iotagent_ul_sprint; p.format.size = 0; - vlist_push(&plugins, &p); + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) static void UNIQUE(__dtor)() { diff --git a/lib/formats/json.cpp b/lib/formats/json.cpp index 3141f4a5d..af3a7c9cb 100644 --- a/lib/formats/json.cpp +++ b/lib/formats/json.cpp @@ -352,7 +352,7 @@ __attribute__((constructor(110))) static void UNIQUE(__ctor)() { p.format.flags = (int) SampleFlags::HAS_TS_ORIGIN | (int) SampleFlags::HAS_SEQUENCE | (int) SampleFlags::HAS_DATA; p.format.delimiter = '\n'; - vlist_push(&plugins, &p); + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) static void UNIQUE(__dtor)() { diff --git a/lib/formats/json_reserve.cpp b/lib/formats/json_reserve.cpp index 9c17e9522..84c8108a6 100644 --- a/lib/formats/json_reserve.cpp +++ b/lib/formats/json_reserve.cpp @@ -333,7 +333,7 @@ __attribute__((constructor(110))) static void UNIQUE(__ctor)() { p.format.sscan = json_reserve_sscan; p.format.size = 0; - vlist_push(&plugins, &p); + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) static void UNIQUE(__dtor)() { diff --git a/lib/formats/protobuf.cpp b/lib/formats/protobuf.cpp index ef7c4d12c..5bafb8c07 100644 --- a/lib/formats/protobuf.cpp +++ b/lib/formats/protobuf.cpp @@ -255,7 +255,7 @@ __attribute__((constructor(110))) static void UNIQUE(__ctor)() { p.format.flags = (int) IOFlags::HAS_BINARY_PAYLOAD | (int) SampleFlags::HAS_TS_ORIGIN | (int) SampleFlags::HAS_SEQUENCE | (int) SampleFlags::HAS_DATA; - vlist_push(&plugins, &p); + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) static void UNIQUE(__dtor)() { diff --git a/lib/formats/value.cpp b/lib/formats/value.cpp index c9cb553fa..c6ed3b596 100644 --- a/lib/formats/value.cpp +++ b/lib/formats/value.cpp @@ -94,9 +94,6 @@ out: smp->flags = 0; static struct plugin p; __attribute__((constructor(110))) static void UNIQUE(__ctor)() { - if (plugins.state == State::DESTROYED) - vlist_init(&plugins); - p.name = "value"; p.description = "A bare text value without any headers"; p.type = PluginType::FORMAT; @@ -105,7 +102,7 @@ __attribute__((constructor(110))) static void UNIQUE(__ctor)() { p.format.size = 0; p.format.flags = (int) SampleFlags::HAS_DATA | (int) IOFlags::NEWLINES; - vlist_push(&plugins, &p); + vlist_init_and_push(&plugins, &p);; } __attribute__((destructor(110))) static void UNIQUE(__dtor)() { diff --git a/lib/formats/villas_human.cpp b/lib/formats/villas_human.cpp index 90c3b01d3..10903e19c 100644 --- a/lib/formats/villas_human.cpp +++ b/lib/formats/villas_human.cpp @@ -237,7 +237,7 @@ __attribute__((constructor(110))) static void UNIQUE(__ctor)() { p.format.delimiter = '\n'; p.format.separator = '\t'; - vlist_push(&plugins, &p); + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) static void UNIQUE(__dtor)() { diff --git a/lib/hook.cpp b/lib/hook.cpp index 0c33e42bd..8645bbad0 100644 --- a/lib/hook.cpp +++ b/lib/hook.cpp @@ -60,7 +60,9 @@ Hook::Hook(struct vpath *p, struct vnode *n, int fl, int prio, bool en) : Hook::~Hook() { - signal_list_destroy(&signals); + int ret __attribute__((unused)); + + ret = signal_list_destroy(&signals); } void Hook::prepare() diff --git a/lib/hooks/average.cpp b/lib/hooks/average.cpp index d8e8e9a31..7bdd9e6a6 100644 --- a/lib/hooks/average.cpp +++ b/lib/hooks/average.cpp @@ -59,7 +59,9 @@ public: virtual ~AverageHook() { - vlist_destroy(&signal_names, nullptr, true); + int ret __attribute__((unused)); + + ret = vlist_destroy(&signal_names, nullptr, true); } virtual void prepare() diff --git a/lib/hooks/limit_value.cpp b/lib/hooks/limit_value.cpp index d9fa8297d..c2370c3b1 100644 --- a/lib/hooks/limit_value.cpp +++ b/lib/hooks/limit_value.cpp @@ -61,7 +61,9 @@ public: virtual ~LimitValueHook() { - vlist_destroy(&signal_names, nullptr, true); + int ret __attribute__((unused)); + + ret = vlist_destroy(&signal_names, nullptr, true); } virtual void prepare() diff --git a/lib/kernel/if.cpp b/lib/kernel/if.cpp index b09244020..20b5d0aa8 100644 --- a/lib/kernel/if.cpp +++ b/lib/kernel/if.cpp @@ -44,6 +44,8 @@ using namespace villas::utils; int if_init(struct interface *i, struct rtnl_link *link) { + int ret; + i->nl_link = link; debug(LOG_IF | 3, "Created interface '%s'", if_name(i)); @@ -54,15 +56,21 @@ int if_init(struct interface *i, struct rtnl_link *link) else warning("Did not found any interrupts for interface '%s'", if_name(i)); - vlist_init(&i->nodes); + ret = vlist_init(&i->nodes); + if (ret) + return ret; return 0; } int if_destroy(struct interface *i) { + int ret; + /* List members are freed by the nodes they belong to. */ - vlist_destroy(&i->nodes, nullptr, false); + ret = vlist_destroy(&i->nodes); + if (ret) + return ret; rtnl_qdisc_put(i->tc_qdisc); diff --git a/lib/nodes/amqp.cpp b/lib/nodes/amqp.cpp index cff9cba68..a655664bd 100644 --- a/lib/nodes/amqp.cpp +++ b/lib/nodes/amqp.cpp @@ -413,8 +413,9 @@ static void register_plugin() { p.node.write = amqp_write; p.node.poll_fds = amqp_poll_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/can.cpp b/lib/nodes/can.cpp index 212c9aeb4..38e5837d8 100644 --- a/lib/nodes/can.cpp +++ b/lib/nodes/can.cpp @@ -558,9 +558,6 @@ int can_poll_fds(struct vnode *n, int fds[]) __attribute__((constructor(110))) static void register_plugin() { - if (plugins.state == State::DESTROYED) - vlist_init(&plugins); - p.name = "can"; p.description = "Receive CAN messages using the socketCAN driver"; p.node.instances.state = State::DESTROYED; @@ -578,8 +575,9 @@ static void register_plugin() { p.node.write = can_write; p.node.poll_fds = can_poll_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/comedi.cpp b/lib/nodes/comedi.cpp index d1f2c7147..5bf91a596 100644 --- a/lib/nodes/comedi.cpp +++ b/lib/nodes/comedi.cpp @@ -1013,8 +1013,9 @@ static void register_plugin() { p.node.write = comedi_write; p.node.poll_fds = comedi_poll_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/ethercat.cpp b/lib/nodes/ethercat.cpp index 8a4ca6b1d..10e560d8e 100644 --- a/lib/nodes/ethercat.cpp +++ b/lib/nodes/ethercat.cpp @@ -61,6 +61,7 @@ struct coupler { static void ethercat_cyclic_task(struct vnode *n) { + int ret; struct sample *smp; struct ethercat *w = (struct ethercat *) n->_vd; @@ -89,7 +90,9 @@ static void ethercat_cyclic_task(struct vnode *n) smp->data[i].f = w->in.range * (float) ain_value / INT16_MAX; } - queue_signalled_push(&w->queue, smp); + ret = queue_signalled_push(&w->queue, smp); + if (ret) + warning("Ethercat: Failed to enqueue samples"); /* Write process data */ smp = w->send.exchange(nullptr); @@ -464,8 +467,9 @@ static void register_plugin() { p.node.write = ethercat_write; p.node.poll_fds = ethercat_poll_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/example.cpp b/lib/nodes/example.cpp index a34e2e9e1..108c61b88 100644 --- a/lib/nodes/example.cpp +++ b/lib/nodes/example.cpp @@ -254,8 +254,9 @@ static void register_plugin() { p.node.poll_fds = example_poll_fds; p.node.netem_fds = example_netem_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/exec.cpp b/lib/nodes/exec.cpp index 71028d34b..a2e902f26 100644 --- a/lib/nodes/exec.cpp +++ b/lib/nodes/exec.cpp @@ -285,8 +285,9 @@ static void register_plugin() { p.node.write = exec_write; p.node.poll_fds = exec_poll_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/file.cpp b/lib/nodes/file.cpp index 7275c81e6..bb75e0c95 100644 --- a/lib/nodes/file.cpp +++ b/lib/nodes/file.cpp @@ -513,8 +513,9 @@ static void register_plugin() { p.node.write = file_write; p.node.poll_fds = file_poll_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/fpga.cpp b/lib/nodes/fpga.cpp index 204981af6..11d9c57b7 100644 --- a/lib/nodes/fpga.cpp +++ b/lib/nodes/fpga.cpp @@ -327,9 +327,6 @@ int fpga_poll_fds(struct vnode *n, int fds[]) __attribute__((constructor(110))) static void register_plugin() { - if (plugins.state == State::DESTROYED) - vlist_init(&plugins); - p.name = "fpga"; p.description = "Communicate with VILLASfpga Xilinx FPGA boards"; p.type = PluginType::NODE; @@ -350,8 +347,9 @@ static void register_plugin() { p.node.write = fpga_write; p.node.poll_fds = fpga_poll_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/iec61850.cpp b/lib/nodes/iec61850.cpp index 661c92593..1cc552389 100644 --- a/lib/nodes/iec61850.cpp +++ b/lib/nodes/iec61850.cpp @@ -220,7 +220,9 @@ int iec61850_type_stop() EthernetHandleSet_destroy(hset); - vlist_destroy(&receivers, (dtor_cb_t) iec61850_receiver_destroy, true); + ret = vlist_destroy(&receivers, (dtor_cb_t) iec61850_receiver_destroy, true); + if (ret) + return ret; return 0; } diff --git a/lib/nodes/iec61850_sv.cpp b/lib/nodes/iec61850_sv.cpp index ce0b22692..33abb5412 100644 --- a/lib/nodes/iec61850_sv.cpp +++ b/lib/nodes/iec61850_sv.cpp @@ -134,7 +134,8 @@ static void iec61850_sv_listener(SVSubscriber subscriber, void *ctx, SVSubscribe smp->length++; } - queue_signalled_push(&i->in.queue, smp); + int pushed __attribute__((unused)); + pushed = queue_signalled_push(&i->in.queue, smp); } int iec61850_sv_parse(struct vnode *n, json_t *json) @@ -496,8 +497,9 @@ static void register_plugin() { p.node.write = iec61850_sv_write; p.node.poll_fds = iec61850_sv_poll_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/infiniband.cpp b/lib/nodes/infiniband.cpp index 559f86d86..a97d18c03 100644 --- a/lib/nodes/infiniband.cpp +++ b/lib/nodes/infiniband.cpp @@ -1028,8 +1028,9 @@ static void register_plugin() { p.node.reverse = ib_reverse; p.node.memory_type = memory_ib; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/influxdb.cpp b/lib/nodes/influxdb.cpp index 43dc0a3ae..09a76c627 100644 --- a/lib/nodes/influxdb.cpp +++ b/lib/nodes/influxdb.cpp @@ -228,9 +228,9 @@ static void register_plugin() { p.node.stop = influxdb_close; p.node.write = influxdb_write; - - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/mqtt.cpp b/lib/nodes/mqtt.cpp index 1895a7061..125d6fc2d 100644 --- a/lib/nodes/mqtt.cpp +++ b/lib/nodes/mqtt.cpp @@ -148,7 +148,9 @@ static void mqtt_message_cb(struct mosquitto *mosq, void *userdata, const struct return; } - queue_signalled_push_many(&m->queue, (void **) smps, n->in.vectorize); + ret = queue_signalled_push_many(&m->queue, (void **) smps, n->in.vectorize); + if (ret < (int) n->in.vectorize) + warning("MQTT: Failed to enqueue samples"); } static void mqtt_subscribe_cb(struct mosquitto *mosq, void *userdata, int mid, int qos_count, const int *granted_qos) @@ -416,9 +418,8 @@ int mqtt_type_start(villas::node::SuperNode *sn) int ret; ret = vlist_init(&clients); - if (ret) { - return ret; - } + if (ret) + return ret; ret = mosquitto_lib_init(); if (ret) @@ -426,9 +427,8 @@ int mqtt_type_start(villas::node::SuperNode *sn) // Start thread here to run mosquitto loop for registered clients ret = pthread_create(&thread, nullptr, mosquitto_loop_thread, nullptr); - if (ret) { - return ret; - } + if (ret) + return ret; return 0; @@ -445,23 +445,24 @@ int mqtt_type_stop() // Stop thread here that executes mosquitto loop ret = pthread_cancel(thread); if (ret) - return ret; + return ret; debug( 3, "Called pthread_cancel() on MQTT communication management thread."); ret = pthread_join(thread, nullptr); - if (ret) { - return ret; - } + if (ret) + return ret; ret = mosquitto_lib_cleanup(); if (ret) goto mosquitto_error; // When this is called the list of clients should be empty - if (vlist_length(&clients) > 0) { - error("List of MQTT clients contains elements at time of destruction. Call node_stop for each MQTT node before stopping node type!"); - } - vlist_destroy(&clients, nullptr, false); + if (vlist_length(&clients) > 0) + error("List of MQTT clients contains elements at time of destruction. Call node_stop for each MQTT node before stopping node type!"); + + ret = vlist_destroy(&clients, nullptr, false); + if (ret) + return ret; return 0; @@ -543,8 +544,9 @@ static void register_plugin() { p.node.reverse = mqtt_reverse; p.node.poll_fds = mqtt_poll_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/nanomsg.cpp b/lib/nodes/nanomsg.cpp index 56cb97856..4c6984060 100644 --- a/lib/nodes/nanomsg.cpp +++ b/lib/nodes/nanomsg.cpp @@ -91,8 +91,13 @@ int nanomsg_parse(struct vnode *n, json_t *cfg) json_t *json_out_endpoints = nullptr; json_t *json_in_endpoints = nullptr; - vlist_init(&m->out.endpoints); - vlist_init(&m->in.endpoints); + ret = vlist_init(&m->out.endpoints); + if (ret) + return ret; + + ret = vlist_init(&m->in.endpoints); + if (ret) + return ret; ret = json_unpack_ex(cfg, &err, 0, "{ s?: s, s?: { s?: o }, s?: { s?: o } }", "format", &format, @@ -313,8 +318,9 @@ static void register_plugin() { p.node.poll_fds = nanomsg_poll_fds; p.node.netem_fds = nanomsg_netem_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/ngsi.cpp b/lib/nodes/ngsi.cpp index f72f69e7b..e5eed207f 100644 --- a/lib/nodes/ngsi.cpp +++ b/lib/nodes/ngsi.cpp @@ -868,8 +868,9 @@ static void register_plugin() { p.node.poll_fds = ngsi_poll_fds; p.node.reverse = ngsi_reverse; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/opal.cpp b/lib/nodes/opal.cpp index 12f9f261e..d333da439 100644 --- a/lib/nodes/opal.cpp +++ b/lib/nodes/opal.cpp @@ -328,8 +328,9 @@ static void register_plugin() { p.node.read = opal_read; p.node.write = opal_write; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/rtp.cpp b/lib/nodes/rtp.cpp index 6040f2073..6c2c5d177 100644 --- a/lib/nodes/rtp.cpp +++ b/lib/nodes/rtp.cpp @@ -638,8 +638,9 @@ static void register_plugin() { p.node.poll_fds = rtp_poll_fds; p.node.netem_fds = rtp_netem_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/shmem.cpp b/lib/nodes/shmem.cpp index f39064cfe..948722958 100644 --- a/lib/nodes/shmem.cpp +++ b/lib/nodes/shmem.cpp @@ -218,9 +218,9 @@ static void register_plugin() { p.node.read = shmem_read; p.node.write = shmem_write; - - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/signal_generator.cpp b/lib/nodes/signal_generator.cpp index 4111fccb8..19ec675d2 100644 --- a/lib/nodes/signal_generator.cpp +++ b/lib/nodes/signal_generator.cpp @@ -222,6 +222,8 @@ int signal_generator_parse(struct vnode *n, json_t *cfg) json_array_foreach(json_type, i, json_value) { type_str = json_string_value(json_value); + if (!type_str) + throw ConfigError(json_value, "node-config-node-signal", "Signal type must be a string"); s->type[i] = signal_generator_lookup_type(type_str); } @@ -461,8 +463,9 @@ static void register_plugin() { p.node.read = signal_generator_read; p.node.poll_fds = signal_generator_poll_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/socket.cpp b/lib/nodes/socket.cpp index 4f837b358..47657acbc 100644 --- a/lib/nodes/socket.cpp +++ b/lib/nodes/socket.cpp @@ -589,8 +589,9 @@ static void register_plugin() { p.node.poll_fds = socket_fds; p.node.netem_fds = socket_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/stats.cpp b/lib/nodes/stats.cpp index 11494a1fa..0ad2ea0f8 100644 --- a/lib/nodes/stats.cpp +++ b/lib/nodes/stats.cpp @@ -264,8 +264,9 @@ static void register_plugin() { p.node.read = stats_node_read; p.node.poll_fds = stats_node_poll_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/test_rtt.cpp b/lib/nodes/test_rtt.cpp index 5957c535c..5edb7d057 100644 --- a/lib/nodes/test_rtt.cpp +++ b/lib/nodes/test_rtt.cpp @@ -140,7 +140,9 @@ int test_rtt_parse(struct vnode *n, json_t *cfg) t->cooldown = 0; /* Generate list of test cases */ - vlist_init(&t->cases); + ret = vlist_init(&t->cases); + if (ret) + return ret; ret = json_unpack_ex(cfg, &err, 0, "{ s?: s, s?: s, s?: s, s?: F, s: o }", "prefix", &prefix, @@ -458,8 +460,9 @@ static void register_plugin() { p.node.read = test_rtt_read; p.node.write = test_rtt_write; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/uldaq.cpp b/lib/nodes/uldaq.cpp index 8d1c705ed..b45516627 100644 --- a/lib/nodes/uldaq.cpp +++ b/lib/nodes/uldaq.cpp @@ -661,8 +661,9 @@ static void register_plugin() { p.node.stop = uldaq_stop; p.node.read = uldaq_read; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/nodes/websocket.cpp b/lib/nodes/websocket.cpp index 513afcf97..a4733178c 100644 --- a/lib/nodes/websocket.cpp +++ b/lib/nodes/websocket.cpp @@ -369,7 +369,11 @@ int websocket_protocol_cb(struct lws *wsi, enum lws_callback_reasons reason, voi int websocket_type_start(villas::node::SuperNode *sn) { - vlist_init(&connections); + int ret; + + ret = vlist_init(&connections); + if (ret) + return ret; web = sn->getWeb(); if (web->getState() != State::STARTED) @@ -532,7 +536,9 @@ int websocket_parse(struct vnode *n, json_t *cfg) json_t *json_dest; json_error_t err; - vlist_init(&w->destinations); + ret = vlist_init(&w->destinations); + if (ret) + return ret; ret = json_unpack_ex(cfg, &err, 0, "{ s?: o }", "destinations", &json_dests); if (ret) @@ -626,8 +632,9 @@ __attribute__((constructor(110))) static void UNIQUE(__ctor)() { p.node.write = websocket_write; p.node.poll_fds = websocket_poll_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) static void UNIQUE(__dtor)() { diff --git a/lib/nodes/zeromq.cpp b/lib/nodes/zeromq.cpp index ca9e21413..9bfd7fa3a 100644 --- a/lib/nodes/zeromq.cpp +++ b/lib/nodes/zeromq.cpp @@ -96,6 +96,7 @@ int zeromq_reverse(struct vnode *n) int zeromq_init(struct vnode *n) { + int ret; struct zeromq *z = (struct zeromq *) n->_vd; z->out.bind = 1; @@ -107,8 +108,13 @@ int zeromq_init(struct vnode *n) z->in.pending = 0; z->out.pending = 0; - vlist_init(&z->in.endpoints); - vlist_init(&z->out.endpoints); + ret = vlist_init(&z->in.endpoints); + if (ret) + return ret; + + ret = vlist_init(&z->out.endpoints); + if (ret) + return ret; return 0; } @@ -660,8 +666,9 @@ static void register_plugin() { p.node.poll_fds = zeromq_poll_fds; p.node.netem_fds = zeromq_netem_fds; - vlist_init(&p.node.instances); - vlist_push(&plugins, &p); + int ret = vlist_init(&p.node.instances); + if (!ret) + vlist_init_and_push(&plugins, &p); } __attribute__((destructor(110))) diff --git a/lib/pool.cpp b/lib/pool.cpp index cdc7f39ba..8b1250bd5 100644 --- a/lib/pool.cpp +++ b/lib/pool.cpp @@ -64,7 +64,9 @@ int pool_destroy(struct pool *p) if (p->state == State::DESTROYED) return 0; - queue_destroy(&p->queue); + ret = queue_destroy(&p->queue); + if (ret) + return ret; void *buffer = (char *) p + p->buffer_off; ret = memory_free(buffer); diff --git a/lib/shmem.cpp b/lib/shmem.cpp index 7ed78d1ae..ecf4a3613 100644 --- a/lib/shmem.cpp +++ b/lib/shmem.cpp @@ -164,13 +164,19 @@ retry: fd = shm_open(wname, O_RDWR|O_CREAT|O_EXCL, 0600); int shmem_int_close(struct shmem_int *shm) { + int ret; + atomic_store(&shm->closed, 1); - queue_signalled_close(&shm->write.shared->queue); + ret = queue_signalled_close(&shm->write.shared->queue); + if (ret) + return ret; shm_unlink(shm->write.name); + if (atomic_load(&shm->readers) == 0) munmap(shm->read.base, shm->read.len); + if (atomic_load(&shm->writers) == 0) munmap(shm->write.base, shm->write.len); diff --git a/lib/signal.cpp b/lib/signal.cpp index b00ab1e03..e8012e063 100644 --- a/lib/signal.cpp +++ b/lib/signal.cpp @@ -149,21 +149,27 @@ int signal_decref(struct signal *s) int prev = atomic_fetch_sub(&s->refcnt, 1); /* Did we had the last reference? */ - if (prev == 1) - signal_free(s); + if (prev == 1) { + int ret = signal_free(s); + if (ret) + throw RuntimeError("Failed to release sample"); + } return prev - 1; } struct signal * signal_copy(struct signal *s) { + int ret; struct signal *ns; ns = new struct signal; if (!ns) throw MemoryAllocationError(); - signal_init(ns); + ret = signal_init(ns); + if (!ret) + throw RuntimeError("Failed to initialize signal"); ns->type = s->type; ns->init = s->init; diff --git a/lib/super_node.cpp b/lib/super_node.cpp index 913cd1f45..210ecbce2 100644 --- a/lib/super_node.cpp +++ b/lib/super_node.cpp @@ -64,9 +64,19 @@ SuperNode::SuperNode() : hugepages(DEFAULT_NR_HUGEPAGES), task(CLOCK_REALTIME) { - vlist_init(&nodes); - vlist_init(&paths); - vlist_init(&interfaces); + int ret; + + ret = vlist_init(&nodes); + if (ret) + throw RuntimeError("Failed to initialize list"); + + ret = vlist_init(&paths); + if (ret) + throw RuntimeError("Failed to initialize list"); + + ret = vlist_init(&interfaces); + if (ret) + throw RuntimeError("Failed to initialize list"); #ifdef WITH_NETEM nl_init(); /* Fill link cache */ @@ -236,9 +246,7 @@ void SuperNode::check() for (size_t i = 0; i < vlist_length(&paths); i++) { auto *p = (struct vpath *) vlist_at(&paths, i); - ret = path_check(p); - if (ret) - throw RuntimeError("Invalid configuration for path {}", path_name(p)); + path_check(p); } state = State::CHECKED; @@ -336,7 +344,7 @@ void SuperNode::preparePaths() if (!path_is_enabled(p)) continue; - ret = path_prepare(p); + ret = path_prepare(p, &nodes); if (ret) throw RuntimeError("Failed to prepare path: {}", path_name(p)); } @@ -473,12 +481,14 @@ void SuperNode::run() SuperNode::~SuperNode() { + int ret __attribute__((unused)); + assert(state != State::STARTED); - vlist_destroy(&paths, (dtor_cb_t) path_destroy, true); - vlist_destroy(&nodes, (dtor_cb_t) node_destroy, true); + ret = vlist_destroy(&paths, (dtor_cb_t) path_destroy, true); + ret = vlist_destroy(&nodes, (dtor_cb_t) node_destroy, true); #ifdef WITH_NETEM - vlist_destroy(&interfaces, (dtor_cb_t) if_destroy, true); + ret = vlist_destroy(&interfaces, (dtor_cb_t) if_destroy, true); #endif /* WITH_NETEM */ } diff --git a/src/villas-pipe.cpp b/src/villas-pipe.cpp index d08489002..b78ce8365 100644 --- a/src/villas-pipe.cpp +++ b/src/villas-pipe.cpp @@ -85,7 +85,9 @@ public: ~PipeDirection() { - pool_destroy(&pool); + int ret __attribute__((unused)); + + ret = pool_destroy(&pool); } virtual void run() @@ -164,7 +166,9 @@ public: goto leave; } -leave2: return; +leave2: + logger->info("Send thread stopped"); + return; leave: if (io_eof(io)) { if (limit < 0) { @@ -225,8 +229,11 @@ public: return; -leave: logger->info("Reached receive limit. Terminating..."); -leave2: raise(SIGINT); +leave: + logger->info("Reached receive limit. Terminating..."); +leave2: + logger->info("Receive thread stopped"); + raise(SIGINT); } }; diff --git a/tests/unit/io.cpp b/tests/unit/io.cpp index 58b38379f..0949584e2 100644 --- a/tests/unit/io.cpp +++ b/tests/unit/io.cpp @@ -239,7 +239,8 @@ ParameterizedTest(Param *p, io, lowlevel, .init = init_memory) ret = pool_init(&pool, 2 * p->cnt, SAMPLE_LENGTH(NUM_VALUES)); cr_assert_eq(ret, 0); - vlist_init(&signals); + ret = vlist_init(&signals); + cr_assert_eq(ret, 0); signal_list_generate(&signals, NUM_VALUES, SignalType::FLOAT); ret = sample_alloc_many(&pool, smps, p->cnt); @@ -334,7 +335,8 @@ ParameterizedTest(Param *p, io, highlevel, .init = init_memory) ret = sample_alloc_many(&pool, smpt, p->cnt); cr_assert_eq(ret, p->cnt); - vlist_init(&signals); + ret = vlist_init(&signals); + cr_assert_eq(ret, 0); signal_list_generate(&signals, NUM_VALUES, SignalType::FLOAT); fill_sample_data(&signals, smps, p->cnt); diff --git a/tests/unit/main.cpp b/tests/unit/main.cpp index 40a5f021d..008195229 100644 --- a/tests/unit/main.cpp +++ b/tests/unit/main.cpp @@ -24,5 +24,6 @@ void init_memory() { - memory_init(DEFAULT_NR_HUGEPAGES); + int ret __attribute__((unused)); + ret = memory_init(DEFAULT_NR_HUGEPAGES); }