From: José Bollo Date: Sat, 5 Jan 2019 20:22:20 +0000 (+0100) Subject: Improve safety of link to event loop X-Git-Tag: 7.90.0^0 X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?p=src%2Flibhomescreen.git;a=commitdiff_plain;h=11e5020569efe21957c3079c20ffd5f69f514d7a Improve safety of link to event loop 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 --- 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; }