1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

hooks: use exceptions for error handling

This commit is contained in:
Steffen Vogel 2019-06-11 18:32:58 +02:00
parent 923ef88fb5
commit 4a8d2bfc2b
4 changed files with 25 additions and 76 deletions

View file

@ -57,9 +57,9 @@ int hook_list_destroy(struct vlist *hs);
* hooks = [ "print" ]
* }
*/
int hook_list_parse(struct vlist *hs, json_t *cfg, int mask, struct path *p, struct node *n);
void hook_list_parse(struct vlist *hs, json_t *cfg, int mask, struct path *p, struct node *n);
int hook_list_prepare(struct vlist *hs, struct vlist *sigs, int mask, struct path *p, struct node *n);
void hook_list_prepare(struct vlist *hs, struct vlist *sigs, int mask, struct path *p, struct node *n);
int hook_list_prepare_signals(struct vlist *hs, struct vlist *signals);
@ -67,10 +67,10 @@ int hook_list_add(struct vlist *hs, int mask, struct path *p, struct node *n);
int hook_list_process(struct vlist *hs, struct sample *smps[], unsigned cnt);
int hook_list_periodic(struct vlist *hs);
void hook_list_periodic(struct vlist *hs);
int hook_list_start(struct vlist *hs);
void hook_list_start(struct vlist *hs);
int hook_list_stop(struct vlist *hs);
void hook_list_stop(struct vlist *hs);
struct vlist * hook_list_get_signals(struct vlist *hs);

View file

@ -58,11 +58,10 @@ int hook_list_destroy(vlist *hs)
return 0;
}
int hook_list_parse(vlist *hs, json_t *cfg, int mask, struct path *o, struct node *n)
void hook_list_parse(vlist *hs, json_t *cfg, int mask, struct path *o, struct node *n)
{
if (!json_is_array(cfg))
//throw ConfigError(cfg, "node-config-hook", "Hooks must be configured as a list of hook objects");
return -1;
throw ConfigError(cfg, "node-config-hook", "Hooks must be configured as a list of hook objects");
size_t i;
json_t *json_hook;
@ -83,19 +82,12 @@ int hook_list_parse(vlist *hs, json_t *cfg, int mask, struct path *o, struct nod
if (!(hf->getFlags() & mask))
throw ConfigError(json_hook, "node-config-hook", "Hook '{}' not allowed here", type);
try {
h = hf->make(o, n);
h->parse(json_hook);
h->check();
}
catch (...) {
return -1;
}
h = hf->make(o, n);
h->parse(json_hook);
h->check();
vlist_push(hs, h);
}
return 0;
}
static int hook_cmp_priority(const Hook *a, const Hook *b)
@ -108,7 +100,7 @@ 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)
void hook_list_prepare(vlist *hs, vlist *sigs, int m, struct path *p, struct node *n)
{
assert(hs->state == STATE_INITIALIZED);
@ -134,16 +126,10 @@ skip_add:
for (size_t i = 0; i < vlist_length(hs); i++) {
Hook *h = (Hook *) vlist_at(hs, i);
try {
h->prepare(sigs);
} catch (...) {
return -1;
}
h->prepare(sigs);
sigs = h->getSignals();
}
return 0;
}
int hook_list_process(vlist *hs, sample *smps[], unsigned cnt)
@ -182,49 +168,31 @@ skip: {}
stop: return processed;
}
int hook_list_periodic(vlist *hs)
void hook_list_periodic(vlist *hs)
{
for (size_t j = 0; j < vlist_length(hs); j++) {
Hook *h = (Hook *) vlist_at(hs, j);
try {
h->periodic();
} catch (...) {
return -1;
}
h->periodic();
}
return 0;
}
int hook_list_start(vlist *hs)
void hook_list_start(vlist *hs)
{
for (size_t i = 0; i < vlist_length(hs); i++) {
Hook *h = (Hook *) vlist_at(hs, i);
try {
h->start();
} catch (...) {
return -1;
}
h->start();
}
return 0;
}
int hook_list_stop(vlist *hs)
void hook_list_stop(vlist *hs)
{
for (size_t i = 0; i < vlist_length(hs); i++) {
Hook *h = (Hook *) vlist_at(hs, i);
try {
h->stop();
} catch (...) {
return -1;
}
h->stop();
}
return 0;
}
vlist * hook_list_get_signals(vlist *hs)

View file

@ -35,13 +35,10 @@ int node_direction_prepare(struct node_direction *nd, struct node *n)
assert(nd->state == STATE_CHECKED);
#ifdef WITH_HOOKS
int ret;
int t = nd->direction == NODE_DIR_OUT ? HOOK_NODE_WRITE : HOOK_NODE_READ;
int m = nd->builtin ? t | HOOK_BUILTIN : 0;
ret = hook_list_prepare(&nd->hooks, &nd->signals, m, nullptr, n);
if (ret)
return ret;
hook_list_prepare(&nd->hooks, &nd->signals, m, nullptr, n);
#endif /* WITH_HOOKS */
nd->state = STATE_PREPARED;
@ -161,9 +158,7 @@ int node_direction_parse(struct node_direction *nd, struct node *n, json_t *cfg)
if (json_hooks) {
int m = nd->direction == NODE_DIR_OUT ? HOOK_NODE_WRITE : HOOK_NODE_READ;
ret = hook_list_parse(&nd->hooks, json_hooks, m, nullptr, n);
if (ret < 0)
return ret;
hook_list_parse(&nd->hooks, json_hooks, m, nullptr, n);
}
#endif /* WITH_HOOKS */
@ -193,11 +188,7 @@ int node_direction_start(struct node_direction *nd, struct node *n)
assert(nd->state == STATE_PREPARED);
#ifdef WITH_HOOKS
int ret;
ret = hook_list_start(&nd->hooks);
if (ret)
return ret;
hook_list_start(&nd->hooks);
#endif /* WITH_HOOKS */
nd->state = STATE_STARTED;
@ -210,11 +201,7 @@ int node_direction_stop(struct node_direction *nd, struct node *n)
assert(nd->state == STATE_STARTED);
#ifdef WITH_HOOKS
int ret;
ret = hook_list_stop(&nd->hooks);
if (ret)
return ret;
hook_list_stop(&nd->hooks);
#endif /* WITH_HOOKS */
nd->state = STATE_STOPPED;

View file

@ -284,9 +284,7 @@ int path_prepare(struct path *p)
int m = p->builtin ? HOOK_PATH | HOOK_BUILTIN : 0;
/* Add internal hooks if they are not already in the list */
ret = hook_list_prepare(&p->hooks, &p->signals, m, p, nullptr);
if (ret)
return ret;
hook_list_prepare(&p->hooks, &p->signals, m, p, nullptr);
#endif /* WITH_HOOKS */
/* Initialize pool */
@ -610,9 +608,7 @@ int path_start(struct path *p)
);
#ifdef WITH_HOOKS
ret = hook_list_start(&p->hooks);
if (ret)
return ret;
hook_list_start(&p->hooks);
#endif /* WITH_HOOKS */
p->last_sequence = 0;
@ -675,9 +671,7 @@ int path_stop(struct path *p)
return ret;
#ifdef WITH_HOOKS
ret = hook_list_stop(&p->hooks);
if (ret)
return ret;
hook_list_stop(&p->hooks);
#endif /* WITH_HOOKS */
sample_decref(p->last_sample);