X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-evt.c;h=960d4137b501c9b7bd7e48809a5043cd6198b480;hb=909893eb96838441b64272a649764367dfd69557;hp=87fce5e279d96b641781a16c11335046d7feb5b4;hpb=043c27c3a8fd323d59e41288b6fd24f0e9bfa9a3;p=src%2Fapp-framework-binder.git diff --git a/src/afb-evt.c b/src/afb-evt.c index 87fce5e2..960d4137 100644 --- a/src/afb-evt.c +++ b/src/afb-evt.c @@ -74,8 +74,10 @@ struct afb_evtid { /* rwlock of the event */ pthread_rwlock_t rwlock; +#if WITH_AFB_HOOK /* hooking */ int hookflags; +#endif /* refcount */ int refcount; @@ -84,7 +86,7 @@ struct afb_evtid { int id; /* fullname of the event */ - char fullname[1]; + char fullname[]; }; /* @@ -117,14 +119,16 @@ static struct afb_event_x2_itf afb_evt_event_x2_itf = { .addref = (void*)afb_evt_evtid_addref }; +#if WITH_AFB_HOOK /* the interface for events */ -static struct afb_event_x2_itf afb_evt_hooked_eventid_itf = { +static struct afb_event_x2_itf afb_evt_hooked_event_x2_itf = { .broadcast = (void*)afb_evt_evtid_hooked_broadcast, .push = (void*)afb_evt_evtid_hooked_push, .unref = (void*)afb_evt_evtid_hooked_unref, .name = (void*)afb_evt_evtid_hooked_name, .addref = (void*)afb_evt_evtid_hooked_addref }; +#endif /* head of the list of listeners */ static pthread_rwlock_t listeners_rwlock = PTHREAD_RWLOCK_INITIALIZER; @@ -162,6 +166,7 @@ static int broadcast(const char *event, struct json_object *obj, int id) return result; } +#if WITH_AFB_HOOK /* * Broadcasts the 'event' of 'id' with its 'obj' * 'obj' is released (like json_object_put) @@ -186,6 +191,7 @@ static int hooked_broadcast(const char *event, struct json_object *obj, int id, return result; } +#endif /* * Broadcasts the event 'evtid' with its 'object' @@ -197,6 +203,7 @@ int afb_evt_evtid_broadcast(struct afb_evtid *evtid, struct json_object *object) return broadcast(evtid->fullname, object, evtid->id); } +#if WITH_AFB_HOOK /* * Broadcasts the event 'evtid' with its 'object' * 'object' is released (like json_object_put) @@ -206,6 +213,7 @@ int afb_evt_evtid_hooked_broadcast(struct afb_evtid *evtid, struct json_object * { return hooked_broadcast(evtid->fullname, object, evtid->id, evtid->hookflags); } +#endif /* * Broadcasts the 'event' with its 'object' @@ -214,7 +222,11 @@ int afb_evt_evtid_hooked_broadcast(struct afb_evtid *evtid, struct json_object * */ int afb_evt_broadcast(const char *event, struct json_object *object) { +#if WITH_AFB_HOOK return hooked_broadcast(event, object, 0, -1); +#else + return broadcast(event, object, 0); +#endif } /* @@ -245,6 +257,7 @@ int afb_evt_evtid_push(struct afb_evtid *evtid, struct json_object *obj) return result; } +#if WITH_AFB_HOOK /* * Pushes the event 'evtid' with 'obj' to its listeners * 'obj' is released (like json_object_put) @@ -274,6 +287,7 @@ int afb_evt_evtid_hooked_push(struct afb_evtid *evtid, struct json_object *obj) json_object_put(obj); return result; } +#endif /* * remove the 'watch' @@ -316,7 +330,7 @@ struct afb_evtid *afb_evt_evtid_create(const char *fullname) /* allocates the event */ len = strlen(fullname); - evtid = malloc(len + sizeof * evtid); + evtid = malloc(len + 1 + sizeof * evtid); if (evtid == NULL) goto error; @@ -342,10 +356,14 @@ struct afb_evtid *afb_evt_evtid_create(const char *fullname) evtid->id = event_id_counter; pthread_rwlock_init(&evtid->rwlock, NULL); evtids = evtid; +#if WITH_AFB_HOOK evtid->hookflags = afb_hook_flags_evt(evtid->fullname); - evtid->eventid.itf = evtid->hookflags ? &afb_evt_hooked_eventid_itf : &afb_evt_event_x2_itf; + evtid->eventid.itf = evtid->hookflags ? &afb_evt_hooked_event_x2_itf : &afb_evt_event_x2_itf; if (evtid->hookflags & afb_hook_flag_evt_create) afb_hook_evt_create(evtid->fullname, evtid->id); +#else + evtid->eventid.itf = &afb_evt_event_x2_itf; +#endif pthread_rwlock_unlock(&events_rwlock); /* returns the event */ @@ -383,6 +401,7 @@ struct afb_evtid *afb_evt_evtid_addref(struct afb_evtid *evtid) return evtid; } +#if WITH_AFB_HOOK /* * increment the reference count of the event 'evtid' */ @@ -392,6 +411,7 @@ struct afb_evtid *afb_evt_evtid_hooked_addref(struct afb_evtid *evtid) afb_hook_evt_addref(evtid->fullname, evtid->id); return afb_evt_evtid_addref(evtid); } +#endif /* * decrement the reference count of the event 'evtid' @@ -435,6 +455,7 @@ void afb_evt_evtid_unref(struct afb_evtid *evtid) } } +#if WITH_AFB_HOOK /* * decrement the reference count of the event 'evtid' * and destroy it when the count reachs zero @@ -445,6 +466,7 @@ void afb_evt_evtid_hooked_unref(struct afb_evtid *evtid) afb_hook_evt_unref(evtid->fullname, evtid->id); afb_evt_evtid_unref(evtid); } +#endif /* * Returns the true name of the 'event' @@ -463,6 +485,7 @@ const char *afb_evt_evtid_name(struct afb_evtid *evtid) return name ? name + 1 : evtid->fullname; } +#if WITH_AFB_HOOK /* * Returns the name associated to the event 'evtid'. */ @@ -473,6 +496,7 @@ const char *afb_evt_evtid_hooked_name(struct afb_evtid *evtid) afb_hook_evt_name(evtid->fullname, evtid->id, result); return result; } +#endif /* * Returns the id of the 'event' @@ -642,6 +666,7 @@ int afb_evt_watch_sub_evtid(struct afb_evt_listener *listener, struct afb_evtid return -1; } +#if WITH_AFB_HOOK /* * update the hooks for events */ @@ -652,10 +677,11 @@ void afb_evt_update_hooks() pthread_rwlock_rdlock(&events_rwlock); for (evtid = evtids ; evtid ; evtid = evtid->next) { evtid->hookflags = afb_hook_flags_evt(evtid->fullname); - evtid->eventid.itf = evtid->hookflags ? &afb_evt_hooked_eventid_itf : &afb_evt_event_x2_itf; + evtid->eventid.itf = evtid->hookflags ? &afb_evt_hooked_event_x2_itf : &afb_evt_event_x2_itf; } pthread_rwlock_unlock(&events_rwlock); } +#endif inline struct afb_evtid *afb_evt_event_x2_to_evtid(struct afb_event_x2 *eventid) { @@ -740,6 +766,7 @@ int afb_evt_event_x2_remove_watch(struct afb_evt_listener *listener, struct afb_ } int afb_evt_event_x2_push(struct afb_event_x2 *eventid, struct json_object *object) +#if WITH_AFB_HOOK { struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid); if (evtid) @@ -747,6 +774,9 @@ int afb_evt_event_x2_push(struct afb_event_x2 *eventid, struct json_object *obje json_object_put(object); return 0; } +#else + __attribute__((alias("afb_evt_event_x2_unhooked_push"))); +#endif int afb_evt_event_x2_unhooked_push(struct afb_event_x2 *eventid, struct json_object *object) { @@ -757,12 +787,18 @@ int afb_evt_event_x2_unhooked_push(struct afb_event_x2 *eventid, struct json_obj return 0; } +#if WITH_LEGACY_BINDING_V1 || WITH_LEGACY_BINDING_V2 struct afb_event_x1 afb_evt_event_from_evtid(struct afb_evtid *evtid) { return evtid - ? (struct afb_event_x1){ .itf = &afb_evt_hooked_eventid_itf, .closure = &evtid->eventid } +#if WITH_AFB_HOOK + ? (struct afb_event_x1){ .itf = &afb_evt_hooked_event_x2_itf, .closure = &evtid->eventid } +#else + ? (struct afb_event_x1){ .itf = &afb_evt_event_x2_itf, .closure = &evtid->eventid } +#endif : (struct afb_event_x1){ .itf = NULL, .closure = NULL }; } +#endif void afb_evt_event_x2_unref(struct afb_event_x2 *eventid) {