/* rwlock of the event */
pthread_rwlock_t rwlock;
+#if WITH_AFB_HOOK
/* hooking */
int hookflags;
+#endif
/* refcount */
int refcount;
int id;
/* fullname of the event */
- char fullname[1];
+ char fullname[];
};
/*
.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;
return result;
}
+/*
+ * Broadcasts the event 'evtid' with its 'object'
+ * 'object' is released (like json_object_put)
+ * Returns the count of listener that received the event.
+ */
+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' of 'id' with its 'obj'
* 'obj' is released (like json_object_put)
return result;
}
-/*
- * Broadcasts the event 'evtid' with its 'object'
- * 'object' is released (like json_object_put)
- * Returns the count of listener that received the event.
- */
-int afb_evt_evtid_broadcast(struct afb_evtid *evtid, struct json_object *object)
-{
- return broadcast(evtid->fullname, object, evtid->id);
-}
-
/*
* Broadcasts the event 'evtid' with its 'object'
* 'object' is released (like json_object_put)
{
return hooked_broadcast(evtid->fullname, object, evtid->id, evtid->hookflags);
}
+#endif
/*
* Broadcasts the 'event' with its '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
}
/*
return result;
}
-/*
- * Pushes the event 'evtid' with 'obj' to its listeners
- * 'obj' is released (like json_object_put)
- * Emits calls to hooks.
- * Returns the count of listener taht received the event.
- */
-int afb_evt_evtid_hooked_push(struct afb_evtid *evtid, struct json_object *obj)
-{
-
- int result;
-
- /* lease the object */
- json_object_get(obj);
-
- /* hook before push */
- if (evtid->hookflags & afb_hook_flag_evt_push_before)
- afb_hook_evt_push_before(evtid->fullname, evtid->id, obj);
-
- /* push */
- result = afb_evt_evtid_push(evtid, obj);
-
- /* hook after push */
- if (evtid->hookflags & afb_hook_flag_evt_push_after)
- afb_hook_evt_push_after(evtid->fullname, evtid->id, obj, result);
-
- /* release the object */
- json_object_put(obj);
- return result;
-}
-
/*
* remove the 'watch'
*/
/* allocates the event */
len = strlen(fullname);
- evtid = malloc(len + sizeof * evtid);
+ evtid = malloc(len + 1 + sizeof * evtid);
if (evtid == NULL)
goto error;
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 */
return evtid;
}
-/*
- * increment the reference count of the event 'evtid'
- */
-struct afb_evtid *afb_evt_evtid_hooked_addref(struct afb_evtid *evtid)
-{
- if (evtid->hookflags & afb_hook_flag_evt_addref)
- afb_hook_evt_addref(evtid->fullname, evtid->id);
- return afb_evt_evtid_addref(evtid);
-}
-
/*
* decrement the reference count of the event 'evtid'
* and destroy it when the count reachs zero
}
}
-/*
- * decrement the reference count of the event 'evtid'
- * and destroy it when the count reachs zero
- */
-void afb_evt_evtid_hooked_unref(struct afb_evtid *evtid)
-{
- if (evtid->hookflags & afb_hook_flag_evt_unref)
- afb_hook_evt_unref(evtid->fullname, evtid->id);
- afb_evt_evtid_unref(evtid);
-}
-
/*
* Returns the true name of the 'event'
*/
return name ? name + 1 : evtid->fullname;
}
-/*
- * Returns the name associated to the event 'evtid'.
- */
-const char *afb_evt_evtid_hooked_name(struct afb_evtid *evtid)
-{
- const char *result = afb_evt_evtid_name(evtid);
- if (evtid->hookflags & afb_hook_flag_evt_name)
- afb_hook_evt_name(evtid->fullname, evtid->id, result);
- return result;
-}
-
/*
* Returns the id of the 'event'
*/
return -1;
}
-/*
- * update the hooks for events
- */
-void afb_evt_update_hooks()
-{
- struct afb_evtid *evtid;
-
- 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;
- }
- pthread_rwlock_unlock(&events_rwlock);
-}
-
inline struct afb_evtid *afb_evt_event_x2_to_evtid(struct afb_event_x2 *eventid)
{
return (struct afb_evtid*)eventid;
}
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)
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)
{
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)
{
return eventid;
}
+#if WITH_AFB_HOOK
+/*
+ * Pushes the event 'evtid' with 'obj' to its listeners
+ * 'obj' is released (like json_object_put)
+ * Emits calls to hooks.
+ * Returns the count of listener taht received the event.
+ */
+int afb_evt_evtid_hooked_push(struct afb_evtid *evtid, struct json_object *obj)
+{
+
+ int result;
+
+ /* lease the object */
+ json_object_get(obj);
+
+ /* hook before push */
+ if (evtid->hookflags & afb_hook_flag_evt_push_before)
+ afb_hook_evt_push_before(evtid->fullname, evtid->id, obj);
+
+ /* push */
+ result = afb_evt_evtid_push(evtid, obj);
+
+ /* hook after push */
+ if (evtid->hookflags & afb_hook_flag_evt_push_after)
+ afb_hook_evt_push_after(evtid->fullname, evtid->id, obj, result);
+
+ /* release the object */
+ json_object_put(obj);
+ return result;
+}
+
+/*
+ * increment the reference count of the event 'evtid'
+ */
+struct afb_evtid *afb_evt_evtid_hooked_addref(struct afb_evtid *evtid)
+{
+ if (evtid->hookflags & afb_hook_flag_evt_addref)
+ afb_hook_evt_addref(evtid->fullname, evtid->id);
+ return afb_evt_evtid_addref(evtid);
+}
+
+/*
+ * decrement the reference count of the event 'evtid'
+ * and destroy it when the count reachs zero
+ */
+void afb_evt_evtid_hooked_unref(struct afb_evtid *evtid)
+{
+ if (evtid->hookflags & afb_hook_flag_evt_unref)
+ afb_hook_evt_unref(evtid->fullname, evtid->id);
+ afb_evt_evtid_unref(evtid);
+}
+
+/*
+ * Returns the name associated to the event 'evtid'.
+ */
+const char *afb_evt_evtid_hooked_name(struct afb_evtid *evtid)
+{
+ const char *result = afb_evt_evtid_name(evtid);
+ if (evtid->hookflags & afb_hook_flag_evt_name)
+ afb_hook_evt_name(evtid->fullname, evtid->id, result);
+ return result;
+}
+
+/*
+ * update the hooks for events
+ */
+void afb_evt_update_hooks()
+{
+ struct afb_evtid *evtid;
+
+ 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_event_x2_itf : &afb_evt_event_x2_itf;
+ }
+ pthread_rwlock_unlock(&events_rwlock);
+}
+#endif
+