diff options
Diffstat (limited to 'src/pulsecore/shared.c')
-rw-r--r-- | src/pulsecore/shared.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/pulsecore/shared.c b/src/pulsecore/shared.c new file mode 100644 index 00000000..77d919d3 --- /dev/null +++ b/src/pulsecore/shared.c @@ -0,0 +1,138 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + PulseAudio is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <pulse/xmalloc.h> +#include <pulsecore/log.h> +#include <pulsecore/macro.h> + +#include "shared.h" + +typedef struct pa_shared { + char *name; /* Points to memory allocated by the shared property system */ + void *data; /* Points to memory maintained by the caller */ +} pa_shared; + +/* Allocate a new shared property object */ +static pa_shared* shared_new(const char *name, void *data) { + pa_shared* p; + + pa_assert(name); + pa_assert(data); + + p = pa_xnew(pa_shared, 1); + p->name = pa_xstrdup(name); + p->data = data; + + return p; +} + +/* Free a shared property object */ +static void shared_free(pa_shared *p) { + pa_assert(p); + + pa_xfree(p->name); + pa_xfree(p); +} + +void* pa_shared_get(pa_core *c, const char *name) { + pa_shared *p; + + pa_assert(c); + pa_assert(name); + pa_assert(c->shared); + + if (!(p = pa_hashmap_get(c->shared, name))) + return NULL; + + return p->data; +} + +int pa_shared_set(pa_core *c, const char *name, void *data) { + pa_shared *p; + + pa_assert(c); + pa_assert(name); + pa_assert(data); + pa_assert(c->shared); + + if (pa_hashmap_get(c->shared, name)) + return -1; + + p = shared_new(name, data); + pa_hashmap_put(c->shared, p->name, p); + return 0; +} + +int pa_shared_remove(pa_core *c, const char *name) { + pa_shared *p; + + pa_assert(c); + pa_assert(name); + pa_assert(c->shared); + + if (!(p = pa_hashmap_remove(c->shared, name))) + return -1; + + shared_free(p); + return 0; +} + +void pa_shared_init(pa_core *c) { + pa_assert(c); + + c->shared = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); +} + +void pa_shared_cleanup(pa_core *c) { + pa_assert(c); + + if (!c->shared) + return; + + pa_assert(pa_hashmap_isempty(c->shared)); + + pa_hashmap_free(c->shared, NULL, NULL); + c->shared = NULL; + +} + +void pa_shared_dump(pa_core *c, pa_strbuf *s) { + void *state = NULL; + pa_shared *p; + + pa_assert(c); + pa_assert(s); + + while ((p = pa_hashmap_iterate(c->shared, &state, NULL))) + pa_strbuf_printf(s, "[%s] -> [%p]\n", p->name, p->data); +} + +int pa_shared_replace(pa_core *c, const char *name, void *data) { + pa_assert(c); + pa_assert(name); + + pa_shared_remove(c, name); + return pa_shared_set(c, name, data); +} |