afb-evt: Improve compatibility to guppy
[src/app-framework-binder.git] / src / afb-evt.c
index e06d06e..960d413 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015-2018 "IoT.bzh"
+ * Copyright (C) 2015-2019 "IoT.bzh"
  * Author José Bollo <jose.bollo@iot.bzh>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -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)
 {