diff options
-rw-r--r-- | common/collection/collection.c | 49 | ||||
-rw-r--r-- | common/collection/collection.h | 6 | ||||
-rw-r--r-- | common/collection/collection_ut.c | 13 |
3 files changed, 47 insertions, 21 deletions
diff --git a/common/collection/collection.c b/common/collection/collection.c index 27dee8364..c8a007795 100644 --- a/common/collection/collection.c +++ b/common/collection/collection.c @@ -1171,7 +1171,9 @@ static void col_delete_collection(struct collection_item *ci) return; } - TRACE_INFO_STRING("Real work to do",""); + TRACE_INFO_STRING("Real work to do", ""); + TRACE_INFO_STRING("Property", ci->property); + TRACE_INFO_NUMBER("Next item", ci->next); col_delete_collection(ci->next); @@ -2247,8 +2249,11 @@ void col_destroy_collection(struct collection_item *ci) return; } + TRACE_INFO_STRING("Name:", ci->property); + /* Collection can be referenced by other collection */ header = (struct collection_header *)(ci->data); + TRACE_INFO_NUMBER("Reference count:", header->reference_count); if (header->reference_count > 1) { TRACE_INFO_STRING("Dereferencing a referenced collection.", ""); header->reference_count--; @@ -2376,29 +2381,35 @@ int col_get_collection_reference(struct collection_item *ci, if ((ci == NULL) || (ci->type != COL_TYPE_COLLECTION) || - (acceptor == NULL) || - (collection_to_find == NULL)) { + (acceptor == NULL)) { TRACE_ERROR_NUMBER("Invalid parameter - returning error",EINVAL); return EINVAL; } - /* Find a sub collection */ - TRACE_INFO_STRING("We are given subcollection name - search it:", - collection_to_find); - error = col_find_item_and_do(ci, collection_to_find, - COL_TYPE_COLLECTIONREF, - COL_TRAVERSE_DEFAULT, - col_get_subcollection, - (void *)(&subcollection), - COLLECTION_ACTION_FIND); - if (error) { - TRACE_ERROR_NUMBER("Search failed returning error", error); - return error; - } + if (collection_to_find) { + /* Find a sub collection */ + TRACE_INFO_STRING("We are given subcollection name - search it:", + collection_to_find); + error = col_find_item_and_do(ci, collection_to_find, + COL_TYPE_COLLECTIONREF, + COL_TRAVERSE_DEFAULT, + col_get_subcollection, + (void *)(&subcollection), + COLLECTION_ACTION_FIND); + if (error) { + TRACE_ERROR_NUMBER("Search failed returning error", error); + return error; + } - if (subcollection == NULL) { - TRACE_ERROR_STRING("Search for subcollection returned NULL pointer", ""); - return ENOENT; + if (subcollection == NULL) { + TRACE_ERROR_STRING("Search for subcollection returned NULL pointer", ""); + return ENOENT; + } + } + else { + /* Create reference to the same collection */ + TRACE_INFO_STRING("Creating reference to the top level collection.", ""); + subcollection = ci; } header = (struct collection_header *)subcollection->data; diff --git a/common/collection/collection.h b/common/collection/collection.h index 2e2fe642f..665d5f00c 100644 --- a/common/collection/collection.h +++ b/common/collection/collection.h @@ -686,8 +686,10 @@ int col_is_item_in_collection(struct collection_item *ci, /* Collection to fin int *found); /* Boolean that turns to nonzero if the match is found */ -/* Get collection - get a pointer to a collection included into another collection */ -/* Delete extracted collection after use to decrease reference count. */ +/* Get collection - get a pointer to a collection included into another collection. + * If the collection_to_find is NULL function reterns a reference to the top level collection. + * Delete extracted collection after use to decrease reference count. + */ int col_get_collection_reference(struct collection_item *ci, /* High level collection */ struct collection_item **acceptor, /* The pointer that will accept extracted handle */ const char *collection_to_find); /* Name to of the collection */ diff --git a/common/collection/collection_ut.c b/common/collection/collection_ut.c index 1e91c2326..86620550d 100644 --- a/common/collection/collection_ut.c +++ b/common/collection/collection_ut.c @@ -33,6 +33,7 @@ int ref_collection_test(void) { struct collection_item *peer = NULL; struct collection_item *socket = NULL; + struct collection_item *socket2 = NULL; char binary_dump[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; int error = EOK; @@ -98,7 +99,19 @@ int ref_collection_test(void) col_destroy_collection(peer); col_debug_collection(socket, COL_TRAVERSE_DEFAULT); + + error = col_get_collection_reference(socket, &socket2, NULL); + if (error) { + col_destroy_collection(socket); + printf("Failed to extract collection. Error %d\n", error); + return error; + } + + col_debug_collection(socket2, COL_TRAVERSE_DEFAULT); col_destroy_collection(socket); + col_debug_collection(socket2, COL_TRAVERSE_DEFAULT); + col_destroy_collection(socket2); + TRACE_FLOW_NUMBER("ref_collection_test. Returning", error); printf("\n\nEND OF REF TEST!!!.\n\n\n"); |