From 932d15fdb7e980d2b58f42a07810c0165cc21cd2 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 23 Apr 2019 00:36:06 +0200 Subject: [PATCH] nodes: avoid designated initializers for structs --- lib/hook_list.cpp | 26 +++++++-------- lib/nodes/amqp.cpp | 51 ++++++++++++++++++----------- lib/nodes/comedi.cpp | 47 ++++++++++++++++----------- lib/nodes/file.cpp | 49 +++++++++++++++++----------- lib/nodes/iec61850_sv.cpp | 55 ++++++++++++++++++------------- lib/nodes/infiniband.cpp | 55 ++++++++++++++++++------------- lib/nodes/influxdb.cpp | 44 ++++++++++++++++--------- lib/nodes/loopback.cpp | 49 +++++++++++++++++----------- lib/nodes/mqtt.cpp | 59 ++++++++++++++++++++-------------- lib/nodes/nanomsg.cpp | 55 ++++++++++++++++++------------- lib/nodes/ngsi.cpp | 53 +++++++++++++++++------------- lib/nodes/opal.cpp | 49 +++++++++++++++++----------- lib/nodes/rtp.cpp | 13 +++++--- lib/nodes/shmem.cpp | 46 ++++++++++++++++---------- lib/nodes/signal_generator.cpp | 50 +++++++++++++++++----------- lib/nodes/socket.cpp | 4 +++ lib/nodes/stats.cpp | 21 ++++++------ lib/nodes/test_rtt.cpp | 15 +++++---- lib/nodes/uldaq.cpp | 53 +++++++++++++++++------------- lib/nodes/websocket.cpp | 11 +++---- lib/nodes/zeromq.cpp | 59 ++++++++++++++++++++-------------- 21 files changed, 512 insertions(+), 352 deletions(-) diff --git a/lib/hook_list.cpp b/lib/hook_list.cpp index 5c94f5ca0..638670ba8 100644 --- a/lib/hook_list.cpp +++ b/lib/hook_list.cpp @@ -105,6 +105,11 @@ static int hook_cmp_priority(const Hook *a, const Hook *b) return a->getPriority() - b->getPriority(); } +static int hook_is_enabled(const Hook *h) +{ + return h->isEnabled() ? 0 : -1; +} + int hook_list_prepare(vlist *hs, vlist *sigs, int m, struct path *p, struct node *n) { assert(hs->state == STATE_INITIALIZED); @@ -122,15 +127,15 @@ int hook_list_prepare(vlist *hs, vlist *sigs, int m, struct path *p, struct node } skip_add: + /* Remove filters which are not enabled */ + vlist_filter(hs, (dtor_cb_t) hook_is_enabled); + /* We sort the hooks according to their priority */ vlist_sort(hs, (cmp_cb_t) hook_cmp_priority); for (size_t i = 0; i < vlist_length(hs); i++) { Hook *h = (Hook *) vlist_at(hs, i); - if (!h->isEnabled()) - continue; - try { h->prepare(sigs); } catch (...) { @@ -145,20 +150,17 @@ skip_add: int hook_list_process(vlist *hs, sample *smps[], unsigned cnt) { - unsigned ret, curent, processed = 0; + unsigned ret, current, processed = 0; if (vlist_length(hs) == 0) return cnt; - for (curent = 0; curent < cnt; curent++) { - sample *smp = smps[curent]; + for (current = 0; current < cnt; current++) { + sample *smp = smps[current]; for (size_t i = 0; i < vlist_length(hs); i++) { Hook *h = (Hook *) vlist_at(hs, i); - if (!h->isEnabled()) - continue; - ret = h->process(smp); switch (ret) { case HOOK_ERROR: @@ -187,9 +189,6 @@ int hook_list_periodic(vlist *hs) for (size_t j = 0; j < vlist_length(hs); j++) { Hook *h = (Hook *) vlist_at(hs, j); - if (!h->isEnabled()) - continue; - try { h->periodic(); } catch (...) { @@ -205,9 +204,6 @@ int hook_list_start(vlist *hs) for (size_t i = 0; i < vlist_length(hs); i++) { Hook *h = (Hook *) vlist_at(hs, i); - if (!h->isEnabled()) - continue; - try { h->start(); } catch (...) { diff --git a/lib/nodes/amqp.cpp b/lib/nodes/amqp.cpp index 6bc3c35e4..738771fb9 100644 --- a/lib/nodes/amqp.cpp +++ b/lib/nodes/amqp.cpp @@ -392,23 +392,36 @@ int amqp_destroy(struct node *n) return 0; } -static struct plugin p = { - .name = "amqp", - .description = "Advanced Message Queueing Protoocl (rabbitmq-c)", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 0, - .size = sizeof(struct amqp), - .destroy = amqp_destroy, - .parse = amqp_parse, - .print = amqp_print, - .start = amqp_start, - .stop = amqp_stop, - .read = amqp_read, - .write = amqp_write, - .poll_fds = amqp_poll_fds - } -}; +static struct plugin p; + +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "amqp"; + p.description = "Advanced Message Queueing Protoocl (rabbitmq-c)"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 0; + p.node.size = sizeof(struct amqp); + p.node.destroy = amqp_destroy; + p.node.parse = amqp_parse; + p.node.print = amqp_print; + p.node.start = amqp_start; + p.node.stop = amqp_stop; + p.node.read = amqp_read; + p.node.write = amqp_write; + p.node.poll_fds = amqp_poll_fds; + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} + -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) diff --git a/lib/nodes/comedi.cpp b/lib/nodes/comedi.cpp index aa52745eb..b4855e3e6 100644 --- a/lib/nodes/comedi.cpp +++ b/lib/nodes/comedi.cpp @@ -986,22 +986,33 @@ int comedi_poll_fds(struct node *n, int fds[]) return 0; } -static struct plugin p = { - .name = "comedi", - .description = "Comedi-compatible DAQ/ADC cards", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 0, - .size = sizeof(struct comedi), - .parse = comedi_parse, - .print = comedi_print, - .start = comedi_start, - .stop = comedi_stop, - .read = comedi_read, - .write = comedi_write, - .poll_fds = comedi_poll_fds - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "comedi"; + p.description = "Comedi-compatible DAQ/ADC cards"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 0; + p.node.size = sizeof(struct comedi); + p.node.parse = comedi_parse; + p.node.print = comedi_print; + p.node.start = comedi_start; + p.node.stop = comedi_stop; + p.node.read = comedi_read; + p.node.write = comedi_write; + p.node.poll_fds = comedi_poll_fds; + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} \ No newline at end of file diff --git a/lib/nodes/file.cpp b/lib/nodes/file.cpp index 2cf02c521..21c4e70ce 100644 --- a/lib/nodes/file.cpp +++ b/lib/nodes/file.cpp @@ -472,23 +472,34 @@ int file_poll_fds(struct node *n, int fds[]) return -1; /** @todo not supported yet */ } -static struct plugin p = { - .name = "file", - .description = "support for file log / replay node type", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 1, - .size = sizeof(struct file), - .parse = file_parse, - .print = file_print, - .start = file_start, - .restart = file_restart, - .stop = file_stop, - .read = file_read, - .write = file_write, - .poll_fds = file_poll_fds - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "file"; + p.description = "support for file log / replay node type"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 1; + p.node.size = sizeof(struct file); + p.node.parse = file_parse; + p.node.print = file_print; + p.node.start = file_start; + p.node.restart = file_restart; + p.node.stop = file_stop; + p.node.read = file_read; + p.node.write = file_write; + p.node.poll_fds = file_poll_fds; + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} diff --git a/lib/nodes/iec61850_sv.cpp b/lib/nodes/iec61850_sv.cpp index f13379b6f..c8c634039 100644 --- a/lib/nodes/iec61850_sv.cpp +++ b/lib/nodes/iec61850_sv.cpp @@ -473,29 +473,38 @@ int iec61850_sv_poll_fds(struct node *n, int fds[]) return 1; } -static struct plugin p = { - .name = "iec61850-9-2", - .description = "IEC 61850-9-2 (Sampled Values)", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 0, - .size = sizeof(struct iec61850_sv), - .type = { - .start = iec61850_type_start, - .stop = iec61850_type_stop - }, - .destroy = iec61850_sv_destroy, - .parse = iec61850_sv_parse, - .print = iec61850_sv_print, - .start = iec61850_sv_start, - .stop = iec61850_sv_stop, - .read = iec61850_sv_read, - .write = iec61850_sv_write, - .poll_fds = iec61850_sv_poll_fds - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "iec61850-9-2"; + p.description = "IEC 61850-9-2 (Sampled Values)"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 0; + p.node.size = sizeof(struct iec61850_sv); + p.node.type.start = iec61850_type_start; + p.node.type.stop = iec61850_type_stop; + p.node.destroy = iec61850_sv_destroy; + p.node.parse = iec61850_sv_parse; + p.node.print = iec61850_sv_print; + p.node.start = iec61850_sv_start; + p.node.stop = iec61850_sv_stop; + p.node.read = iec61850_sv_read; + p.node.write = iec61850_sv_write; + p.node.poll_fds = iec61850_sv_poll_fds; + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} #endif /* CONFIG_IEC61850_SAMPLED_VALUES_SUPPORT */ diff --git a/lib/nodes/infiniband.cpp b/lib/nodes/infiniband.cpp index c1872815d..78ef79cc2 100644 --- a/lib/nodes/infiniband.cpp +++ b/lib/nodes/infiniband.cpp @@ -999,26 +999,37 @@ int ib_write(struct node *n, struct sample *smps[], unsigned cnt, unsigned *rele return sent; } -static struct plugin p = { - .name = "infiniband", - .description = "Infiniband interface (libibverbs, librdmacm)", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 0, - .size = sizeof(struct infiniband), - .pool_size = 8192, - .destroy = ib_destroy, - .parse = ib_parse, - .check = ib_check, - .print = ib_print, - .start = ib_start, - .stop = ib_stop, - .read = ib_read, - .write = ib_write, - .reverse = ib_reverse, - .memory_type = memory_ib - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "infiniband"; + p.description = "Infiniband interface (libibverbs, librdmacm)"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 0; + p.node.size = sizeof(struct infiniband); + p.node.pool_size = 8192; + p.node.destroy = ib_destroy; + p.node.parse = ib_parse; + p.node.check = ib_check; + p.node.print = ib_print; + p.node.start = ib_start; + p.node.stop = ib_stop; + p.node.read = ib_read; + p.node.write = ib_write; + p.node.reverse = ib_reverse; + p.node.memory_type = memory_ib; + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} \ No newline at end of file diff --git a/lib/nodes/influxdb.cpp b/lib/nodes/influxdb.cpp index 2b34f9534..0a1024b83 100644 --- a/lib/nodes/influxdb.cpp +++ b/lib/nodes/influxdb.cpp @@ -198,20 +198,32 @@ char * influxdb_print(struct node *n) return buf; } -static struct plugin p = { - .name = "influxdb", - .description = "Write results to InfluxDB", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 0, - .size = sizeof(struct influxdb), - .parse = influxdb_parse, - .print = influxdb_print, - .start = influxdb_open, - .stop = influxdb_close, - .write = influxdb_write, - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "influxdb"; + p.description = "Write results to InfluxDB"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 0; + p.node.size = sizeof(struct influxdb); + p.node.parse = influxdb_parse; + p.node.print = influxdb_print; + p.node.start = influxdb_open; + p.node.stop = influxdb_close; + p.node.write = influxdb_write; + + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} \ No newline at end of file diff --git a/lib/nodes/loopback.cpp b/lib/nodes/loopback.cpp index 9e97bc6aa..22e438dc8 100644 --- a/lib/nodes/loopback.cpp +++ b/lib/nodes/loopback.cpp @@ -150,23 +150,34 @@ int loopback_poll_fds(struct node *n, int fds[]) return 1; } -static struct plugin p = { - .name = "loopback", - .description = "Loopback to connect multiple paths", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 0, - .flags = NODE_TYPE_PROVIDES_SIGNALS, - .size = sizeof(struct loopback), - .parse = loopback_parse, - .print = loopback_print, - .start = loopback_start, - .stop = loopback_stop, - .read = loopback_read, - .write = loopback_write, - .poll_fds = loopback_poll_fds - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "loopback"; + p.description = "Loopback to connect multiple paths"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 0; + p.node.flags = NODE_TYPE_PROVIDES_SIGNALS; + p.node.size = sizeof(struct loopback); + p.node.parse = loopback_parse; + p.node.print = loopback_print; + p.node.start = loopback_start; + p.node.stop = loopback_stop; + p.node.read = loopback_read; + p.node.write = loopback_write; + p.node.poll_fds = loopback_poll_fds; + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} \ No newline at end of file diff --git a/lib/nodes/mqtt.cpp b/lib/nodes/mqtt.cpp index 0e901872a..1ca39d196 100644 --- a/lib/nodes/mqtt.cpp +++ b/lib/nodes/mqtt.cpp @@ -447,29 +447,38 @@ int mqtt_poll_fds(struct node *n, int fds[]) return 1; } -static struct plugin p = { - .name = "mqtt", - .description = "Message Queuing Telemetry Transport (libmosquitto)", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 0, - .size = sizeof(struct mqtt), - .type ={ - .start = mqtt_type_start, - .stop = mqtt_type_stop - }, - .destroy = mqtt_destroy, - .parse = mqtt_parse, - .check = mqtt_check, - .print = mqtt_print, - .start = mqtt_start, - .stop = mqtt_stop, - .read = mqtt_read, - .write = mqtt_write, - .reverse = mqtt_reverse, - .poll_fds = mqtt_poll_fds - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "mqtt"; + p.description = "Message Queuing Telemetry Transport (libmosquitto)"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 0; + p.node.size = sizeof(struct mqtt); + p.node.type.start = mqtt_type_start; + p.node.type.stop = mqtt_type_stop; + p.node.destroy = mqtt_destroy; + p.node.parse = mqtt_parse; + p.node.check = mqtt_check; + p.node.print = mqtt_print; + p.node.start = mqtt_start; + p.node.stop = mqtt_stop; + p.node.read = mqtt_read; + p.node.write = mqtt_write; + p.node.reverse = mqtt_reverse; + p.node.poll_fds = mqtt_poll_fds; + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} diff --git a/lib/nodes/nanomsg.cpp b/lib/nodes/nanomsg.cpp index 5d38d0d4b..6130addde 100644 --- a/lib/nodes/nanomsg.cpp +++ b/lib/nodes/nanomsg.cpp @@ -290,27 +290,36 @@ int nanomsg_netem_fds(struct node *n, int fds[]) return 1; } -static struct plugin p = { - .name = "nanomsg", - .description = "scalability protocols library (libnanomsg)", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 0, - .size = sizeof(struct nanomsg), - .type = { - .stop = nanomsg_type_stop - }, - .parse = nanomsg_parse, - .print = nanomsg_print, - .start = nanomsg_start, - .stop = nanomsg_stop, - .read = nanomsg_read, - .write = nanomsg_write, - .reverse = nanomsg_reverse, - .poll_fds = nanomsg_poll_fds, - .netem_fds = nanomsg_netem_fds - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "nanomsg"; + p.description = "scalability protocols library (libnanomsg)"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 0; + p.node.size = sizeof(struct nanomsg); + p.node.type.stop = nanomsg_type_stop; + p.node.parse = nanomsg_parse; + p.node.print = nanomsg_print; + p.node.start = nanomsg_start; + p.node.stop = nanomsg_stop; + p.node.read = nanomsg_read; + p.node.write = nanomsg_write; + p.node.reverse = nanomsg_reverse; + p.node.poll_fds = nanomsg_poll_fds; + p.node.netem_fds = nanomsg_netem_fds; + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} \ No newline at end of file diff --git a/lib/nodes/ngsi.cpp b/lib/nodes/ngsi.cpp index de68ec6ba..1f8e46ab5 100644 --- a/lib/nodes/ngsi.cpp +++ b/lib/nodes/ngsi.cpp @@ -585,26 +585,35 @@ int ngsi_poll_fds(struct node *n, int fds[]) return 1; } -static struct plugin p = { - .name = "ngsi", - .description = "OMA Next Generation Services Interface 10 (libcurl, libjansson)", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 0, /* unlimited */ - .size = sizeof(struct ngsi), - .type = { - .start = ngsi_type_start, - .stop = ngsi_type_stop - }, - .parse = ngsi_parse, - .print = ngsi_print, - .start = ngsi_start, - .stop = ngsi_stop, - .read = ngsi_read, - .write = ngsi_write, - .poll_fds = ngsi_poll_fds - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "ngsi"; + p.description = "OMA Next Generation Services Interface 10 (libcurl, libjansson)"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 0, /* unlimited */ + p.node.size = sizeof(struct ngsi); + p.node.type.start = ngsi_type_start; + p.node.type.stop = ngsi_type_stop; + p.node.parse = ngsi_parse; + p.node.print = ngsi_print; + p.node.start = ngsi_start; + p.node.stop = ngsi_stop; + p.node.read = ngsi_read; + p.node.write = ngsi_write; + p.node.poll_fds = ngsi_poll_fds; + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} \ No newline at end of file diff --git a/lib/nodes/opal.cpp b/lib/nodes/opal.cpp index c146c5ad4..afd69a412 100644 --- a/lib/nodes/opal.cpp +++ b/lib/nodes/opal.cpp @@ -303,23 +303,34 @@ int opal_write(struct node *n, struct pool *pool, unsigned cnt) return 1; } -static struct plugin p = { - .name = "opal", - .description = "run as OPAL Asynchronous Process (libOpalAsyncApi)", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectoroize = 1, - .size = sizeof(struct opal), - .type.start = opal_type_start, - .type.stop = opal_type_stop, - .parse = opal_parse, - .print = opal_print, - .start = opal_start, - .stop = opal_stop, - .read = opal_read, - .write = opal_write - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "opal"; + p.description = "run as OPAL Asynchronous Process (libOpalAsyncApi)"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectoroize = 1; + p.node.size = sizeof(struct opal); + p.node.type.start = opal_type_start; + p.node.type.stop = opal_type_stop; + p.node.parse = opal_parse; + p.node.print = opal_print; + p.node.start = opal_start; + p.node.stop = opal_stop; + p.node.read = opal_read; + p.node.write = opal_write; + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} \ No newline at end of file diff --git a/lib/nodes/rtp.cpp b/lib/nodes/rtp.cpp index a0df2f0da..c456f50e8 100644 --- a/lib/nodes/rtp.cpp +++ b/lib/nodes/rtp.cpp @@ -607,14 +607,17 @@ int rtp_netem_fds(struct node *n, int fds[]) __attribute__((constructor(110))) static void register_plugin() { - p.name = "rtp"; + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "rtp"; #ifdef WITH_NETEM - p.description = "real-time transport protocol (libre, libnl3 netem support)"; + p.description = "real-time transport protocol (libre, libnl3 netem support)"; #else - p.description = "real-time transport protocol (libre)"; + p.description = "real-time transport protocol (libre)"; #endif - p.type = PLUGIN_TYPE_NODE; - p.node.instances.state = STATE_DESTROYED; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; p.node.vectorize = 0; p.node.size = sizeof(struct rtp); p.node.type.start = rtp_type_start; diff --git a/lib/nodes/shmem.cpp b/lib/nodes/shmem.cpp index 38dfdd46a..14b0407f1 100644 --- a/lib/nodes/shmem.cpp +++ b/lib/nodes/shmem.cpp @@ -195,21 +195,33 @@ char * shmem_print(struct node *n) return buf; } -static struct plugin p = { - .name = "shmem", - .description = "POSIX shared memory interface with external processes", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 0, - .size = sizeof(struct shmem), - .parse = shmem_parse, - .print = shmem_print, - .start = shmem_start, - .stop = shmem_stop, - .read = shmem_read, - .write = shmem_write - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "shmem"; + p.description = "POSIX shared memory interface with external processes"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 0; + p.node.size = sizeof(struct shmem); + p.node.parse = shmem_parse; + p.node.print = shmem_print; + p.node.start = shmem_start; + p.node.stop = shmem_stop; + p.node.read = shmem_read; + p.node.write = shmem_write; + + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} \ No newline at end of file diff --git a/lib/nodes/signal_generator.cpp b/lib/nodes/signal_generator.cpp index eaea26d58..d1ecd9cc5 100644 --- a/lib/nodes/signal_generator.cpp +++ b/lib/nodes/signal_generator.cpp @@ -300,23 +300,35 @@ int signal_generator_poll_fds(struct node *n, int fds[]) return 1; } -static struct plugin p = { - .name = "signal", - .description = "Signal generator", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 1, - .flags = NODE_TYPE_PROVIDES_SIGNALS, - .size = sizeof(struct signal_generator), - .parse = signal_generator_parse, - .prepare = signal_generator_prepare, - .print = signal_generator_print, - .start = signal_generator_start, - .stop = signal_generator_stop, - .read = signal_generator_read, - .poll_fds = signal_generator_poll_fds - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "signal"; + p.description = "Signal generator"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 1; + p.node.flags = NODE_TYPE_PROVIDES_SIGNALS; + p.node.size = sizeof(struct signal_generator); + p.node.parse = signal_generator_parse; + p.node.prepare = signal_generator_prepare; + p.node.print = signal_generator_print; + p.node.start = signal_generator_start; + p.node.stop = signal_generator_stop; + p.node.read = signal_generator_read; + p.node.poll_fds = signal_generator_poll_fds; + + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} \ No newline at end of file diff --git a/lib/nodes/socket.cpp b/lib/nodes/socket.cpp index 96e38c331..34020aeff 100644 --- a/lib/nodes/socket.cpp +++ b/lib/nodes/socket.cpp @@ -559,6 +559,9 @@ int socket_fds(struct node *n, int fds[]) __attribute__((constructor(110))) static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + p.name = "socket"; #ifdef WITH_NETEM p.description = "BSD network sockets for Ethernet / IP / UDP (libnl3, netem support)"; @@ -566,6 +569,7 @@ static void register_plugin() { p.description = "BSD network sockets for Ethernet / IP / UDP"; #endif p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; p.node.vectorize = 0; p.node.size = sizeof(struct socket); p.node.type.start = socket_type_start; diff --git a/lib/nodes/stats.cpp b/lib/nodes/stats.cpp index f1640bdb4..3e5b6ef34 100644 --- a/lib/nodes/stats.cpp +++ b/lib/nodes/stats.cpp @@ -20,10 +20,6 @@ * along with this program. If not, see . *********************************************************************************/ -/** @addtogroup hooks Hook functions - * @{ - */ - #include #include @@ -257,22 +253,25 @@ static struct plugin p; __attribute__((constructor(110))) static void register_plugin() { - p.name = "stats"; - p.description = "Send statistics to another node"; - p.type = PLUGIN_TYPE_NODE; - p.node.instances.state = STATE_DESTROYED; + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "stats"; + p.description = "Send statistics to another node"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; p.node.vectorize = 1; p.node.flags = 0; p.node.size = sizeof(struct stats_node); p.node.type.start = stats_node_type_start; p.node.parse = stats_node_parse; p.node.init = stats_node_init; - p.node.destroy = stats_node_destroy; + p.node.destroy = stats_node_destroy; p.node.print = stats_node_print; p.node.start = stats_node_start; p.node.stop = stats_node_stop; p.node.read = stats_node_read; - p.node.poll_fds = stats_node_poll_fds; + p.node.poll_fds = stats_node_poll_fds; vlist_init(&p.node.instances); vlist_push(&plugins, &p); @@ -283,5 +282,3 @@ static void deregister_plugin() { if (plugins.state != STATE_DESTROYED) vlist_remove_all(&plugins, &p); } - -/** @} */ diff --git a/lib/nodes/test_rtt.cpp b/lib/nodes/test_rtt.cpp index 5d7dc9078..e815a1382 100644 --- a/lib/nodes/test_rtt.cpp +++ b/lib/nodes/test_rtt.cpp @@ -435,16 +435,19 @@ int test_rtt_poll_fds(struct node *n, int fds[]) __attribute__((constructor(110))) static void register_plugin() { - p.name = "test_rtt"; - p.description = "Test round-trip time with loopback"; - p.type = PLUGIN_TYPE_NODE; - p.node.instances.state = STATE_DESTROYED; + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "test_rtt"; + p.description = "Test round-trip time with loopback"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; p.node.vectorize = 0; p.node.flags = NODE_TYPE_PROVIDES_SIGNALS; p.node.size = sizeof(struct test_rtt); p.node.parse = test_rtt_parse; - p.node.prepare = test_rtt_prepare; - p.node.destroy = test_rtt_destroy; + p.node.prepare = test_rtt_prepare; + p.node.destroy = test_rtt_destroy; p.node.print = test_rtt_print; p.node.start = test_rtt_start; p.node.stop = test_rtt_stop; diff --git a/lib/nodes/uldaq.cpp b/lib/nodes/uldaq.cpp index 69838b1d6..273aedfe5 100644 --- a/lib/nodes/uldaq.cpp +++ b/lib/nodes/uldaq.cpp @@ -634,26 +634,35 @@ int uldaq_read(struct node *n, struct sample *smps[], unsigned cnt, unsigned *re return cnt; } -static struct plugin p = { - .name = "uldaq", - .description = "Measurement Computing DAQ devices like UL201 (libuldaq)", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 0, - .flags = 0, - .size = sizeof(struct uldaq), - .type = { - .start = uldaq_type_start - }, - .init = uldaq_init, - .destroy = uldaq_destroy, - .parse = uldaq_parse, - .print = uldaq_print, - .start = uldaq_start, - .stop = uldaq_stop, - .read = uldaq_read - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "uldaq"; + p.description = "Measurement Computing DAQ devices like UL201 (libuldaq)"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 0; + p.node.flags = 0; + p.node.size = sizeof(struct uldaq); + p.node.type.start = uldaq_type_start; + p.node.init = uldaq_init; + p.node.destroy = uldaq_destroy; + p.node.parse = uldaq_parse; + p.node.print = uldaq_print; + p.node.start = uldaq_start; + p.node.stop = uldaq_stop; + p.node.read = uldaq_read; + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} \ No newline at end of file diff --git a/lib/nodes/websocket.cpp b/lib/nodes/websocket.cpp index 850693511..0a7bb7b24 100644 --- a/lib/nodes/websocket.cpp +++ b/lib/nodes/websocket.cpp @@ -610,12 +610,12 @@ int websocket_poll_fds(struct node *n, int fds[]) } __attribute__((constructor(110))) static void UNIQUE(__ctor)() { - if (plugins.state == STATE_DESTROYED) - vlist_init(&plugins); + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); - p.name = "websocket"; - p.description = "Send and receive samples of a WebSocket connection (libwebsockets)"; - p.type = PLUGIN_TYPE_NODE; + p.name = "websocket"; + p.description = "Send and receive samples of a WebSocket connection (libwebsockets)"; + p.type = PLUGIN_TYPE_NODE; p.node.vectorize = 0; /* unlimited */ p.node.size = sizeof(struct websocket); p.node.instances.state = STATE_DESTROYED; @@ -630,7 +630,6 @@ __attribute__((constructor(110))) static void UNIQUE(__ctor)() { p.node.poll_fds = websocket_poll_fds; vlist_init(&p.node.instances); - vlist_push(&plugins, &p); } diff --git a/lib/nodes/zeromq.cpp b/lib/nodes/zeromq.cpp index c9d8c494a..529a489ef 100644 --- a/lib/nodes/zeromq.cpp +++ b/lib/nodes/zeromq.cpp @@ -564,29 +564,38 @@ int zeromq_netem_fds(struct node *n, int fds[]) return 1; } -static struct plugin p = { - .name = "zeromq", - .description = "ZeroMQ Distributed Messaging (libzmq)", - .type = PLUGIN_TYPE_NODE, - .node = { - .vectorize = 0, - .size = sizeof(struct zeromq), - .type = { - .start = zeromq_type_start, - .stop = zeromq_type_stop, - }, - .destroy = zeromq_destroy, - .parse = zeromq_parse, - .print = zeromq_print, - .start = zeromq_start, - .stop = zeromq_stop, - .read = zeromq_read, - .write = zeromq_write, - .reverse = zeromq_reverse, - .poll_fds = zeromq_poll_fds, - .netem_fds = zeromq_netem_fds, - } -}; +static struct plugin p; -REGISTER_PLUGIN(&p) -LIST_INIT_STATIC(&p.node.instances) +__attribute__((constructor(110))) +static void register_plugin() { + if (plugins.state == STATE_DESTROYED) + vlist_init(&plugins); + + p.name = "zeromq"; + p.description = "ZeroMQ Distributed Messaging (libzmq)"; + p.type = PLUGIN_TYPE_NODE; + p.node.instances.state = STATE_DESTROYED; + p.node.vectorize = 0; + p.node.size = sizeof(struct zeromq); + p.node.type.start = zeromq_type_start; + p.node.type.stop = zeromq_type_stop; + p.node.destroy = zeromq_destroy; + p.node.parse = zeromq_parse; + p.node.print = zeromq_print; + p.node.start = zeromq_start; + p.node.stop = zeromq_stop; + p.node.read = zeromq_read; + p.node.write = zeromq_write; + p.node.reverse = zeromq_reverse; + p.node.poll_fds = zeromq_poll_fds; + p.node.netem_fds = zeromq_netem_fds; + + vlist_init(&p.node.instances); + vlist_push(&plugins, &p); +} + +__attribute__((destructor(110))) +static void deregister_plugin() { + if (plugins.state != STATE_DESTROYED) + vlist_remove_all(&plugins, &p); +} \ No newline at end of file