diff options
author | Maarten Bosmans <mkbosmans@gmail.com> | 2011-11-18 10:19:34 +0100 |
---|---|---|
committer | Tanu Kaskinen <tanuk@iki.fi> | 2012-01-21 20:08:57 +0200 |
commit | 6450ac2e6ace98cb8f8e577b06735241d6d43a31 (patch) | |
tree | a6bedd3ed61f431c81dde8b770dd7962c9ed7a1f | |
parent | c5dcf5723b6ce63e0788148c683953a09448b483 (diff) |
Remove pa_prioq priority queue implementation
-rw-r--r-- | src/.gitignore | 1 | ||||
-rw-r--r-- | src/Makefile.am | 9 | ||||
-rw-r--r-- | src/pulsecore/prioq.c | 256 | ||||
-rw-r--r-- | src/pulsecore/prioq.h | 62 | ||||
-rw-r--r-- | src/tests/prioq-test.c | 47 |
5 files changed, 1 insertions, 374 deletions
diff --git a/src/.gitignore b/src/.gitignore index 4a669698..cbde0677 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -51,7 +51,6 @@ mix-test once-test pacat-simple parec-simple -prioq-test proplist-test queue-test remix-test diff --git a/src/Makefile.am b/src/Makefile.am index 02635faa..521bf50a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -238,8 +238,7 @@ TESTS_default = \ volume-test \ mix-test \ proplist-test \ - lock-autospawn-test \ - prioq-test + lock-autospawn-test TESTS_norun = \ mcalign-test \ @@ -493,11 +492,6 @@ lock_autospawn_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse lock_autospawn_test_CFLAGS = $(AM_CFLAGS) lock_autospawn_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) -prioq_test_SOURCES = tests/prioq-test.c -prioq_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la -prioq_test_CFLAGS = $(AM_CFLAGS) -prioq_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) - sigbus_test_SOURCES = tests/sigbus-test.c sigbus_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la sigbus_test_CFLAGS = $(AM_CFLAGS) @@ -584,7 +578,6 @@ libpulsecommon_@PA_MAJORMINOR@_la_SOURCES = \ pulsecore/pid.c pulsecore/pid.h \ pulsecore/pipe.c pulsecore/pipe.h \ pulsecore/poll.c pulsecore/poll.h \ - pulsecore/prioq.c pulsecore/prioq.h \ pulsecore/memtrap.c pulsecore/memtrap.h \ pulsecore/aupdate.c pulsecore/aupdate.h \ pulsecore/proplist-util.c pulsecore/proplist-util.h \ diff --git a/src/pulsecore/prioq.c b/src/pulsecore/prioq.c deleted file mode 100644 index 983db0f1..00000000 --- a/src/pulsecore/prioq.c +++ /dev/null @@ -1,256 +0,0 @@ -/*** - This file is part of PulseAudio. - - Copyright 2008 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.1 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/flist.h> - -#include "prioq.h" - -struct pa_prioq_item { - void *value; - unsigned idx; -}; - -struct pa_prioq { - pa_prioq_item **items; - unsigned n_items; - unsigned n_allocated; - pa_compare_func_t compare_func; -}; - -PA_STATIC_FLIST_DECLARE(items, 0, pa_xfree); - -pa_prioq *pa_prioq_new(pa_compare_func_t compare_func) { - - pa_prioq *q; - - q = pa_xnew(pa_prioq, 1); - q->compare_func = compare_func; - q->n_items = 0; - q->n_allocated = 64; - q->items = pa_xnew(pa_prioq_item*, q->n_allocated); - - return q; -} - -void pa_prioq_free(pa_prioq *q, pa_free2_cb_t free_cb, void *userdata) { - pa_prioq_item **i, **e; - - pa_assert(q); - - for (i = q->items, e = q->items + q->n_items; i < e; i++) { - - if (!*i) - continue; - - if (free_cb) - free_cb((*i)->value, userdata); - - pa_xfree(*i); - } - - pa_xfree(q->items); - pa_xfree(q); -} - -static void shuffle_up(pa_prioq *q, pa_prioq_item *i) { - unsigned j; - - pa_assert(q); - pa_assert(i); - - j = i->idx; - - while (j > 0) { - unsigned k; - - k = (j-1)/2; - - if (q->compare_func(q->items[k]->value, i->value) < 0) - break; - - q->items[k]->idx = j; - q->items[j] = q->items[k]; - - j = k; - } - - i->idx = j; - q->items[j] = i; - -} - -pa_prioq_item* pa_prioq_put(pa_prioq *q, void *p) { - pa_prioq_item *i; - - pa_assert(q); - - if (q->n_items >= q->n_allocated) { - q->n_allocated = PA_MAX(q->n_items+1, q->n_allocated)*2; - q->items = pa_xrealloc(q->items, sizeof(pa_prioq_item*) * q->n_allocated); - } - - if (!(i = pa_flist_pop(PA_STATIC_FLIST_GET(items)))) - i = pa_xnew(pa_prioq_item, 1); - - i->value = p; - i->idx = q->n_items++; - - shuffle_up(q, i); - - return i; -} - -void* pa_prioq_peek(pa_prioq *q) { - pa_assert(q); - - if (q->n_items <= 0) - return NULL; - - return q->items[0]->value; -} - -void* pa_prioq_pop(pa_prioq *q){ - pa_assert(q); - - if (q->n_items <= 0) - return NULL; - - return pa_prioq_remove(q, q->items[0]); -} - -static void swap(pa_prioq *q, unsigned j, unsigned k) { - pa_prioq_item *t; - - pa_assert(q); - pa_assert(j < q->n_items); - pa_assert(k < q->n_items); - - pa_assert(q->items[j]->idx == j); - pa_assert(q->items[k]->idx == k); - - t = q->items[j]; - - q->items[j]->idx = k; - q->items[j] = q->items[k]; - - q->items[k]->idx = j; - q->items[k] = t; -} - -static void shuffle_down(pa_prioq *q, unsigned idx) { - - pa_assert(q); - pa_assert(idx < q->n_items); - - for (;;) { - unsigned j, k, s; - - k = (idx+1)*2; /* right child */ - j = k-1; /* left child */ - - if (j >= q->n_items) - break; - - if (q->compare_func(q->items[j]->value, q->items[idx]->value) < 0) - - /* So our left child is smaller than we are, let's - * remember this fact */ - s = j; - else - s = idx; - - if (k < q->n_items && - q->compare_func(q->items[k]->value, q->items[s]->value) < 0) - - /* So our right child is smaller than we are, let's - * remember this fact */ - s = k; - - /* s now points to the smallest of the three items */ - - if (s == idx) - /* No swap necessary, we're done */ - break; - - swap(q, idx, s); - idx = s; - } -} - -void* pa_prioq_remove(pa_prioq *q, pa_prioq_item *i) { - void *p; - - pa_assert(q); - pa_assert(i); - pa_assert(q->n_items >= 1); - - p = i->value; - - if (q->n_items-1 == i->idx) { - /* We are the last entry, so let's just remove us and good */ - q->n_items--; - - } else { - - /* We are not the last entry, we need to replace ourselves - * with the last node and reshuffle */ - - q->items[i->idx] = q->items[q->n_items-1]; - q->items[i->idx]->idx = i->idx; - q->n_items--; - - shuffle_down(q, i->idx); - } - - if (pa_flist_push(PA_STATIC_FLIST_GET(items), i) < 0) - pa_xfree(i); - - return p; -} - -unsigned pa_prioq_size(pa_prioq *q) { - pa_assert(q); - - return q->n_items; -} - -pa_bool_t pa_prioq_isempty(pa_prioq *q) { - pa_assert(q); - - return q->n_items == 0; -} - -void pa_prioq_reshuffle(pa_prioq *q, pa_prioq_item *i) { - pa_assert(q); - pa_assert(i); - - /* This will move the entry down as far as necessary */ - shuffle_down(q, i->idx); - - /* And this will move the entry up as far as necessary */ - shuffle_up(q, i); -} diff --git a/src/pulsecore/prioq.h b/src/pulsecore/prioq.h deleted file mode 100644 index b7c2cdf7..00000000 --- a/src/pulsecore/prioq.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef foopulsecoreprioqhfoo -#define foopulsecoreprioqhfoo - -/*** - This file is part of PulseAudio. - - Copyright 2008 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.1 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 - Lesser 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. -***/ - -#include <pulsecore/macro.h> -#include <pulsecore/idxset.h> - -/* A heap-based priority queue. Removal and insertion is O(log - * n). Removal can happen a the top or at any position referenced by a - * pa_prioq_item. */ - -typedef struct pa_prioq pa_prioq; -typedef struct pa_prioq_item pa_prioq_item; - -/* Instantiate a new prioq with the specified comparison functions */ -pa_prioq* pa_prioq_new(pa_compare_func_t compare_func); - -/* Free the prioq. When the prioq is not empty the specified function is called for every entry contained */ -void pa_prioq_free(pa_prioq *q, pa_free2_cb_t free_cb, void *userdata); - -/* Store a new item in the prioq. */ -pa_prioq_item* pa_prioq_put(pa_prioq *q, void* data); - -/* Get the item on the top of the queue, but don't remove it from the queue*/ -void* pa_prioq_peek(pa_prioq*q); - -/* Get the item on the top of the queue, and remove it from the queue */ -void* pa_prioq_pop(pa_prioq*q); - -/* Remove an arbitrary from the prioq, returning it's data */ -void* pa_prioq_remove(pa_prioq*q, pa_prioq_item *i); - -/* The priority of an item was modified. Adjust the queue to that */ -void pa_prioq_reshuffle(pa_prioq *q, pa_prioq_item *i); - -/* Return the current number of items in the prioq */ -unsigned pa_prioq_size(pa_prioq*s); - -/* Return TRUE of the prioq is empty */ -pa_bool_t pa_prioq_isempty(pa_prioq *s); - -#endif diff --git a/src/tests/prioq-test.c b/src/tests/prioq-test.c deleted file mode 100644 index bbcc92aa..00000000 --- a/src/tests/prioq-test.c +++ /dev/null @@ -1,47 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <pulsecore/prioq.h> -#include <pulsecore/log.h> -#include <pulsecore/macro.h> - -#define N 1024 - -int main(int argc, char *argv[]) { - pa_prioq *q; - unsigned i; - - srand(0); - - if (!getenv("MAKE_CHECK")) - pa_log_set_level(PA_LOG_DEBUG); - - q = pa_prioq_new(pa_idxset_trivial_compare_func); - - /* Fill in 1024 */ - for (i = 0; i < N; i++) - pa_prioq_put(q, PA_UINT_TO_PTR((unsigned) rand())); - - /* Remove half of it again */ - for (i = 0; i < N/2; i++){ - unsigned u = PA_PTR_TO_UINT(pa_prioq_pop(q)); - pa_log_debug("%16u", u); - } - - pa_log_debug("Refilling"); - - /* Fill in another 1024 */ - for (i = 0; i < N; i++) - pa_prioq_put(q, PA_UINT_TO_PTR((unsigned) rand())); - - /* Remove everything */ - while (!pa_prioq_isempty(q)) { - unsigned u = PA_PTR_TO_UINT(pa_prioq_pop(q)); - pa_log_debug("%16u", u); - } - - pa_prioq_free(q, NULL, NULL); - - return 0; -} |