From 11e5020569efe21957c3079c20ffd5f69f514d7a Mon Sep 17 00:00:00 2001 From: José Bollo Date: Sat, 5 Jan 2019 21:22:20 +0100 Subject: Improve safety of link to event loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/libhomescreen.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) (limited to 'src/libhomescreen.cpp') 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 #include #include +#include #include #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; } -- cgit 1.2.3-korg