Add function afb_evt_eventid_addref
[src/app-framework-binder.git] / src / afb-evt.c
index 96366de..9937c1a 100644 (file)
@@ -1,6 +1,5 @@
 /*
  * Copyright (C) 2015, 2016, 2017 "IoT.bzh"
- * Author "Fulup Ar Foll"
  * Author José Bollo <jose.bollo@iot.bzh>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,7 +24,8 @@
 #include <pthread.h>
 
 #include <json-c/json.h>
-#include <afb/afb-event-itf.h>
+#include <afb/afb-eventid-itf.h>
+#include <afb/afb-event.h>
 
 #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];
@@ -109,7 +109,7 @@ struct afb_evt_watch {
 };
 
 /* 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,
        .unref = (void*)afb_evt_evtid_unref,
@@ -118,7 +118,7 @@ static struct afb_event_itf afb_evt_event_itf = {
 };
 
 /* 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,
        .unref = (void*)afb_evt_evtid_hooked_unref,
@@ -340,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);
@@ -629,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) {
@@ -690,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) {
@@ -707,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;
+}
+