X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-evt.c;h=400f8fbe4c36758286dfd873582e113255c313db;hb=c6fcbec33ab346ee8a658531afb130647c656df7;hp=c0e43200aae4354695aaf4a5126a17a150e6b9b6;hpb=eaf5670e9d10b5d7c066043e7563706cf1e01bd5;p=src%2Fapp-framework-binder.git diff --git a/src/afb-evt.c b/src/afb-evt.c index c0e43200..400f8fbe 100644 --- a/src/afb-evt.c +++ b/src/afb-evt.c @@ -818,7 +818,7 @@ void afb_evt_listener_unref(struct afb_evt_listener *listener) * Makes the 'listener' watching 'evtid' * Returns 0 in case of success or else -1. */ -int afb_evt_watch_add_evtid(struct afb_evt_listener *listener, struct afb_evtid *evtid) +int afb_evt_listener_watch_evt(struct afb_evt_listener *listener, struct afb_evtid *evtid) { struct afb_evt_watch *watch; @@ -870,7 +870,7 @@ found: * Avoids the 'listener' to watch 'evtid' * Returns 0 in case of success or else -1. */ -int afb_evt_watch_sub_evtid(struct afb_evt_listener *listener, struct afb_evtid *evtid) +int afb_evt_listener_unwatch_evt(struct afb_evt_listener *listener, struct afb_evtid *evtid) { struct afb_evt_watch *watch; @@ -894,6 +894,36 @@ int afb_evt_watch_sub_evtid(struct afb_evt_listener *listener, struct afb_evtid return -1; } +/* + * Avoids the 'listener' to watch 'eventid' + * Returns 0 in case of success or else -1. + */ +int afb_evt_listener_unwatch_id(struct afb_evt_listener *listener, uint16_t eventid) +{ + struct afb_evt_watch *watch; + struct afb_evtid *evtid; + + /* search the existing watch */ + pthread_rwlock_wrlock(&listener->rwlock); + watch = listener->watchs; + while(watch != NULL) { + evtid = watch->evtid; + if (evtid->id == eventid) { + if (watch->activity != 0) { + watch->activity--; + if (watch->activity == 0 && listener->itf->remove != NULL) + listener->itf->remove(listener->closure, evtid->fullname, evtid->id); + } + pthread_rwlock_unlock(&listener->rwlock); + return 0; + } + watch = watch->next_by_listener; + } + pthread_rwlock_unlock(&listener->rwlock); + errno = ENOENT; + return -1; +} + #if WITH_AFB_HOOK /* * update the hooks for events @@ -961,7 +991,7 @@ uint16_t afb_evt_event_x2_id(struct afb_event_x2 *eventid) * Makes the 'listener' watching 'eventid' * Returns 0 in case of success or else -1. */ -int afb_evt_event_x2_add_watch(struct afb_evt_listener *listener, struct afb_event_x2 *eventid) +int afb_evt_listener_watch_x2(struct afb_evt_listener *listener, struct afb_event_x2 *eventid) { struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid); @@ -972,14 +1002,14 @@ int afb_evt_event_x2_add_watch(struct afb_evt_listener *listener, struct afb_eve } /* search the existing watch for the listener */ - return afb_evt_watch_add_evtid(listener, evtid); + return afb_evt_listener_watch_evt(listener, evtid); } /* * Avoids the 'listener' to watch 'eventid' * Returns 0 in case of success or else -1. */ -int afb_evt_event_x2_remove_watch(struct afb_evt_listener *listener, struct afb_event_x2 *eventid) +int afb_evt_listener_unwatch_x2(struct afb_evt_listener *listener, struct afb_event_x2 *eventid) { struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid); @@ -990,7 +1020,7 @@ int afb_evt_event_x2_remove_watch(struct afb_evt_listener *listener, struct afb_ } /* search the existing watch */ - return afb_evt_watch_sub_evtid(listener, evtid); + return afb_evt_listener_unwatch_evt(listener, evtid); } int afb_evt_event_x2_push(struct afb_event_x2 *eventid, struct json_object *object)