aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2019-01-05 21:22:20 +0100
committerJosé Bollo <jose.bollo@iot.bzh>2019-01-29 15:16:49 +0100
commit11e5020569efe21957c3079c20ffd5f69f514d7a (patch)
tree74217791aa1c8e2be09c52f8a1e8458e1e7ef9f0
parentc0146077906057bf97688a617870228eaad0cf54 (diff)
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.cpp27
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;
}