summaryrefslogtreecommitdiff
path: root/tests/test_astobj2.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2012-02-28 00:42:38 +0000
committerRichard Mudgett <rmudgett@digium.com>2012-02-28 00:42:38 +0000
commit50c8557f03a31ade74147998058110c601f30a75 (patch)
tree10c289a7bd5124b7ea9418f3ce988975228e554e /tests/test_astobj2.c
parentae07610d73c329312bbb393573ac0f0ba4d8853d (diff)
Add ability to clone ao2 containers.
Occasionally there is a need to put all objects in one container also into another container. Some reasons you might need to do this: 1) You need to reconfigure a container. You would do this by creating a new container with the new configuration and ao2_container_dup the old container into it. Then replace the old container with the new. Then destroy the old container. 2) You need the contents of a container to remain stable while operating on all of the objects. You would do this by creating a cloned container of the original with ao2_container_clone. The cloned container is a snapshot of the objects at the time of the cloning. When done, just destroy the cloned container. Review: https://reviewboard.asterisk.org/r/1746/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@357145 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'tests/test_astobj2.c')
-rw-r--r--tests/test_astobj2.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/tests/test_astobj2.c b/tests/test_astobj2.c
index 860c56957..05b91324f 100644
--- a/tests/test_astobj2.c
+++ b/tests/test_astobj2.c
@@ -109,9 +109,11 @@ static int astobj2_test_helper(int use_hash, int use_cmp, unsigned int lim, stru
{
struct ao2_container *c1;
struct ao2_container *c2;
+ struct ao2_container *c3 = NULL;
struct ao2_iterator it;
struct ao2_iterator *mult_it;
struct test_obj *obj;
+ struct test_obj *obj2;
struct test_obj tmp_obj;
int bucket_size;
int increment = 0;
@@ -154,6 +156,44 @@ static int astobj2_test_helper(int use_hash, int use_cmp, unsigned int lim, stru
ast_test_status_update(test, "Container created: random bucket size %d: number of items: %d\n", bucket_size, lim);
+ /* Testing ao2_container_clone */
+ c3 = ao2_container_clone(c1, 0);
+ if (!c3) {
+ ast_test_status_update(test, "ao2_container_clone failed.\n");
+ res = AST_TEST_FAIL;
+ goto cleanup;
+ }
+ if (ao2_container_count(c1) != ao2_container_count(c3)) {
+ ast_test_status_update(test, "Cloned container does not have the same number of objects.\n");
+ res = AST_TEST_FAIL;
+ } else {
+ it = ao2_iterator_init(c1, 0);
+ for (; (obj = ao2_t_iterator_next(&it, "test orig")); ao2_t_ref(obj, -1, "test orig")) {
+ /*
+ * Unlink the matching object from the cloned container to make
+ * the next search faster. This is a big speed optimization!
+ * It reduces the container with 100000 objects test time from
+ * 18 seconds to 200 ms.
+ */
+ obj2 = ao2_t_callback(c3, OBJ_POINTER | OBJ_UNLINK, ao2_match_by_addr, obj,
+ "test clone");
+ if (obj2) {
+ ao2_t_ref(obj2, -1, "test clone");
+ continue;
+ }
+ ast_test_status_update(test,
+ "Orig container has an object %p not in the clone container.\n", obj);
+ res = AST_TEST_FAIL;
+ }
+ ao2_iterator_destroy(&it);
+ if (ao2_container_count(c3)) {
+ ast_test_status_update(test, "Cloned container still has objects.\n");
+ res = AST_TEST_FAIL;
+ }
+ }
+ ao2_t_ref(c3, -1, "bye c3");
+ c3 = NULL;
+
/* Testing ao2_find with no flags */
num = 100;
for (; num; num--) {
@@ -336,6 +376,9 @@ cleanup:
if (c2) {
ao2_t_ref(c2, -1, "bye c2");
}
+ if (c3) {
+ ao2_t_ref(c3, -1, "bye c3");
+ }
if (destructor_count > 0) {
ast_test_status_update(test, "all destructors were not called, destructor count is %d\n", destructor_count);