/*
- * Copyright (C) 2015, 2016, 2017 "IoT.bzh"
+ * Copyright (C) 2015-2018 "IoT.bzh"
* 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-eventid-itf.h>
-#include <afb/afb-event.h>
+#include <afb/afb-event-x2-itf.h>
+#include <afb/afb-event-x1.h>
#include "afb-evt.h"
#include "afb-hook.h"
#include "verbose.h"
+#include "jobs.h"
struct afb_evt_watch;
/* head of the list of events listened */
struct afb_evt_watch *watchs;
- /* mutex of the listener */
- pthread_mutex_t mutex;
+ /* rwlock of the listener */
+ pthread_rwlock_t rwlock;
/* count of reference to the listener */
int refcount;
struct afb_evtid {
/* interface */
- struct afb_eventid eventid;
+ struct afb_event_x2 eventid;
/* next event */
struct afb_evtid *next;
/* head of the list of listeners watching the event */
struct afb_evt_watch *watchs;
- /* mutex of the event */
- pthread_mutex_t mutex;
+ /* rwlock of the event */
+ pthread_rwlock_t rwlock;
/* hooking */
int hookflags;
/* id of the event */
int id;
+ /* has client? */
+ int has_client;
+
/* fullname of the event */
- char fullname[1];
+ char fullname[];
};
/*
unsigned activity;
};
+/*
+ * structure for job of broadcasting string events
+ */
+struct job_string
+{
+ /** object atached to the event */
+ struct json_object *object;
+
+ /** name of the event to broadcast */
+ char event[];
+};
+
+/*
+ * structure for job of broadcasting or pushing events
+ */
+struct job_evtid
+{
+ /** the event to broadcast */
+ struct afb_evtid *evtid;
+
+ /** object atached to the event */
+ struct json_object *object;
+};
+
/* the interface for events */
-static struct afb_eventid_itf afb_evt_eventid_itf = {
+static struct afb_event_x2_itf afb_evt_event_x2_itf = {
.broadcast = (void*)afb_evt_evtid_broadcast,
.push = (void*)afb_evt_evtid_push,
.unref = (void*)afb_evt_evtid_unref,
};
/* the interface for events */
-static struct afb_eventid_itf afb_evt_hooked_eventid_itf = {
+static struct afb_event_x2_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,
.addref = (void*)afb_evt_evtid_hooked_addref
};
+/* job groups for events push/broadcast */
+#define BROADCAST_JOB_GROUP (&afb_evt_event_x2_itf)
+#define PUSH_JOB_GROUP (&afb_evt_event_x2_itf)
+
/* head of the list of listeners */
-static pthread_mutex_t listeners_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_rwlock_t listeners_rwlock = PTHREAD_RWLOCK_INITIALIZER;
static struct afb_evt_listener *listeners = NULL;
/* handling id of events */
-static pthread_mutex_t events_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_rwlock_t events_rwlock = PTHREAD_RWLOCK_INITIALIZER;
static struct afb_evtid *evtids = NULL;
static int event_id_counter = 0;
static int event_id_wrapped = 0;
/*
- * Broadcasts the 'event' of 'id' with its 'obj'
- * 'obj' is released (like json_object_put)
- * Returns the count of listener having receive the event.
+ * Create structure for job of broadcasting string 'event' with 'object'
+ * Returns the created structure or NULL if out of memory
*/
-static int broadcast(const char *event, struct json_object *obj, int id)
+static struct job_string *make_job_string(const char *event, struct json_object *object)
+{
+ size_t sz = 1 + strlen(event);
+ struct job_string *js = malloc(sz + sizeof *js);
+ if (js) {
+ js->object = object;
+ memcpy(js->event, event, sz);
+ }
+ return js;
+}
+
+/*
+ * Destroy structure 'js' for job of broadcasting string events
+ */
+static void destroy_job_string(struct job_string *js)
+{
+ json_object_put(js->object);
+ free(js);
+}
+
+/*
+ * Create structure for job of broadcasting or pushing 'evtid' with 'object'
+ * Returns the created structure or NULL if out of memory
+ */
+static struct job_evtid *make_job_evtid(struct afb_evtid *evtid, struct json_object *object)
+{
+ struct job_evtid *je = malloc(sizeof *je);
+ if (je) {
+ je->evtid = afb_evt_evtid_addref(evtid);
+ je->object = object;
+ }
+ return je;
+}
+
+/*
+ * Destroy structure for job of broadcasting or pushing evtid
+ */
+static void destroy_job_evtid(struct job_evtid *je)
+{
+ afb_evt_evtid_unref(je->evtid);
+ json_object_put(je->object);
+ free(je);
+}
+
+/*
+ * Broadcasts the 'event' of 'id' with its 'object'
+ */
+static void broadcast(const char *event, struct json_object *object, int id)
{
- int result;
struct afb_evt_listener *listener;
- result = 0;
- pthread_mutex_lock(&listeners_mutex);
+ pthread_rwlock_rdlock(&listeners_rwlock);
listener = listeners;
while(listener) {
- if (listener->itf->broadcast != NULL) {
- listener->itf->broadcast(listener->closure, event, id, json_object_get(obj));
- result++;
- }
+ if (listener->itf->broadcast != NULL)
+ listener->itf->broadcast(listener->closure, event, id, json_object_get(object));
listener = listener->next;
}
- pthread_mutex_unlock(&listeners_mutex);
- json_object_put(obj);
- return result;
+ pthread_rwlock_unlock(&listeners_rwlock);
}
/*
- * 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.
+ * Jobs callback for broadcasting string asynchronously
*/
-static int hooked_broadcast(const char *event, struct json_object *obj, int id, int hookflags)
+static void broadcast_job_string(int signum, void *closure)
{
- int result;
+ struct job_string *js = closure;
- json_object_get(obj);
+ if (signum == 0)
+ broadcast(js->event, js->object, 0);
+ destroy_job_string(js);
+}
- if (hookflags & afb_hook_flag_evt_broadcast_before)
- afb_hook_evt_broadcast_before(event, id, obj);
+/*
+ * Jobs callback for broadcasting evtid asynchronously
+ */
+static void broadcast_job_evtid(int signum, void *closure)
+{
+ struct job_evtid *je = closure;
- result = broadcast(event, obj, id);
+ if (signum == 0)
+ broadcast(je->evtid->fullname, je->object, je->evtid->id);
+ destroy_job_evtid(je);
+}
- if (hookflags & afb_hook_flag_evt_broadcast_after)
- afb_hook_evt_broadcast_after(event, id, obj, result);
+/*
+ * Broadcasts the string 'event' with its 'object'
+ */
+static int broadcast_string(const char *event, struct json_object *object)
+{
+ struct job_string *js;
+ int rc;
- json_object_put(obj);
+ js = make_job_string(event, object);
+ if (js == NULL) {
+ ERROR("Cant't create broadcast string job item for %s(%s)",
+ event, json_object_to_json_string(object));
+ json_object_put(object);
+ return -1;
+ }
- return result;
+ rc = jobs_queue(BROADCAST_JOB_GROUP, 0, broadcast_job_string, js);
+ if (rc) {
+ ERROR("cant't queue broadcast string job item for %s(%s)",
+ event, json_object_to_json_string(object));
+ destroy_job_string(js);
+ }
+ return rc;
+}
+
+/*
+ * Broadcasts the 'evtid' with its 'object'
+ */
+static int broadcast_evtid(struct afb_evtid *evtid, struct json_object *object)
+{
+ struct job_evtid *je;
+ int rc;
+
+ je = make_job_evtid(evtid, object);
+ if (je == NULL) {
+ ERROR("Cant't create broadcast evtid job item for %s(%s)",
+ evtid->fullname, json_object_to_json_string(object));
+ json_object_put(object);
+ return -1;
+ }
+
+ rc = jobs_queue(BROADCAST_JOB_GROUP, 0, broadcast_job_evtid, je);
+ if (rc) {
+ ERROR("cant't queue broadcast evtid job item for %s(%s)",
+ evtid->fullname, json_object_to_json_string(object));
+ destroy_job_evtid(je);
+ }
+ return rc;
}
/*
*/
int afb_evt_evtid_broadcast(struct afb_evtid *evtid, struct json_object *object)
{
- return broadcast(evtid->fullname, object, evtid->id);
+ return broadcast_evtid(evtid, object);
}
/*
*/
int afb_evt_evtid_hooked_broadcast(struct afb_evtid *evtid, struct json_object *object)
{
- return hooked_broadcast(evtid->fullname, object, evtid->id, evtid->hookflags);
+ int result;
+
+ json_object_get(object);
+
+ if (evtid->hookflags & afb_hook_flag_evt_broadcast_before)
+ afb_hook_evt_broadcast_before(evtid->fullname, evtid->id, object);
+
+ result = broadcast_evtid(evtid, object);
+
+ if (evtid->hookflags & afb_hook_flag_evt_broadcast_after)
+ afb_hook_evt_broadcast_after(evtid->fullname, evtid->id, object, result);
+
+ json_object_put(object);
+
+ return result;
}
/*
*/
int afb_evt_broadcast(const char *event, struct json_object *object)
{
- return hooked_broadcast(event, object, 0, -1);
+ int result;
+
+ json_object_get(object);
+
+ afb_hook_evt_broadcast_before(event, 0, object);
+ result = broadcast_string(event, object);
+ afb_hook_evt_broadcast_after(event, 0, object, result);
+
+ json_object_put(object);
+
+ return result;
}
/*
* Pushes the event 'evtid' with 'obj' to its listeners
- * 'obj' is released (like json_object_put)
* Returns the count of listener that received the event.
*/
-int afb_evt_evtid_push(struct afb_evtid *evtid, struct json_object *obj)
+static void push_evtid(struct afb_evtid *evtid, struct json_object *object)
{
- int result;
+ int has_client;
struct afb_evt_watch *watch;
struct afb_evt_listener *listener;
- result = 0;
- pthread_mutex_lock(&evtid->mutex);
+ has_client = 0;
+ pthread_rwlock_rdlock(&evtid->rwlock);
watch = evtid->watchs;
while(watch) {
listener = watch->listener;
assert(listener->itf->push != NULL);
if (watch->activity != 0) {
- listener->itf->push(listener->closure, evtid->fullname, evtid->id, json_object_get(obj));
- result++;
+ listener->itf->push(listener->closure, evtid->fullname, evtid->id, json_object_get(object));
+ has_client = 1;
}
watch = watch->next_by_evtid;
}
- pthread_mutex_unlock(&evtid->mutex);
- json_object_put(obj);
- return result;
+ evtid->has_client = has_client;
+ pthread_rwlock_unlock(&evtid->rwlock);
+}
+
+/*
+ * Jobs callback for pushing evtid asynchronously
+ */
+static void push_job_evtid(int signum, void *closure)
+{
+ struct job_evtid *je = closure;
+
+ if (signum == 0)
+ push_evtid(je->evtid, je->object);
+ destroy_job_evtid(je);
+}
+
+/*
+ * Pushes the event 'evtid' with 'obj' to its listeners
+ * 'obj' is released (like json_object_put)
+ * Returns 1 if at least one listener exists or 0 if no listener exists or
+ * -1 in case of error and the event can't be delivered
+ */
+int afb_evt_evtid_push(struct afb_evtid *evtid, struct json_object *object)
+{
+ struct job_evtid *je;
+ int rc;
+
+ je = make_job_evtid(evtid, object);
+ if (je == NULL) {
+ ERROR("Cant't create push evtid job item for %s(%s)",
+ evtid->fullname, json_object_to_json_string(object));
+ json_object_put(object);
+ return -1;
+ }
+
+ rc = jobs_queue(PUSH_JOB_GROUP, 0, push_job_evtid, je);
+ if (rc == 0)
+ rc = evtid->has_client;
+ else {
+ ERROR("cant't queue push evtid job item for %s(%s)",
+ evtid->fullname, json_object_to_json_string(object));
+ destroy_job_evtid(je);
+ }
+
+ return rc;
}
/*
*/
int afb_evt_evtid_hooked_push(struct afb_evtid *evtid, struct json_object *obj)
{
+
int result;
/* lease the object */
/* allocates the event */
len = strlen(fullname);
- evtid = malloc(len + sizeof * evtid);
+ evtid = malloc(len + 1 + sizeof * evtid);
if (evtid == NULL)
goto error;
/* allocates the id */
- pthread_mutex_lock(&events_mutex);
+ pthread_rwlock_wrlock(&events_rwlock);
do {
if (++event_id_counter < 0) {
event_id_wrapped = 1;
/* initialize the event */
memcpy(evtid->fullname, fullname, len + 1);
evtid->next = evtids;
+ evtid->refcount = 1;
evtid->watchs = NULL;
evtid->id = event_id_counter;
- pthread_mutex_init(&evtid->mutex, NULL);
+ evtid->has_client = 0;
+ pthread_rwlock_init(&evtid->rwlock, NULL);
evtids = evtid;
evtid->hookflags = afb_hook_flags_evt(evtid->fullname);
- evtid->eventid.itf = evtid->hookflags ? &afb_evt_hooked_eventid_itf : &afb_evt_eventid_itf;
+ evtid->eventid.itf = evtid->hookflags ? &afb_evt_hooked_eventid_itf : &afb_evt_event_x2_itf;
if (evtid->hookflags & afb_hook_flag_evt_create)
afb_hook_evt_create(evtid->fullname, evtid->id);
- pthread_mutex_unlock(&events_mutex);
+ pthread_rwlock_unlock(&events_rwlock);
/* returns the event */
return evtid;
return NULL;
}
+/*
+ * Creates an event of name 'prefix'/'name' and returns it or NULL on error.
+ */
+struct afb_evtid *afb_evt_evtid_create2(const char *prefix, const char *name)
+{
+ size_t prelen, postlen;
+ char *fullname;
+
+ /* makes the event fullname */
+ prelen = strlen(prefix);
+ postlen = strlen(name);
+ fullname = alloca(prelen + postlen + 2);
+ memcpy(fullname, prefix, prelen);
+ fullname[prelen] = '/';
+ memcpy(fullname + prelen + 1, name, postlen + 1);
+
+ /* create the event */
+ return afb_evt_evtid_create(fullname);
+}
+
/*
* increment the reference count of the event 'evtid'
*/
if (!__atomic_sub_fetch(&evtid->refcount, 1, __ATOMIC_RELAXED)) {
/* unlinks the event if valid! */
- pthread_mutex_lock(&events_mutex);
+ pthread_rwlock_wrlock(&events_rwlock);
found = 0;
prv = &evtids;
while (*prv && !(found = (*prv == evtid)))
prv = &(*prv)->next;
if (found)
*prv = evtid->next;
- pthread_mutex_unlock(&events_mutex);
+ pthread_rwlock_unlock(&events_rwlock);
/* destroys the event */
if (!found)
/* removes all watchers */
while(evtid->watchs != NULL) {
listener = evtid->watchs->listener;
- pthread_mutex_lock(&listener->mutex);
- pthread_mutex_lock(&evtid->mutex);
+ pthread_rwlock_wrlock(&listener->rwlock);
+ pthread_rwlock_wrlock(&evtid->rwlock);
remove_watch(evtid->watchs);
- pthread_mutex_unlock(&evtid->mutex);
- pthread_mutex_unlock(&listener->mutex);
+ pthread_rwlock_unlock(&evtid->rwlock);
+ pthread_rwlock_unlock(&listener->rwlock);
}
/* free */
- pthread_mutex_destroy(&evtid->mutex);
+ pthread_rwlock_destroy(&evtid->rwlock);
free(evtid);
}
}
struct afb_evt_listener *listener;
/* search if an instance already exists */
- pthread_mutex_lock(&listeners_mutex);
+ pthread_rwlock_wrlock(&listeners_rwlock);
listener = listeners;
while (listener != NULL) {
if (listener->itf == itf && listener->closure == closure) {
listener->closure = closure;
listener->watchs = NULL;
listener->refcount = 1;
- pthread_mutex_init(&listener->mutex, NULL);
+ pthread_rwlock_init(&listener->rwlock, NULL);
listener->next = listeners;
listeners = listener;
}
found:
- pthread_mutex_unlock(&listeners_mutex);
+ pthread_rwlock_unlock(&listeners_rwlock);
return listener;
}
struct afb_evt_listener **prv;
struct afb_evtid *evtid;
- if (!__atomic_sub_fetch(&listener->refcount, 1, __ATOMIC_RELAXED)) {
+ if (listener && !__atomic_sub_fetch(&listener->refcount, 1, __ATOMIC_RELAXED)) {
/* unlink the listener */
- pthread_mutex_lock(&listeners_mutex);
+ pthread_rwlock_wrlock(&listeners_rwlock);
prv = &listeners;
while (*prv != listener)
prv = &(*prv)->next;
*prv = listener->next;
- pthread_mutex_unlock(&listeners_mutex);
+ pthread_rwlock_unlock(&listeners_rwlock);
/* remove the watchers */
- pthread_mutex_lock(&listener->mutex);
+ pthread_rwlock_wrlock(&listener->rwlock);
while (listener->watchs != NULL) {
evtid = listener->watchs->evtid;
- pthread_mutex_lock(&evtid->mutex);
+ pthread_rwlock_wrlock(&evtid->rwlock);
remove_watch(listener->watchs);
- pthread_mutex_unlock(&evtid->mutex);
+ pthread_rwlock_unlock(&evtid->rwlock);
}
- pthread_mutex_unlock(&listener->mutex);
+ pthread_rwlock_unlock(&listener->rwlock);
/* free the listener */
- pthread_mutex_destroy(&listener->mutex);
+ pthread_rwlock_destroy(&listener->rwlock);
free(listener);
}
}
}
/* search the existing watch for the listener */
- pthread_mutex_lock(&listener->mutex);
+ pthread_rwlock_wrlock(&listener->rwlock);
watch = listener->watchs;
while(watch != NULL) {
if (watch->evtid == evtid)
/* not found, allocate a new */
watch = malloc(sizeof *watch);
if (watch == NULL) {
- pthread_mutex_unlock(&listener->mutex);
+ pthread_rwlock_unlock(&listener->rwlock);
errno = ENOMEM;
return -1;
}
watch->listener = listener;
watch->next_by_listener = listener->watchs;
listener->watchs = watch;
- pthread_mutex_lock(&evtid->mutex);
+ pthread_rwlock_wrlock(&evtid->rwlock);
watch->next_by_evtid = evtid->watchs;
evtid->watchs = watch;
- pthread_mutex_unlock(&evtid->mutex);
+ pthread_rwlock_unlock(&evtid->rwlock);
found:
if (watch->activity == 0 && listener->itf->add != NULL)
listener->itf->add(listener->closure, evtid->fullname, evtid->id);
watch->activity++;
- pthread_mutex_unlock(&listener->mutex);
+ evtid->has_client = 1;
+ pthread_rwlock_unlock(&listener->rwlock);
return 0;
}
struct afb_evt_watch *watch;
/* search the existing watch */
- pthread_mutex_lock(&listener->mutex);
+ pthread_rwlock_wrlock(&listener->rwlock);
watch = listener->watchs;
while(watch != NULL) {
if (watch->evtid == evtid) {
if (watch->activity == 0 && listener->itf->remove != NULL)
listener->itf->remove(listener->closure, evtid->fullname, evtid->id);
}
- pthread_mutex_unlock(&listener->mutex);
+ pthread_rwlock_unlock(&listener->rwlock);
return 0;
}
watch = watch->next_by_listener;
}
- pthread_mutex_unlock(&listener->mutex);
+ pthread_rwlock_unlock(&listener->rwlock);
errno = ENOENT;
return -1;
}
{
struct afb_evtid *evtid;
- pthread_mutex_lock(&events_mutex);
+ 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_eventid_itf;
+ evtid->eventid.itf = evtid->hookflags ? &afb_evt_hooked_eventid_itf : &afb_evt_event_x2_itf;
}
- pthread_mutex_unlock(&events_mutex);
+ pthread_rwlock_unlock(&events_rwlock);
}
-inline struct afb_evtid *afb_evt_eventid_to_evtid(struct afb_eventid *eventid)
+inline struct afb_evtid *afb_evt_event_x2_to_evtid(struct afb_event_x2 *eventid)
{
return (struct afb_evtid*)eventid;
}
-inline struct afb_eventid *afb_evt_eventid_from_evtid(struct afb_evtid *evtid)
+inline struct afb_event_x2 *afb_evt_event_x2_from_evtid(struct afb_evtid *evtid)
{
return &evtid->eventid;
}
* Creates an event of 'fullname' and returns it.
* Returns an event with closure==NULL in case of error.
*/
-struct afb_eventid *afb_evt_eventid_create(const char *fullname)
+struct afb_event_x2 *afb_evt_event_x2_create(const char *fullname)
+{
+ return afb_evt_event_x2_from_evtid(afb_evt_evtid_create(fullname));
+}
+
+/*
+ * Creates an event of name 'prefix'/'name' and returns it.
+ * Returns an event with closure==NULL in case of error.
+ */
+struct afb_event_x2 *afb_evt_event_x2_create2(const char *prefix, const char *name)
{
- return afb_evt_eventid_from_evtid(afb_evt_evtid_create(fullname));
+ return afb_evt_event_x2_from_evtid(afb_evt_evtid_create2(prefix, name));
}
/*
* Returns the fullname of the 'eventid'
*/
-const char *afb_evt_eventid_fullname(struct afb_eventid *eventid)
+const char *afb_evt_event_x2_fullname(struct afb_event_x2 *eventid)
{
- struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid);
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
return evtid ? evtid->fullname : NULL;
}
/*
* Returns the id of the 'eventid'
*/
-int afb_evt_eventid_id(struct afb_eventid *eventid)
+int afb_evt_event_x2_id(struct afb_event_x2 *eventid)
{
- struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid);
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
return evtid ? evtid->id : 0;
}
* Makes the 'listener' watching 'eventid'
* Returns 0 in case of success or else -1.
*/
-int afb_evt_eventid_add_watch(struct afb_evt_listener *listener, struct afb_eventid *eventid)
+int afb_evt_event_x2_add_watch(struct afb_evt_listener *listener, struct afb_event_x2 *eventid)
{
- struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid);
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
/* check parameter */
if (!evtid) {
* Avoids the 'listener' to watch 'eventid'
* Returns 0 in case of success or else -1.
*/
-int afb_evt_eventid_remove_watch(struct afb_evt_listener *listener, struct afb_eventid *eventid)
+int afb_evt_event_x2_remove_watch(struct afb_evt_listener *listener, struct afb_event_x2 *eventid)
{
- struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid);
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
/* check parameter */
if (!evtid) {
return afb_evt_watch_sub_evtid(listener, evtid);
}
-int afb_evt_eventid_push(struct afb_eventid *eventid, struct json_object *object)
+int afb_evt_event_x2_push(struct afb_event_x2 *eventid, struct json_object *object)
{
- struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid);
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
if (evtid)
return afb_evt_evtid_hooked_push(evtid, object);
json_object_put(object);
return 0;
}
-int afb_evt_eventid_unhooked_push(struct afb_eventid *eventid, struct json_object *object)
+int afb_evt_event_x2_unhooked_push(struct afb_event_x2 *eventid, struct json_object *object)
{
- struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid);
+ struct afb_evtid *evtid = afb_evt_event_x2_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)
+struct afb_event_x1 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 };
+ ? (struct afb_event_x1){ .itf = &afb_evt_hooked_eventid_itf, .closure = &evtid->eventid }
+ : (struct afb_event_x1){ .itf = NULL, .closure = NULL };
}
-void afb_evt_eventid_unref(struct afb_eventid *eventid)
+void afb_evt_event_x2_unref(struct afb_event_x2 *eventid)
{
- struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid);
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
if (evtid)
afb_evt_evtid_unref(evtid);
}
-struct afb_eventid *afb_evt_eventid_addref(struct afb_eventid *eventid)
+struct afb_event_x2 *afb_evt_event_x2_addref(struct afb_event_x2 *eventid)
{
- struct afb_evtid *evtid = afb_evt_eventid_to_evtid(eventid);
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
if (evtid)
afb_evt_evtid_addref(evtid);
return eventid;