diff options
author | José Bollo <jose.bollo@iot.bzh> | 2019-01-05 21:22:20 +0100 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2019-01-29 15:16:49 +0100 |
commit | 11e5020569efe21957c3079c20ffd5f69f514d7a (patch) | |
tree | 74217791aa1c8e2be09c52f8a1e8458e1e7ef9f0 | |
parent | c0146077906057bf97688a617870228eaad0cf54 (diff) |
Improve safety of link to event loophalibut_7.90.0halibut/7.90.07.90.0sandbox/knimitz/rev_19627
Instead of using the default one that depends on the
current thread and that might be shared with other
items, use an explicit new one running in a dedicated
thread.
Bug-AGL: SPEC-2130
Change-Id: Ie609d19157a5dcaf6e5fa3896dc91d88ba5f214a
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-rw-r--r-- | src/libhomescreen.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/src/libhomescreen.cpp b/src/libhomescreen.cpp index 84e3472..121def7 100644 --- a/src/libhomescreen.cpp +++ b/src/libhomescreen.cpp @@ -25,6 +25,7 @@ #include <cstdio> #include <cstdlib> #include <cstring> +#include <thread> #include <libhomescreen.hpp> #include "hmi-debug.h" @@ -87,6 +88,12 @@ static void _on_reply_static(void *closure, struct afb_wsj1_msg *msg) } +static void event_loop_run(struct sd_event* loop){ + sd_event_loop(loop); + sd_event_unref(loop); +} + + /** * constructor */ @@ -99,14 +106,14 @@ LibHomeScreen::LibHomeScreen() */ LibHomeScreen::~LibHomeScreen() { - if(mploop) - { - sd_event_unref(mploop); - } if(sp_websock != NULL) { afb_wsj1_unref(sp_websock); } + if(mploop) + { + sd_event_exit(mploop, 0); + } } /** @@ -177,13 +184,19 @@ int LibHomeScreen::initialize_websocket() mploop = NULL; onEvent = nullptr; onReply = nullptr; - int ret = sd_event_default(&mploop); + int ret = sd_event_new(&mploop); if(ret < 0) { HMI_ERROR("libhomescreen","Failed to create event loop"); goto END; } + { + // enforce context to avoid initialization/goto error + std::thread th(event_loop_run, mploop); + th.detach(); + } + /* Initialize interface from websocket */ minterface.on_hangup = _on_hangup_static; minterface.on_call = _on_call_static; @@ -201,10 +214,6 @@ int LibHomeScreen::initialize_websocket() return 0; END: - if(mploop) - { - sd_event_unref(mploop); - } return -1; } |