diff options
author | José Bollo <jose.bollo@iot.bzh> | 2019-07-16 14:12:35 +0200 |
---|---|---|
committer | Jose Bollo <jose.bollo@iot.bzh> | 2019-07-18 15:39:52 +0200 |
commit | a445694bda8773cb80566808b5dcb56f033dee58 (patch) | |
tree | e8a38f5e268c4f67b43d53c59cb20b4f234f2b2f | |
parent | c53b1b3433a9fcb0f4f3afe8eca1daf75d43673f (diff) |
afb-evt: Refactor processing of broadcasted events
Solving the bug SPEC-2625 needs to rework the broadcasting
of events. It appeared that the numerical event identifier
passed for broadcast wasn't used by called function except
for hooking. Suppressing it introduces a clear distinction
between the push and the broadcast paths.
The file afb-ws-json1 is changed to avoid casting of
functions.
Bug-AGL: SPEC-2625
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Change-Id: I7dadfb8702457d6af797ec5f542add0a83224e3f
-rw-r--r-- | src/afb-api-dbus.c | 4 | ||||
-rw-r--r-- | src/afb-evt.c | 100 | ||||
-rw-r--r-- | src/afb-evt.h | 2 | ||||
-rw-r--r-- | src/afb-export.c | 14 | ||||
-rw-r--r-- | src/afb-stub-ws.c | 2 | ||||
-rw-r--r-- | src/afb-ws-json1.c | 29 |
6 files changed, 68 insertions, 83 deletions
diff --git a/src/afb-api-dbus.c b/src/afb-api-dbus.c index 17e1eb02..966c9656 100644 --- a/src/afb-api-dbus.c +++ b/src/afb-api-dbus.c @@ -634,7 +634,7 @@ error: static void afb_api_dbus_server_event_add(void *closure, const char *event, int eventid); static void afb_api_dbus_server_event_remove(void *closure, const char *event, int eventid); static void afb_api_dbus_server_event_push(void *closure, const char *event, int eventid, struct json_object *object); -static void afb_api_dbus_server_event_broadcast(void *closure, const char *event, int eventid, struct json_object *object); +static void afb_api_dbus_server_event_broadcast(void *closure, const char *event, struct json_object *object); /* the interface for events broadcasting */ static const struct afb_evt_itf evt_broadcast_itf = { @@ -916,7 +916,7 @@ static void afb_api_dbus_server_event_push(void *closure, const char *event, int json_object_put(object); } -static void afb_api_dbus_server_event_broadcast(void *closure, const char *event, int eventid, struct json_object *object) +static void afb_api_dbus_server_event_broadcast(void *closure, const char *event, struct json_object *object) { int rc; struct api_dbus *api; diff --git a/src/afb-evt.c b/src/afb-evt.c index dcb8743a..ddad5759 100644 --- a/src/afb-evt.c +++ b/src/afb-evt.c @@ -113,9 +113,9 @@ struct afb_evt_watch { }; /* - * structure for job of broadcasting string events + * structure for job of broadcasting events */ -struct job_string +struct job_broadcast { /** object atached to the event */ struct json_object *object; @@ -172,24 +172,24 @@ static int event_id_wrapped = 0; * Create structure for job of broadcasting string 'event' with 'object' * Returns the created structure or NULL if out of memory */ -static struct job_string *make_job_string(const char *event, struct json_object *object) +static struct job_broadcast *make_job_broadcast(const char *event, struct json_object *object) { size_t sz = 1 + strlen(event); - struct job_string *js = malloc(sz + sizeof *js); - if (js) { - js->object = object; - memcpy(js->event, event, sz); + struct job_broadcast *jb = malloc(sz + sizeof *jb); + if (jb) { + jb->object = object; + memcpy(jb->event, event, sz); } - return js; + return jb; } /* - * Destroy structure 'js' for job of broadcasting string events + * Destroy structure 'jb' for job of broadcasting string events */ -static void destroy_job_string(struct job_string *js) +static void destroy_job_broadcast(struct job_broadcast *jb) { - json_object_put(js->object); - free(js); + json_object_put(jb->object); + free(jb); } /* @@ -219,7 +219,7 @@ static void destroy_job_evtid(struct job_evtid *je) /* * Broadcasts the 'event' of 'id' with its 'object' */ -static void broadcast(const char *event, struct json_object *object, int id) +static void broadcast(const char *event, struct json_object *object) { struct afb_evt_listener *listener; @@ -227,7 +227,7 @@ static void broadcast(const char *event, struct json_object *object, int id) listener = listeners; while(listener) { if (listener->itf->broadcast != NULL) - listener->itf->broadcast(listener->closure, event, id, json_object_get(object)); + listener->itf->broadcast(listener->closure, event, json_object_get(object)); listener = listener->next; } pthread_rwlock_unlock(&listeners_rwlock); @@ -236,73 +236,36 @@ static void broadcast(const char *event, struct json_object *object, int id) /* * Jobs callback for broadcasting string asynchronously */ -static void broadcast_job_string(int signum, void *closure) +static void broadcast_job(int signum, void *closure) { - struct job_string *js = closure; + struct job_broadcast *jb = closure; if (signum == 0) - broadcast(js->event, js->object, 0); - destroy_job_string(js); -} - -/* - * Jobs callback for broadcasting evtid asynchronously - */ -static void broadcast_job_evtid(int signum, void *closure) -{ - struct job_evtid *je = closure; - - if (signum == 0) - broadcast(je->evtid->fullname, je->object, je->evtid->id); - destroy_job_evtid(je); + broadcast(jb->event, jb->object); + destroy_job_broadcast(jb); } /* * Broadcasts the string 'event' with its 'object' */ -static int broadcast_string(const char *event, struct json_object *object) +static int unhooked_broadcast(const char *event, struct json_object *object) { - struct job_string *js; + struct job_broadcast *jb; int rc; - js = make_job_string(event, object); - if (js == NULL) { + jb = make_job_broadcast(event, object); + if (jb == NULL) { ERROR("Cant't create broadcast string job item for %s(%s)", event, json_object_to_json_string(object)); json_object_put(object); return -1; } - rc = jobs_queue(BROADCAST_JOB_GROUP, 0, broadcast_job_string, js); + rc = jobs_queue(BROADCAST_JOB_GROUP, 0, broadcast_job, jb); if (rc) { ERROR("cant't queue broadcast string job item for %s(%s)", event, json_object_to_json_string(object)); - destroy_job_string(js); - } - return rc; -} - -/* - * Broadcasts the 'evtid' with its 'object' - */ -static int broadcast_evtid(struct afb_evtid *evtid, struct json_object *object) -{ - struct job_evtid *je; - int rc; - - je = make_job_evtid(evtid, object); - if (je == NULL) { - ERROR("Cant't create broadcast evtid job item for %s(%s)", - evtid->fullname, json_object_to_json_string(object)); - json_object_put(object); - return -1; - } - - rc = jobs_queue(BROADCAST_JOB_GROUP, 0, broadcast_job_evtid, je); - if (rc) { - ERROR("cant't queue broadcast evtid job item for %s(%s)", - evtid->fullname, json_object_to_json_string(object)); - destroy_job_evtid(je); + destroy_job_broadcast(jb); } return rc; } @@ -314,7 +277,7 @@ static int broadcast_evtid(struct afb_evtid *evtid, struct json_object *object) */ int afb_evt_evtid_broadcast(struct afb_evtid *evtid, struct json_object *object) { - return broadcast_evtid(evtid, object); + return unhooked_broadcast(evtid->fullname, object); } /* @@ -331,7 +294,7 @@ int afb_evt_evtid_hooked_broadcast(struct afb_evtid *evtid, struct json_object * if (evtid->hookflags & afb_hook_flag_evt_broadcast_before) afb_hook_evt_broadcast_before(evtid->fullname, evtid->id, object); - result = broadcast_evtid(evtid, object); + result = afb_evt_evtid_broadcast(evtid, object); if (evtid->hookflags & afb_hook_flag_evt_broadcast_after) afb_hook_evt_broadcast_after(evtid->fullname, evtid->id, object, result); @@ -350,14 +313,17 @@ int afb_evt_broadcast(const char *event, struct json_object *object) { int result; +#if WITH_AFB_HOOK json_object_get(object); - afb_hook_evt_broadcast_before(event, 0, object); - result = broadcast_string(event, object); - afb_hook_evt_broadcast_after(event, 0, object, result); +#endif - json_object_put(object); + result = unhooked_broadcast(event, object); +#if WITH_AFB_HOOK + afb_hook_evt_broadcast_after(event, 0, object, result); + json_object_put(object); +#endif return result; } diff --git a/src/afb-evt.h b/src/afb-evt.h index ceb1b1b9..423bd552 100644 --- a/src/afb-evt.h +++ b/src/afb-evt.h @@ -27,7 +27,7 @@ struct afb_evt_listener; struct afb_evt_itf { void (*push)(void *closure, const char *event, int evtid, struct json_object *object); - void (*broadcast)(void *closure, const char *event, int evtid, struct json_object *object); + void (*broadcast)(void *closure, const char *event, struct json_object *object); void (*add)(void *closure, const char *event, int evtid); void (*remove)(void *closure, const char *event, int evtid); }; diff --git a/src/afb-export.c b/src/afb-export.c index a1112d23..de6134d3 100644 --- a/src/afb-export.c +++ b/src/afb-export.c @@ -1178,10 +1178,20 @@ static void listener_of_events(void *closure, const char *event, int eventid, st json_object_put(object); } +static void listener_of_pushed_events(void *closure, const char *event, int eventid, struct json_object *object) +{ + listener_of_events(closure, event, eventid, object); +} + +static void listener_of_broadcasted_events(void *closure, const char *event, struct json_object *object) +{ + listener_of_events(closure, event, 0, object); +} + /* the interface for events */ static const struct afb_evt_itf evt_itf = { - .broadcast = listener_of_events, - .push = listener_of_events + .broadcast = listener_of_broadcasted_events, + .push = listener_of_pushed_events }; /* ensure an existing listener */ diff --git a/src/afb-stub-ws.c b/src/afb-stub-ws.c index f008c418..0c440bd5 100644 --- a/src/afb-stub-ws.c +++ b/src/afb-stub-ws.c @@ -341,7 +341,7 @@ static void server_event_push_cb(void *closure, const char *event, int eventid, json_object_put(object); } -static void server_event_broadcast_cb(void *closure, const char *event, int eventid, struct json_object *object) +static void server_event_broadcast_cb(void *closure, const char *event, struct json_object *object) { struct afb_stub_ws *stubws = closure; diff --git a/src/afb-ws-json1.c b/src/afb-ws-json1.c index 95167b5f..4f5cb868 100644 --- a/src/afb-ws-json1.c +++ b/src/afb-ws-json1.c @@ -43,9 +43,10 @@ struct afb_ws_json1; struct afb_wsreq; /* predeclaration of websocket callbacks */ -static void aws_on_hangup(struct afb_ws_json1 *ws, struct afb_wsj1 *wsj1); -static void aws_on_call(struct afb_ws_json1 *ws, const char *api, const char *verb, struct afb_wsj1_msg *msg); -static void aws_on_event(struct afb_ws_json1 *ws, const char *event, int eventid, struct json_object *object); +static void aws_on_hangup_cb(void *closure, struct afb_wsj1 *wsj1); +static void aws_on_call_cb(void *closure, const char *api, const char *verb, struct afb_wsj1_msg *msg); +static void aws_on_push_cb(void *closure, const char *event, int eventid, struct json_object *object); +static void aws_on_broadcast_cb(void *closure, const char *event, struct json_object *object); /* predeclaration of wsreq callbacks */ static void wsreq_destroy(struct afb_xreq *xreq); @@ -76,8 +77,8 @@ struct afb_wsreq /* interface for afb_ws_json1 / afb_wsj1 */ static struct afb_wsj1_itf wsj1_itf = { - .on_hangup = (void*)aws_on_hangup, - .on_call = (void*)aws_on_call + .on_hangup = aws_on_hangup_cb, + .on_call = aws_on_call_cb }; /* interface for xreq */ @@ -88,8 +89,8 @@ const struct afb_xreq_query_itf afb_ws_json1_xreq_itf = { /* the interface for events */ static const struct afb_evt_itf evt_itf = { - .broadcast = (void*)aws_on_event, - .push = (void*)aws_on_event + .broadcast = aws_on_broadcast_cb, + .push = aws_on_push_cb }; /*************************************************************** @@ -162,13 +163,15 @@ void afb_ws_json1_unref(struct afb_ws_json1 *ws) } } -static void aws_on_hangup(struct afb_ws_json1 *ws, struct afb_wsj1 *wsj1) +static void aws_on_hangup_cb(void *closure, struct afb_wsj1 *wsj1) { + struct afb_ws_json1 *ws = closure; afb_ws_json1_unref(ws); } -static void aws_on_call(struct afb_ws_json1 *ws, const char *api, const char *verb, struct afb_wsj1_msg *msg) +static void aws_on_call_cb(void *closure, const char *api, const char *verb, struct afb_wsj1_msg *msg) { + struct afb_ws_json1 *ws = closure; struct afb_wsreq *wsreq; DEBUG("received websocket request for %s/%s: %s", api, verb, afb_wsj1_msg_object_s(msg)); @@ -204,8 +207,14 @@ static void aws_on_call(struct afb_ws_json1 *ws, const char *api, const char *ve afb_xreq_process(&wsreq->xreq, ws->apiset); } -static void aws_on_event(struct afb_ws_json1 *aws, const char *event, int eventid, struct json_object *object) +static void aws_on_push_cb(void *closure, const char *event, int eventid, struct json_object *object) { + aws_on_broadcast_cb(closure, event, object); +} + +static void aws_on_broadcast_cb(void *closure, const char *event, struct json_object *object) +{ + struct afb_ws_json1 *aws = closure; afb_wsj1_send_event_j(aws->wsj1, event, afb_msg_json_event(event, object)); } |