Signed-off-by: Angus Salkeld <asalkeld(a)redhat.com>
---
lib/hashtable.c | 4 +++-
lib/skiplist.c | 12 ++++++++++++
lib/trie.c | 12 ++++++++++++
tests/check_map.c | 9 +++++++++
4 files changed, 36 insertions(+), 1 deletions(-)
diff --git a/lib/hashtable.c b/lib/hashtable.c
index 27e41ac..f6f2edf 100644
--- a/lib/hashtable.c
+++ b/lib/hashtable.c
@@ -269,7 +269,9 @@ hashtable_notify_add(qb_map_t * m, const char *key,
for (list = head->next; list != head; list = list->next) {
f = qb_list_entry(list, struct qb_map_notifier, list);
- if (f->events == events && f->callback == fn) {
+ if (f->events == events &&
+ f->user_data == user_data &&
+ f->callback == fn) {
return -EEXIST;
}
}
diff --git a/lib/skiplist.c b/lib/skiplist.c
index b5b22db..045fa11 100644
--- a/lib/skiplist.c
+++ b/lib/skiplist.c
@@ -241,6 +241,7 @@ skiplist_notify_add(qb_map_t * m, const char *key,
struct skiplist *t = (struct skiplist *)m;
struct qb_map_notifier *f;
struct skiplist_node *n;
+ struct qb_list_head *list;
if (key) {
n = skiplist_lookup(t, key);
@@ -248,6 +249,17 @@ skiplist_notify_add(qb_map_t * m, const char *key,
n = t->header;
}
if (n) {
+ for (list = n->notifier_head.next;
+ list != &n->notifier_head; list = list->next) {
+ f = qb_list_entry(list, struct qb_map_notifier, list);
+
+ if (f->events == events &&
+ f->callback == fn &&
+ f->user_data == user_data) {
+ return -EEXIST;
+ }
+ }
+
f = malloc(sizeof(struct qb_map_notifier));
if (f == NULL) {
return -errno;
diff --git a/lib/trie.c b/lib/trie.c
index 90f66dd..3283d12 100644
--- a/lib/trie.c
+++ b/lib/trie.c
@@ -309,6 +309,7 @@ trie_notify_add(qb_map_t * m, const char *key,
struct trie *t = (struct trie *)m;
struct qb_map_notifier *f;
struct trie_node *n;
+ struct qb_list_head *list;
if (key) {
n = trie_lookup(t, key, QB_TRUE);
@@ -316,6 +317,17 @@ trie_notify_add(qb_map_t * m, const char *key,
n = t->header;
}
if (n) {
+ for (list = n->notifier_head.next;
+ list != &n->notifier_head; list = list->next) {
+ f = qb_list_entry(list, struct qb_map_notifier, list);
+
+ if (f->events == events &&
+ f->callback == fn &&
+ f->user_data == user_data) {
+ return -EEXIST;
+ }
+ }
+
f = malloc(sizeof(struct qb_map_notifier));
if (f == NULL) {
return -errno;
diff --git a/tests/check_map.c b/tests/check_map.c
index 7d4f316..815b321 100644
--- a/tests/check_map.c
+++ b/tests/check_map.c
@@ -313,6 +313,15 @@ test_map_notifications_basic(qb_map_t *m)
QB_MAP_NOTIFY_REPLACED|
QB_MAP_NOTIFY_RECURSIVE));
ck_assert_int_eq(i, -ENOENT);
+
+/* test uniquess */
+ qb_map_put(m, "fred", "null");
+ i = qb_map_notify_add(m, "fred", my_map_notification,
+ QB_MAP_NOTIFY_REPLACED, m);
+ ck_assert_int_eq(i, 0);
+ i = qb_map_notify_add(m, "fred", my_map_notification,
+ QB_MAP_NOTIFY_REPLACED, m);
+ ck_assert_int_eq(i, -EEXIST);
}
static void
--
1.7.7.3