From bd1e4d03840a4d8289ba87935096c6dcb0c18ea7 Mon Sep 17 00:00:00 2001 From: Thomas Graf Date: Sun, 22 Apr 2012 15:23:52 +0200 Subject: [PATCH] cache: Add co_include_event allowing caches to provide their own nl_cache_include() implementation --- include/netlink/cache-api.h | 20 +++++++++++++++++++- include/netlink/cache.h | 2 -- lib/cache_mngr.c | 6 +++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/include/netlink/cache-api.h b/include/netlink/cache-api.h index c1c3aaa..390cbea 100644 --- a/include/netlink/cache-api.h +++ b/include/netlink/cache-api.h @@ -6,7 +6,7 @@ * License as published by the Free Software Foundation version 2.1 * of the License. * - * Copyright (c) 2003-2006 Thomas Graf + * Copyright (c) 2003-2012 Thomas Graf */ #ifndef NETLINK_CACHE_API_H_ @@ -18,6 +18,8 @@ extern "C" { #endif +typedef void (*change_func_t)(struct nl_cache *, struct nl_object *, int, void *); + /** * @ingroup cache * @defgroup cache_api Cache Implementation @@ -225,6 +227,22 @@ struct nl_cache_ops */ int (*co_event_filter)(struct nl_cache *, struct nl_object *obj); + /** + * The function registered under this callback is called when an + * object formed from a notification event needs to be included in + * a cache. + * + * For each modified object, the change callback \c change_cb must + * be called with the \c data argument provided. + * + * If no function is registered, the function nl_cache_include() + * will be used for this purpose. + * + * @see nl_cache_include() + */ + int (*co_include_event)(struct nl_cache *cache, struct nl_object *obj, + change_func_t change_cb, void *data); + /** Object operations */ struct nl_object_ops * co_obj_ops; diff --git a/include/netlink/cache.h b/include/netlink/cache.h index 1e2bb9d..fd137e1 100644 --- a/include/netlink/cache.h +++ b/include/netlink/cache.h @@ -24,8 +24,6 @@ extern "C" { struct nl_cache; -typedef void (*change_func_t)(struct nl_cache *, struct nl_object *, int, void *); - /* Access Functions */ extern int nl_cache_nitems(struct nl_cache *); extern int nl_cache_nitems_filter(struct nl_cache *, diff --git a/lib/cache_mngr.c b/lib/cache_mngr.c index 39cf0ac..dae8768 100644 --- a/lib/cache_mngr.c +++ b/lib/cache_mngr.c @@ -42,7 +42,11 @@ static int include_cb(struct nl_object *obj, struct nl_parser_param *p) if (ops->co_event_filter(ca->ca_cache, obj) != NL_OK) return 0; - return nl_cache_include(ca->ca_cache, obj, ca->ca_change, ca->ca_change_data); + if (ops->co_include_event) + return ops->co_include_event(ca->ca_cache, obj, ca->ca_change, + ca->ca_change_data); + else + return nl_cache_include(ca->ca_cache, obj, ca->ca_change, ca->ca_change_data); } static int event_input(struct nl_msg *msg, void *arg) -- 2.40.0