summaryrefslogtreecommitdiffstats
path: root/src/afb-evt.c
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2017-06-01 12:34:29 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2017-06-01 12:34:29 +0200
commitb67e18b39830a01750721787bf3bdc5d71983144 (patch)
tree20104692fd55fcb27b3a20aae0b144bb64286150 /src/afb-evt.c
parent4dc768d67031aa99e2b885a0df7e643fdd1fa80c (diff)
Add hooking for events
Change-Id: If5fe736e04c9f4298302c3cbba568f1d6346ee67 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'src/afb-evt.c')
-rw-r--r--src/afb-evt.c75
1 files changed, 60 insertions, 15 deletions
diff --git a/src/afb-evt.c b/src/afb-evt.c
index 7b7ce4f3..d80af045 100644
--- a/src/afb-evt.c
+++ b/src/afb-evt.c
@@ -28,6 +28,7 @@
#include <afb/afb-event-itf.h>
#include "afb-evt.h"
+#include "afb-hook.h"
#include "verbose.h"
struct afb_evt_watch;
@@ -70,6 +71,9 @@ struct afb_evt_event {
/* id of the event */
int id;
+ /* hooking */
+ int hookflags;
+
/* mutex of the event */
pthread_mutex_t mutex;
@@ -123,41 +127,56 @@ static int event_id_counter = 0;
static int event_id_wrapped = 0;
/*
- * Broadcasts the event 'evt' with its 'object'
- * 'object' is released (like json_object_put)
- * Returns the count of listener that received the event.
- */
-static int evt_broadcast(struct afb_evt_event *evt, struct json_object *object)
-{
- return afb_evt_broadcast(evt->name, object);
-}
-
-/*
- * Broadcasts the 'event' with its 'object'
- * 'object' is released (like json_object_put)
+ * Broadcasts the 'event' of 'id' with its 'obj'
+ * 'obj' is released (like json_object_put)
+ * calls hooks if hookflags isn't 0
* Returns the count of listener having receive the event.
*/
-int afb_evt_broadcast(const char *event, struct json_object *object)
+static int broadcast(const char *event, struct json_object *obj, int id, int hookflags)
{
int result;
struct afb_evt_listener *listener;
+ if (hookflags & afb_hook_flag_evt_broadcast_before)
+ afb_hook_evt_broadcast_before(event, id, obj);
result = 0;
pthread_mutex_lock(&listeners_mutex);
listener = listeners;
while(listener) {
if (listener->itf->broadcast != NULL) {
- listener->itf->broadcast(listener->closure, event, 0, json_object_get(object));
+ listener->itf->broadcast(listener->closure, event, id, json_object_get(obj));
result++;
}
listener = listener->next;
}
pthread_mutex_unlock(&listeners_mutex);
- json_object_put(object);
+ if (hookflags & afb_hook_flag_evt_broadcast_after)
+ afb_hook_evt_broadcast_after(event, id, obj, result);
+ json_object_put(obj);
return result;
}
/*
+ * Broadcasts the event 'evt' with its 'object'
+ * 'object' is released (like json_object_put)
+ * Returns the count of listener that received the event.
+ */
+static int evt_broadcast(struct afb_evt_event *evt, struct json_object *object)
+{
+ return broadcast(evt->name, object, evt->id, evt->hookflags);
+}
+
+/*
+ * Broadcasts the 'event' with its 'object'
+ * 'object' is released (like json_object_put)
+ * Returns the count of listener having receive the event.
+ */
+int afb_evt_broadcast(const char *event, struct json_object *object)
+{
+ return broadcast(event, object, 0, -1);
+}
+
+/*
* Pushes the event 'evt' with 'obj' to its listeners
* 'obj' is released (like json_object_put)
* Returns the count of listener taht received the event.
@@ -170,6 +189,8 @@ static int evt_push(struct afb_evt_event *evt, struct json_object *obj)
result = 0;
pthread_mutex_lock(&evt->mutex);
+ if (evt->hookflags & afb_hook_flag_evt_push_before)
+ afb_hook_evt_push_before(evt->name, evt->id, obj);
watch = evt->watchs;
while(watch) {
listener = watch->listener;
@@ -180,6 +201,8 @@ static int evt_push(struct afb_evt_event *evt, struct json_object *obj)
}
watch = watch->next_by_event;
}
+ if (evt->hookflags & afb_hook_flag_evt_push_after)
+ afb_hook_evt_push_after(evt->name, evt->id, obj, result);
pthread_mutex_unlock(&evt->mutex);
json_object_put(obj);
return result;
@@ -190,6 +213,8 @@ static int evt_push(struct afb_evt_event *evt, struct json_object *obj)
*/
static const char *evt_name(struct afb_evt_event *evt)
{
+ if (evt->hookflags & afb_hook_flag_evt_name)
+ afb_hook_evt_name(evt->name, evt->id);
return evt->name;
}
@@ -256,6 +281,10 @@ static void evt_destroy(struct afb_evt_event *evt)
pthread_mutex_unlock(&listener->mutex);
}
+ /* hook */
+ if (evt->hookflags & afb_hook_flag_evt_drop)
+ afb_hook_evt_drop(evt->name, evt->id);
+
/* free */
pthread_mutex_destroy(&evt->mutex);
free(evt);
@@ -303,6 +332,9 @@ struct afb_event afb_evt_create_event(const char *name)
evt->id = event_id_counter;
pthread_mutex_init(&evt->mutex, NULL);
events = evt;
+ evt->hookflags = afb_hook_flags_evt(evt->name);
+ if (evt->hookflags & afb_hook_flag_evt_create)
+ afb_hook_evt_create(evt->name, evt->id);
pthread_mutex_unlock(&events_mutex);
/* returns the event */
@@ -497,3 +529,16 @@ int afb_evt_remove_watch(struct afb_evt_listener *listener, struct afb_event eve
return -1;
}
+/*
+ * update the hooks for events
+ */
+void afb_evt_update_hooks()
+{
+ struct afb_evt_event *evt;
+
+ pthread_mutex_lock(&events_mutex);
+ for (evt = events ; evt ; evt = evt->next)
+ evt->hookflags = afb_hook_flags_evt(evt->name);
+ pthread_mutex_unlock(&events_mutex);
+}
+