[svn-commits] mmichelson: branch mmichelson/ao2_containers r141993 - in /team/mmichelson/ao...
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Tue Sep 9 02:08:08 CDT 2008
Author: mmichelson
Date: Tue Sep 9 02:08:07 2008
New Revision: 141993
URL: http://svn.digium.com/view/asterisk?view=rev&rev=141993
Log:
Adjust the linked list implementation so that instead
of having two versions of several functions, there is
now a direction variable which is passed to the
allocation function. This will determine how new items
are linked and which direction the version comparisons
should be when iterating
Modified:
team/mmichelson/ao2_containers/include/asterisk/astobj2.h
team/mmichelson/ao2_containers/main/astobj2_linkedlist.c
Modified: team/mmichelson/ao2_containers/include/asterisk/astobj2.h
URL: http://svn.digium.com/view/asterisk/team/mmichelson/ao2_containers/include/asterisk/astobj2.h?view=diff&rev=141993&r1=141992&r2=141993
==============================================================================
--- team/mmichelson/ao2_containers/include/asterisk/astobj2.h (original)
+++ team/mmichelson/ao2_containers/include/asterisk/astobj2.h Tue Sep 9 02:08:07 2008
@@ -678,8 +678,9 @@
struct ao2_container *ao2_hashtable_alloc(const uint n_buckets,
ao2_hash_fn *hash_fn, ao2_callback_fn *cmp_fn);
-struct ao2_container *ao2_linkedlist_alloc_front(ao2_callback_fn *cmp_fn);
-struct ao2_container *ao2_linkedlist_alloc_back(ao2_callback_fn *cmp_fn);
+#define AO2_LINKEDLIST_FRONT 1
+#define AO2_LINKEDLIST_BACK 2
+struct ao2_container *ao2_linkedlist_alloc(ao2_callback_fn *cmp_fn, int direction);
/*! \brief
* Returns the number of elements in a container.
Modified: team/mmichelson/ao2_containers/main/astobj2_linkedlist.c
URL: http://svn.digium.com/view/asterisk/team/mmichelson/ao2_containers/main/astobj2_linkedlist.c?view=diff&rev=141993&r1=141992&r2=141993
==============================================================================
--- team/mmichelson/ao2_containers/main/astobj2_linkedlist.c (original)
+++ team/mmichelson/ao2_containers/main/astobj2_linkedlist.c Tue Sep 9 02:08:07 2008
@@ -26,21 +26,17 @@
static void *linkedlist_iterator_next_front(struct ao2_iterator *a);
static void linkedlist_destroy(struct ao2_container *c);
-static const struct ao2_container_impl linkedlist_back_impl = {
- .link = linkedlist_link_back,
+static const struct ao2_container_impl linkedlist_impl = {
+ .link = linkedlist_link,
.callback = linkedlist_callback,
- .iterator_next = linkedlist_iterator_next_back,
+ .iterator_next = linkedlist_iterator_next,
.destroy = linkedlist_destroy,
};
-static const struct ao2_container_impl linkedlist_front_impl = {
- .link = linkedlist_link_front,
- .callback = linkedlist_callback,
- .iterator_next = linkedlist_iterator_next_front,
- .destroy = linkedlist_destroy,
-};
-
-AST_LIST_HEAD_NOLOCK(the_list, list_item);
+struct linkedlist_pvt {
+ AST_LIST_HEAD_NOLOCK(the_list, list_item);
+ int direction;
+}
struct list_item {
AST_LIST_ENTRY(list_item) entry;
@@ -48,46 +44,29 @@
struct astobj2 *astobj;
};
-struct ao2_container *ao2_linkedlist_alloc_back(ao2_callback_fn *cmp_fn)
+struct ao2_container *ao2_linkedlist_alloc_back(ao2_callback_fn *cmp_fn, int direction)
{
struct ao2_container *list = ao2_container_common_alloc(cmp_fn, &linkedlist_back_impl);
- struct the_list *new_list;
+ struct linkedlist_pvt *list_pvt;
if (!list) {
return NULL;
}
- if (!(new_list = ast_calloc(1, sizeof(*new_list)))) {
+ if (!(list_pvt = ast_calloc(1, sizeof(*new_list)))) {
ao2_ref(list, -1);
return NULL;
}
- list->private = new_list;
- return list;
-}
-
-struct ao2_container *ao2_linkedlist_alloc_front(ao2_callback_fn *cmp_fn)
-{
- struct ao2_container *list = ao2_container_common_alloc(cmp_fn, &linkedlist_front_impl);
- struct the_list *new_list;
-
- if (!list) {
- return NULL;
- }
-
- if (!(new_list = ast_calloc(1, sizeof(*new_list)))) {
- ao2_ref(list, -1);
- return NULL;
- }
-
- list->private = new_list;
+ list_pvt->direction = direction;
+ list->private = list_pvt;
return list;
}
static void *linkedlist_link_back(struct ao2_container *c, struct astobj2 *newobj)
{
struct list_item *item = ast_calloc(1, sizeof(*item));
- struct the_list *list = c->private;
+ struct linkedlist_pvt *list_pvt = c->private;
if (!item) {
return NULL;
@@ -96,23 +75,11 @@
item->astobj = newobj;
item->version = ast_atomic_fetchadd_int(&c->version, 1);
- AST_LIST_INSERT_TAIL(list, item, entry);
- return item;
-}
-
-static void *linkedlist_link_front(struct ao2_container *c, struct astobj2 *newobj)
-{
- struct list_item *item = ast_calloc(1, sizeof(*item));
- struct the_list *list = c->private;
-
- if (!item) {
- return NULL;
+ if (list_pvt->direction == AO2_LINKEDLIST_BACK) {
+ AST_LIST_INSERT_TAIL(list, item, entry);
+ } else {
+ AST_LIST_INSERT_HEAD(list, item, entry);
}
-
- item->astobj = newobj;
- item->version = ast_atomic_fetchadd_int(&c->version, 1);
-
- AST_LIST_INSERT_HEAD(list, item, entry);
return item;
}
@@ -168,8 +135,11 @@
}
AST_LIST_TRAVERSE(list, item, entry) {
- if (item->version > a->version)
+ if (list_pvt->direction == AO2_LINKEDLIST_BACK && item->version > a->version) {
goto found;
+ } else if (list_pvt->direction == AO2_LINKEDLIST_FRONT && item->version < a->version) {
+ goto found;
+ }
}
found:
@@ -183,34 +153,6 @@
return ret;
}
-static void *linkedlist_iterator_next_front(struct ao2_iterator *a)
-{
- struct the_list *list = a->c->private;
- struct list_item *item;
- void* ret = NULL;
-
- if (a->c->version == a->c_version && (item = a->obj)) {
- if ((item = AST_LIST_NEXT(item, entry))) {
- goto found;
- }
- a->obj = NULL;
- }
-
- AST_LIST_TRAVERSE(list, item, entry) {
- if (item->version < a->version)
- goto found;
- }
-
-found:
- if (item) {
- a->version = item->version;
- a->obj = item;
- a->c_version = a->c->version;
- ret = item->astobj;
- }
-
- return ret;
-}
static void linkedlist_destroy(struct ao2_container *c)
{
struct the_list *list = c->private;
More information about the svn-commits
mailing list