X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-evt.c;h=9937c1a681387a7b9ba9ffc6cf38a625eb96aeb1;hb=0891ef4826e347d5554c630b5c0ce73c68f76c9c;hp=2bac0837923782a99e6b8275c331fdbc39fca0cc;hpb=bb73f5b6fb216b4badb94767558e83e60cf08fd0;p=src%2Fapp-framework-binder.git diff --git a/src/afb-evt.c b/src/afb-evt.c index 2bac0837..9937c1a6 100644 --- a/src/afb-evt.c +++ b/src/afb-evt.c @@ -1,6 +1,5 @@ /* * Copyright (C) 2015, 2016, 2017 "IoT.bzh" - * Author "Fulup Ar Foll" * Author José Bollo * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,7 +24,8 @@ #include #include -#include +#include +#include #include "afb-evt.h" #include "afb-hook.h" @@ -63,7 +63,7 @@ struct afb_evt_listener { struct afb_evtid { /* interface */ - struct afb_event_itf *itf; + struct afb_eventid eventid; /* next event */ struct afb_evtid *next; @@ -71,8 +71,8 @@ struct afb_evtid { /* head of the list of listeners watching the event */ struct afb_evt_watch *watchs; - /* id of the event */ - int id; + /* mutex of the event */ + pthread_mutex_t mutex; /* hooking */ int hookflags; @@ -80,8 +80,8 @@ struct afb_evtid { /* refcount */ int refcount; - /* mutex of the event */ - pthread_mutex_t mutex; + /* id of the event */ + int id; /* fullname of the event */ char fullname[1]; @@ -108,23 +108,22 @@ struct afb_evt_watch { unsigned activity; }; -/* declare functions */ -static void evt_hooked_drop(struct afb_evtid *evtid); - /* the interface for events */ -static struct afb_event_itf afb_evt_event_itf = { +static struct afb_eventid_itf afb_evt_eventid_itf = { .broadcast = (void*)afb_evt_evtid_broadcast, .push = (void*)afb_evt_evtid_push, - .drop = (void*)afb_evt_evtid_unref, - .name = (void*)afb_evt_evtid_name + .unref = (void*)afb_evt_evtid_unref, + .name = (void*)afb_evt_evtid_name, + .addref = (void*)afb_evt_evtid_addref }; /* the interface for events */ -static struct afb_event_itf afb_evt_hooked_event_itf = { +static struct afb_eventid_itf afb_evt_hooked_eventid_itf = { .broadcast = (void*)afb_evt_evtid_hooked_broadcast, .push = (void*)afb_evt_evtid_hooked_push, - .drop = (void*)evt_hooked_drop, - .name = (void*)afb_evt_evtid_hooked_name + .unref = (void*)afb_evt_evtid_hooked_unref, + .name = (void*)afb_evt_evtid_hooked_name, + .addref = (void*)afb_evt_evtid_hooked_addref }; /* head of the list of listeners */ @@ -341,7 +340,7 @@ struct afb_evtid *afb_evt_evtid_create(const char *fullname) pthread_mutex_init(&evtid->mutex, NULL); evtids = evtid; evtid->hookflags = afb_hook_flags_evt(evtid->fullname); - evtid->itf = evtid->hookflags ? &afb_evt_hooked_event_itf : &afb_evt_event_itf; + evtid->eventid.itf = evtid->hookflags ? &afb_evt_hooked_eventid_itf : &afb_evt_eventid_itf; if (evtid->hookflags & afb_hook_flag_evt_create) afb_hook_evt_create(evtid->fullname, evtid->id); pthread_mutex_unlock(&events_mutex); @@ -406,10 +405,6 @@ void afb_evt_evtid_unref(struct afb_evtid *evtid) pthread_mutex_unlock(&listener->mutex); } - /* hook */ - if (evtid->hookflags & afb_hook_flag_evt_drop) - afb_hook_evt_drop(evtid->fullname, evtid->id); - /* free */ pthread_mutex_destroy(&evtid->mutex); free(evtid); @@ -428,13 +423,6 @@ void afb_evt_evtid_hooked_unref(struct afb_evtid *evtid) afb_evt_evtid_unref(evtid); } -static void evt_hooked_drop(struct afb_evtid *evtid) -{ - if (evtid->hookflags & afb_hook_flag_evt_drop) - afb_hook_evt_drop(evtid->fullname, evtid->id); - afb_evt_evtid_unref(evtid); -} - /* * Returns the true name of the 'event' */ @@ -641,55 +629,55 @@ void afb_evt_update_hooks() pthread_mutex_lock(&events_mutex); for (evtid = evtids ; evtid ; evtid = evtid->next) { evtid->hookflags = afb_hook_flags_evt(evtid->fullname); - evtid->itf = evtid->hookflags ? &afb_evt_hooked_event_itf : &afb_evt_event_itf; + evtid->eventid.itf = evtid->hookflags ? &afb_evt_hooked_eventid_itf : &afb_evt_eventid_itf; } pthread_mutex_unlock(&events_mutex); } -struct afb_evtid *afb_evt_to_evtid(struct afb_event event) +inline struct afb_evtid *afb_evt_eventid_to_evtid(struct afb_eventid *eventid) { - return (struct afb_evtid*)(event.itf == &afb_evt_hooked_event_itf ? event.closure : NULL); + return (struct afb_evtid*)eventid; } -struct afb_event afb_evt_from_evtid(struct afb_evtid *evtid) +inline struct afb_eventid *afb_evt_eventid_from_evtid(struct afb_evtid *evtid) { - return (struct afb_event){ .itf = evtid ? &afb_evt_hooked_event_itf : NULL, .closure = evtid }; + return &evtid->eventid; } /* * Creates an event of 'fullname' and returns it. * Returns an event with closure==NULL in case of error. */ -struct afb_event afb_evt_create_event(const char *fullname) +struct afb_eventid *afb_evt_eventid_create(const char *fullname) { - return afb_evt_from_evtid(afb_evt_evtid_create(fullname)); + return afb_evt_eventid_from_evtid(afb_evt_evtid_create(fullname)); } /* - * Returns the fullname of the 'event' + * Returns the fullname of the 'eventid' */ -const char *afb_evt_event_fullname(struct afb_event event) +const char *afb_evt_eventid_fullname(struct afb_eventid *eventid) { - struct afb_evtid *evtid = afb_evt_to_evtid(event); + struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid); return evtid ? evtid->fullname : NULL; } /* - * Returns the id of the 'event' + * Returns the id of the 'eventid' */ -int afb_evt_event_id(struct afb_event event) +int afb_evt_eventid_id(struct afb_eventid *eventid) { - struct afb_evtid *evtid = afb_evt_to_evtid(event); + struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid); return evtid ? evtid->id : 0; } /* - * Makes the 'listener' watching 'event' + * Makes the 'listener' watching 'eventid' * Returns 0 in case of success or else -1. */ -int afb_evt_add_watch(struct afb_evt_listener *listener, struct afb_event event) +int afb_evt_eventid_add_watch(struct afb_evt_listener *listener, struct afb_eventid *eventid) { - struct afb_evtid *evtid = afb_evt_to_evtid(event); + struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid); /* check parameter */ if (!evtid) { @@ -702,12 +690,12 @@ int afb_evt_add_watch(struct afb_evt_listener *listener, struct afb_event event) } /* - * Avoids the 'listener' to watch 'event' + * Avoids the 'listener' to watch 'eventid' * Returns 0 in case of success or else -1. */ -int afb_evt_remove_watch(struct afb_evt_listener *listener, struct afb_event event) +int afb_evt_eventid_remove_watch(struct afb_evt_listener *listener, struct afb_eventid *eventid) { - struct afb_evtid *evtid = afb_evt_to_evtid(event); + struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid); /* check parameter */ if (!evtid) { @@ -719,21 +707,43 @@ int afb_evt_remove_watch(struct afb_evt_listener *listener, struct afb_event eve return afb_evt_watch_sub_evtid(listener, evtid); } -int afb_evt_push(struct afb_event event, struct json_object *object) +int afb_evt_eventid_push(struct afb_eventid *eventid, struct json_object *object) { - struct afb_evtid *evtid = afb_evt_to_evtid(event); + struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid); if (evtid) return afb_evt_evtid_hooked_push(evtid, object); json_object_put(object); return 0; } -int afb_evt_unhooked_push(struct afb_event event, struct json_object *object) +int afb_evt_eventid_unhooked_push(struct afb_eventid *eventid, struct json_object *object) { - struct afb_evtid *evtid = afb_evt_to_evtid(event); + struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid); if (evtid) return afb_evt_evtid_push(evtid, object); json_object_put(object); return 0; } +struct afb_event afb_evt_event_from_evtid(struct afb_evtid *evtid) +{ + return evtid + ? (struct afb_event){ .itf = &afb_evt_hooked_eventid_itf, .closure = &evtid->eventid } + : (struct afb_event){ .itf = NULL, .closure = NULL }; +} + +void afb_evt_eventid_unref(struct afb_eventid *eventid) +{ + struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid); + if (evtid) + afb_evt_evtid_unref(evtid); +} + +struct afb_eventid *afb_evt_eventid_addref(struct afb_eventid *eventid) +{ + struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid); + if (evtid) + afb_evt_evtid_addref(evtid); + return eventid; +} +