X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-svc.c;h=7d9f8dcb2c16c1abd5e6110e844ca30218780323;hb=197626868aaf84e9a68e8e7e5397ef1c6883a0f1;hp=97312e6c1c7a2b7de310e96554e205cd4fd4c9bc;hpb=bb5806063c450da26a38e1915f076723d00df260;p=src%2Fapp-framework-binder.git diff --git a/src/afb-svc.c b/src/afb-svc.c index 97312e6c..7d9f8dcb 100644 --- a/src/afb-svc.c +++ b/src/afb-svc.c @@ -57,7 +57,8 @@ struct svc_req /* sync */ struct jobloop *jobloop; struct json_object *result; - int iserror; + int status; + int async; }; /* functions for services */ @@ -81,7 +82,7 @@ static const struct afb_evt_itf evt_itf = { /* functions for requests of services */ static void svcreq_destroy(struct afb_xreq *xreq); -static void svcreq_reply(struct afb_xreq *xreq, int iserror, json_object *obj); +static void svcreq_reply(struct afb_xreq *xreq, int status, json_object *obj); /* interface for requests of services */ const struct afb_xreq_query_itf afb_svc_xreq_itf = { @@ -316,16 +317,17 @@ static void svcreq_sync_leave(struct svc_req *svcreq) } } -static void svcreq_reply(struct afb_xreq *xreq, int iserror, json_object *obj) +static void svcreq_reply(struct afb_xreq *xreq, int status, json_object *obj) { struct svc_req *svcreq = CONTAINER_OF_XREQ(struct svc_req, xreq); - if (svcreq->callback) { + if (svcreq->async) { struct afb_svc *svc = svcreq->svc; - svcreq->callback(svcreq->closure, iserror, obj); - HOOK(call_result, svc, iserror, obj); + if (svcreq->callback) + svcreq->callback(svcreq->closure, status, obj); + HOOK(call_result, svc, status, obj); json_object_put(obj); } else { - svcreq->iserror = iserror; + svcreq->status = status; svcreq->result = obj; svcreq_sync_leave(svcreq); } @@ -340,7 +342,7 @@ static void svcreq_sync_enter(int signum, void *closure, struct jobloop *jobloop afb_xreq_process(&svcreq->xreq, svcreq->svc->apiset); } else { svcreq->result = afb_msg_json_internal_error(); - svcreq->iserror = 1; + svcreq->status = -1; svcreq_sync_leave(svcreq); } } @@ -362,8 +364,9 @@ static void svc_call(void *closure, const char *api, const char *verb, struct js ERROR("out of memory"); json_object_put(args); ierr = afb_msg_json_internal_error(); - callback(cbclosure, 1, ierr); - HOOK(call_result, svc, 1, ierr); + if (callback) + callback(cbclosure, -1, ierr); + HOOK(call_result, svc, -1, ierr); json_object_put(ierr); return; } @@ -372,6 +375,7 @@ static void svc_call(void *closure, const char *api, const char *verb, struct js svcreq->jobloop = NULL; svcreq->callback = callback; svcreq->closure = cbclosure; + svcreq->async = 1; /* terminates and frees ressources if needed */ afb_xreq_process(&svcreq->xreq, svc->apiset); @@ -382,6 +386,7 @@ static int svc_call_sync(void *closure, const char *api, const char *verb, struc { struct afb_svc *svc = closure; struct svc_req *svcreq; + struct json_object *resu; int rc; HOOK(callsync, svc, api, verb, args); @@ -392,21 +397,27 @@ static int svc_call_sync(void *closure, const char *api, const char *verb, struc ERROR("out of memory"); errno = ENOMEM; json_object_put(args); - *result = afb_msg_json_internal_error(); - rc = 0; + resu = afb_msg_json_internal_error(); + rc = -1; } else { /* initialises the request */ svcreq->jobloop = NULL; svcreq->callback = NULL; svcreq->result = NULL; - svcreq->iserror = 1; + svcreq->status = 0; + svcreq->async = 0; afb_xreq_addref(&svcreq->xreq); rc = jobs_enter(NULL, 0, svcreq_sync_enter, svcreq); - rc = rc >= 0 && !svcreq->iserror; - *result = (rc || svcreq->result) ? svcreq->result : afb_msg_json_internal_error(); + if (rc >= 0) + rc = svcreq->status; + resu = (rc >= 0 || svcreq->result) ? svcreq->result : afb_msg_json_internal_error(); afb_xreq_unref(&svcreq->xreq); } - HOOK(callsync_result, svc, rc, *result); + HOOK(callsync_result, svc, rc, resu); + if (result) + *result = resu; + else + json_object_put(resu); return rc; }