From 700b12b89dfbe4c03a5497a361372d37ac90fc94 Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Tue, 4 Sep 2012 19:05:45 +0200 Subject: [PATCH] static: move hook into separate independent header This makes the hook implementation independent of any other code or header so you do not have to link to libkmscon-static when using it. Signed-off-by: David Herrmann --- Makefile.am | 1 + src/static_hook.h | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/static_misc.c | 112 ------------------------------------ src/static_misc.h | 17 +----- 4 files changed, 167 insertions(+), 128 deletions(-) create mode 100644 src/static_hook.h diff --git a/Makefile.am b/Makefile.am index 9019bd1..95b2d17 100644 --- a/Makefile.am +++ b/Makefile.am @@ -299,6 +299,7 @@ include_HEADERS += \ libkmscon_static_la_SOURCES = \ src/static_llog.h \ src/static_dlist.h \ + src/static_hook.h \ src/static_misc.h \ src/static_misc.c \ external/htable.h \ diff --git a/src/static_hook.h b/src/static_hook.h new file mode 100644 index 0000000..07c5bf1 --- /dev/null +++ b/src/static_hook.h @@ -0,0 +1,165 @@ +/* + * kmscon - Hook Handling + * + * Copyright (c) 2011-2012 David Herrmann + * Copyright (c) 2011 University of Tuebingen + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * Simply hook-implementation + */ + +#ifndef KMSCON_STATIC_HOOK_H +#define KMSCON_STATIC_HOOK_H + +#include +#include +#include +#include +#include +#include + +struct kmscon_hook; +struct kmscon_hook_entry; +typedef void (*kmscon_hook_cb) (void *parent, void *arg, void *data); + +#define kmscon_hook_add_cast(hook, cb, data) \ + kmscon_hook_add((hook), (kmscon_hook_cb)(cb), (data)) +#define kmscon_hook_rm_cast(hook, cb, data) \ + kmscon_hook_rm((hook), (kmscon_hook_cb)(cb), (data)) + +struct kmscon_hook_entry { + struct kmscon_hook_entry *next; + kmscon_hook_cb cb; + void *data; +}; + +struct kmscon_hook { + unsigned int num; + struct kmscon_hook_entry *entries; + struct kmscon_hook_entry *cur_entry; +}; + +static inline int kmscon_hook_new(struct kmscon_hook **out) +{ + struct kmscon_hook *hook; + + if (!out) + return -EINVAL; + + hook = malloc(sizeof(*hook)); + if (!hook) + return -ENOMEM; + memset(hook, 0, sizeof(*hook)); + + *out = hook; + return 0; +} + +static inline void kmscon_hook_free(struct kmscon_hook *hook) +{ + struct kmscon_hook_entry *entry; + + if (!hook) + return; + + while ((entry = hook->entries)) { + hook->entries = entry->next; + free(entry); + } + + free(hook); +} + +static inline unsigned int kmscon_hook_num(struct kmscon_hook *hook) +{ + if (!hook) + return 0; + + return hook->num; +} + +static inline int kmscon_hook_add(struct kmscon_hook *hook, kmscon_hook_cb cb, + void *data) +{ + struct kmscon_hook_entry *entry; + + if (!hook || !cb) + return -EINVAL; + + entry = malloc(sizeof(*entry)); + if (!entry) + return -ENOMEM; + memset(entry, 0, sizeof(*entry)); + entry->cb = cb; + entry->data = data; + + entry->next = hook->entries; + hook->entries = entry; + hook->num++; + return 0; +} + +static inline void kmscon_hook_rm(struct kmscon_hook *hook, kmscon_hook_cb cb, + void *data) +{ + struct kmscon_hook_entry *entry, *tmp; + + if (!hook || !cb || !hook->entries) + return; + + tmp = NULL; + if (hook->entries->cb == cb && hook->entries->data == data) { + tmp = hook->entries; + hook->entries = tmp->next; + } else for (entry = hook->entries; entry->next; entry = entry->next) { + if (entry->next->cb == cb && entry->next->data == data) { + tmp = entry->next; + entry->next = tmp->next; + break; + } + } + + if (tmp) { + /* if *_call() is currently running we must not disturb it */ + if (hook->cur_entry == tmp) + hook->cur_entry = tmp->next; + free(tmp); + hook->num--; + } +} + +static inline void kmscon_hook_call(struct kmscon_hook *hook, void *parent, + void *arg) +{ + if (!hook) + return; + + hook->cur_entry = hook->entries; + while (hook->cur_entry) { + hook->cur_entry->cb(parent, arg, hook->cur_entry->data); + if (hook->cur_entry) + hook->cur_entry = hook->cur_entry->next; + } +} + +#endif /* KMSCON_STATIC_HOOK_H */ diff --git a/src/static_misc.c b/src/static_misc.c index 93fe42c..00964de 100644 --- a/src/static_misc.c +++ b/src/static_misc.c @@ -169,118 +169,6 @@ next: } } -struct hook_entry { - struct hook_entry *next; - kmscon_hook_cb cb; - void *data; -}; - -struct kmscon_hook { - unsigned int num; - struct hook_entry *entries; - struct hook_entry *cur_entry; -}; - -int kmscon_hook_new(struct kmscon_hook **out) -{ - struct kmscon_hook *hook; - - if (!out) - return -EINVAL; - - hook = malloc(sizeof(*hook)); - if (!hook) - return -ENOMEM; - memset(hook, 0, sizeof(*hook)); - - *out = hook; - return 0; -} - -void kmscon_hook_free(struct kmscon_hook *hook) -{ - struct hook_entry *entry; - - if (!hook) - return; - - while ((entry = hook->entries)) { - hook->entries = entry->next; - free(entry); - } - - free(hook); -} - -unsigned int kmscon_hook_num(struct kmscon_hook *hook) -{ - if (!hook) - return 0; - - return hook->num; -} - -int kmscon_hook_add(struct kmscon_hook *hook, kmscon_hook_cb cb, void *data) -{ - struct hook_entry *entry; - - if (!hook || !cb) - return -EINVAL; - - entry = malloc(sizeof(*entry)); - if (!entry) - return -ENOMEM; - memset(entry, 0, sizeof(*entry)); - entry->cb = cb; - entry->data = data; - - entry->next = hook->entries; - hook->entries = entry; - hook->num++; - return 0; -} - -void kmscon_hook_rm(struct kmscon_hook *hook, kmscon_hook_cb cb, void *data) -{ - struct hook_entry *entry, *tmp; - - if (!hook || !cb || !hook->entries) - return; - - tmp = NULL; - if (hook->entries->cb == cb && hook->entries->data == data) { - tmp = hook->entries; - hook->entries = tmp->next; - } else for (entry = hook->entries; entry->next; entry = entry->next) { - if (entry->next->cb == cb && entry->next->data == data) { - tmp = entry->next; - entry->next = tmp->next; - break; - } - } - - if (tmp) { - /* if *_call() is currently running we must not disturb it */ - if (hook->cur_entry == tmp) - hook->cur_entry = tmp->next; - free(tmp); - hook->num--; - } -} - -void kmscon_hook_call(struct kmscon_hook *hook, void *parent, void *arg) -{ - if (!hook) - return; - - hook->cur_entry = hook->entries; - while (hook->cur_entry) { - hook->cur_entry->cb(parent, arg, hook->cur_entry->data); - if (hook->cur_entry) - hook->cur_entry = hook->cur_entry->next; - } -} - struct kmscon_hashentry { void *key; void *value; diff --git a/src/static_misc.h b/src/static_misc.h index 1b9b766..3e3ea84 100644 --- a/src/static_misc.h +++ b/src/static_misc.h @@ -37,6 +37,7 @@ #include #include #include "static_dlist.h" +#include "static_hook.h" /* ring buffer for arbitrary byte-streams */ @@ -50,22 +51,6 @@ int kmscon_ring_write(struct kmscon_ring *ring, const char *val, size_t len); const char *kmscon_ring_peek(struct kmscon_ring *ring, size_t *len); void kmscon_ring_drop(struct kmscon_ring *ring, size_t len); -/* callback hooks */ - -struct kmscon_hook; -typedef void (*kmscon_hook_cb) (void *parent, void *arg, void *data); - -int kmscon_hook_new(struct kmscon_hook **out); -void kmscon_hook_free(struct kmscon_hook *hook); -unsigned int kmscon_hook_num(struct kmscon_hook *hook); -int kmscon_hook_add(struct kmscon_hook *hook, kmscon_hook_cb cb, void *data); -void kmscon_hook_rm(struct kmscon_hook *hook, kmscon_hook_cb cb, void *data); -void kmscon_hook_call(struct kmscon_hook *hook, void *parent, void *arg); -#define kmscon_hook_add_cast(hook, cb, data) \ - kmscon_hook_add((hook), (kmscon_hook_cb)(cb), (data)) -#define kmscon_hook_rm_cast(hook, cb, data) \ - kmscon_hook_rm((hook), (kmscon_hook_cb)(cb), (data)) - /* hash-tables */ struct kmscon_hashtable; -- 2.7.4