summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJose Bollo <jose.bollo@iot.bzh>2019-02-06 17:16:09 +0100
committerJosé Bollo <jose.bollo@iot.bzh>2019-02-06 19:54:31 +0100
commit74f381d988cd04707c2044ca2a201ad8bf87a6f3 (patch)
treef4a9a7dc5a3a810072142d8876c4dfa13955086f
parentbc60ee2616f6fa0b9400f38d7808b61f3090c754 (diff)
jobs: Ensure releasing event loop
The internal functions blocking threads for implementing call_sync were not releasing the event loop, leading to deafness of the binder. Include a tuto-4 that reproduce the issue on a binder with the bug and that also shows interesting usages of the binder. Bug-AGL: SPEC-2161 Change-Id: I83ad4d55d721a6046e798a5e06967df4dd5a7284 Signed-off-by: Jose Bollo <jose.bollo@iot.bzh>
-rw-r--r--bindings/tutorial/CMakeLists.txt1
-rw-r--r--bindings/tutorial/tuto-4.c29
-rw-r--r--src/jobs.c3
3 files changed, 32 insertions, 1 deletions
diff --git a/bindings/tutorial/CMakeLists.txt b/bindings/tutorial/CMakeLists.txt
index 2860c8c9..babc4c6c 100644
--- a/bindings/tutorial/CMakeLists.txt
+++ b/bindings/tutorial/CMakeLists.txt
@@ -32,3 +32,4 @@ ENDMACRO(tuto)
tuto(1 c)
tuto(2 c)
tuto(3 cpp)
+tuto(4 c)
diff --git a/bindings/tutorial/tuto-4.c b/bindings/tutorial/tuto-4.c
new file mode 100644
index 00000000..cb909fd0
--- /dev/null
+++ b/bindings/tutorial/tuto-4.c
@@ -0,0 +1,29 @@
+#define AFB_BINDING_VERSION 3
+#include <afb/afb-binding.h>
+
+void hello(afb_req_t req)
+{
+ AFB_REQ_DEBUG(req, "hello world");
+ afb_req_reply(req, NULL, NULL, "hello world");
+}
+
+const afb_verb_t verbs[] = {
+ { .verb="hello", .callback=hello },
+ { .verb=NULL }
+};
+
+
+static int init(afb_api_t api)
+{
+ int rc = afb_api_require_api(api, "hello", 1);
+ if (!rc)
+ rc = afb_api_call_sync(api, "hello", "ping", NULL, NULL, NULL, NULL);
+ return rc;
+}
+
+const afb_binding_t afbBindingExport = {
+ .api = "tuto-4",
+ .verbs = verbs,
+ .init = init
+};
+
diff --git a/src/jobs.c b/src/jobs.c
index 4a88c303..d06d24cf 100644
--- a/src/jobs.c
+++ b/src/jobs.c
@@ -337,7 +337,7 @@ static void evloop_release()
{
struct thread *nh, *ct = current_thread;
- if (evloop.holder == ct) {
+ if (ct && evloop.holder == ct) {
nh = ct->nholder;
evloop.holder = nh;
if (nh)
@@ -397,6 +397,7 @@ static void evloop_acquire()
*/
static void thread_enter(volatile struct thread *me)
{
+ evloop_release();
/* initialize description of itself and link it in the list */
me->tid = pthread_self();
me->stop = 0;