/*
* 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");
#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"
struct afb_evtid {
/* interface */
- struct afb_event_itf *itf;
+ struct afb_eventid eventid;
/* next event */
struct afb_evtid *next;
/* 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;
/* refcount */
int refcount;
- /* mutex of the event */
- pthread_mutex_t mutex;
+ /* id of the event */
+ int id;
/* fullname of the event */
char fullname[1];
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 */
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);
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);
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'
*/
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) {
}
/*
- * 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) {
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;
+}
+