diff options
author | Lennart Poettering <lennart@poettering.net> | 2004-08-04 16:42:37 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2004-08-04 16:42:37 +0000 |
commit | 839f99ffbf5b01e585845a061830a6fa5f0743dc (patch) | |
tree | fb5bc8e07b337b7454dc897d2cc56e840b56e592 /polyp/autoload.c | |
parent | 46091a9237f17f4295dca7140d8d70b4fce8b357 (diff) |
forgot some files
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@104 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'polyp/autoload.c')
-rw-r--r-- | polyp/autoload.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/polyp/autoload.c b/polyp/autoload.c new file mode 100644 index 00000000..f0d70d2d --- /dev/null +++ b/polyp/autoload.c @@ -0,0 +1,74 @@ +#include <assert.h> +#include <stdlib.h> +#include <string.h> + +#include "autoload.h" +#include "module.h" +#include "xmalloc.h" + +static void entry_free(struct pa_autoload_entry *e) { + assert(e); + pa_xfree(e->name); + pa_xfree(e->module); + pa_xfree(e->argument); + pa_xfree(e); +} + +void pa_autoload_add(struct pa_core *c, const char*name, enum pa_namereg_type type, const char*module, const char *argument) { + struct pa_autoload_entry *e = NULL; + assert(c && name && module); + + if (c->autoload_hashmap && (e = pa_hashmap_get(c->autoload_hashmap, name))) { + pa_xfree(e->module); + pa_xfree(e->argument); + } else { + e = pa_xmalloc(sizeof(struct pa_autoload_entry)); + e->name = pa_xstrdup(name); + + if (!c->autoload_hashmap) + c->autoload_hashmap = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + assert(c->autoload_hashmap); + + pa_hashmap_put(c->autoload_hashmap, e->name, e); + } + + e->module = pa_xstrdup(module); + e->argument = pa_xstrdup(argument); + e->type = type; +} + +int pa_autoload_remove(struct pa_core *c, const char*name, enum pa_namereg_type type) { + struct pa_autoload_entry *e; + assert(c && name && type); + + if (!c->autoload_hashmap || !(e = pa_hashmap_get(c->autoload_hashmap, name))) + return -1; + + pa_hashmap_remove(c->autoload_hashmap, e->name); + entry_free(e); + return 0; +} + +void pa_autoload_request(struct pa_core *c, const char *name, enum pa_namereg_type type) { + struct pa_autoload_entry *e; + struct pa_module *m; + assert(c && name); + + if (!c->autoload_hashmap || !(e = pa_hashmap_get(c->autoload_hashmap, name)) || (e->type != type)) + return; + + if ((m = pa_module_load(c, e->module, e->argument))) + m->auto_unload = 1; +} + +static void free_func(void *p, void *userdata) { + struct pa_autoload_entry *e = p; + entry_free(e); +} + +void pa_autoload_free(struct pa_core *c) { + if (!c->autoload_hashmap) + return; + + pa_hashmap_free(c->autoload_hashmap, free_func, NULL); +} |