diff options
author | José Bollo <jose.bollo@iot.bzh> | 2019-01-05 21:22:20 +0100 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2019-02-07 12:18:35 +0000 |
commit | d01f3c61041ff7b8d2d942f99680407ee10320bc (patch) | |
tree | 8faf022de012e0ed920ae63f91acd95c81588700 | |
parent | b73d090030c68af2e875e5997b926954c18548d4 (diff) |
Improve safety of link to event loopguppy_7.0.4guppy_7.0.3guppy_7.0.2guppy_7.0.1guppy_7.0.0guppy_6.99.5guppy/7.0.4guppy/7.0.3guppy/7.0.2guppy/7.0.1guppy/7.0.0guppy/6.99.57.0.47.0.37.0.27.0.17.0.06.99.5guppy
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>
(cherry picked from commit 11e5020569efe21957c3079c20ffd5f69f514d7a)
-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; } |