You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2019/09/10 19:14:42 UTC

[celix] branch develop updated: Improved deletion of http admin services (#47)

This is an automated email from the ASF dual-hosted git repository.

pnoltes pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/celix.git


The following commit(s) were added to refs/heads/develop by this push:
     new 49f0fd8  Improved deletion of http admin services (#47)
49f0fd8 is described below

commit 49f0fd8c47aa45fe007af47c121147d2b39200d4
Author: dhbfischer <52...@users.noreply.github.com>
AuthorDate: Tue Sep 10 21:14:37 2019 +0200

    Improved deletion of http admin services (#47)
---
 bundles/http_admin/http_admin/src/http_admin.c     |  2 +-
 bundles/http_admin/http_admin/src/service_tree.c   | 51 +++++++++++-----------
 bundles/http_admin/http_admin/src/service_tree.h   |  3 +-
 .../http_admin/http_admin/src/websocket_admin.c    |  4 +-
 4 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/bundles/http_admin/http_admin/src/http_admin.c b/bundles/http_admin/http_admin/src/http_admin.c
index 5f0fad4..1f8bf6d 100755
--- a/bundles/http_admin/http_admin/src/http_admin.c
+++ b/bundles/http_admin/http_admin/src/http_admin.c
@@ -173,7 +173,7 @@ void http_admin_removeHttpService(void *handle, void *svc __attribute__((unused)
         node = findServiceNodeInTree(&admin->http_svc_tree, uri);
 
         if(node != NULL){
-            destroyServiceNode(node, &admin->http_svc_tree.tree_node_count, &admin->http_svc_tree.tree_svc_count);
+            destroyServiceNode(&admin->http_svc_tree, node, &admin->http_svc_tree.tree_node_count, &admin->http_svc_tree.tree_svc_count);
         } else {
             printf("Couldn't remove HTTP service with URI: %s, it doesn't exist\n", uri);
         }
diff --git a/bundles/http_admin/http_admin/src/service_tree.c b/bundles/http_admin/http_admin/src/service_tree.c
index 8225cfb..b1e7039 100644
--- a/bundles/http_admin/http_admin/src/service_tree.c
+++ b/bundles/http_admin/http_admin/src/service_tree.c
@@ -156,7 +156,7 @@ void destroyChildrenFromServiceNode(service_tree_node_t *parent, int *tree_item_
         while(child != NULL) {
             if (child->children != NULL) {
                 //Delete children first
-                destroyChildrenFromServiceNode(parent->children, tree_item_count, tree_svc_count);
+                destroyChildrenFromServiceNode(child, tree_item_count, tree_svc_count);
 
             } else {
                 //Delete child first
@@ -177,28 +177,7 @@ void destroyChildrenFromServiceNode(service_tree_node_t *parent, int *tree_item_
     }
 }
 
-void destroyServiceNodeTree(service_tree_node_t *node, int *tree_item_count, int *tree_svc_count) {
-    if(node != NULL && tree_item_count != NULL && tree_svc_count != NULL) {
-        service_tree_node_t *current = node;
-
-        destroyChildrenFromServiceNode(current, tree_item_count, tree_svc_count);
-
-        while (current->next != NULL) {
-            destroyChildrenFromServiceNode(current->next, tree_item_count, tree_svc_count);
-            current = current->next;
-        }
-
-        if(node->svc_data != NULL) {
-            //Decrement service count if a service was present
-            if(node->svc_data->service != NULL) (*tree_svc_count)--;
-            free(node->svc_data->sub_uri);
-            free(node->svc_data);
-        }
-        free(node);
-    }
-}
-
-void destroyServiceNode(service_tree_node_t *node, int *tree_item_count, int *tree_svc_count) {
+void destroyServiceNode(service_tree_t *svc_tree, service_tree_node_t *node, int *tree_item_count, int *tree_svc_count) {
     if(node != NULL && tree_item_count != NULL && tree_svc_count != NULL) {
         bool has_underlaying_services = false;
 
@@ -235,6 +214,11 @@ void destroyServiceNode(service_tree_node_t *node, int *tree_item_count, int *tr
                 node->parent->children = node->next;
             }
 
+            //If current node to delete is the root node, set new root node pointer
+            if(svc_tree->root_node == node) {
+                svc_tree->root_node = node->next;
+            }
+
             //Set new previous pointer for the next node if present.
             if(node->next != NULL) {
                 node->next->prev = node->prev;
@@ -255,10 +239,27 @@ void destroyServiceNode(service_tree_node_t *node, int *tree_item_count, int *tr
 
 void destroyServiceTree(service_tree_t *svc_tree) {
     if(svc_tree != NULL) {
-        if(svc_tree->tree_node_count > 0) {
-            destroyServiceNodeTree(svc_tree->root_node, &svc_tree->tree_node_count, &svc_tree->tree_svc_count);
+        if(svc_tree->tree_node_count > 0 && svc_tree->root_node != NULL) {
+            service_tree_node_t *current = svc_tree->root_node;
+
+            while(current != NULL) {
+                destroyChildrenFromServiceNode(current, &svc_tree->tree_node_count, &svc_tree->tree_svc_count);
+
+                service_tree_node_t *next = current->next;
+                if(current->svc_data != NULL) {
+                    if(current->svc_data->service != NULL) svc_tree->tree_svc_count--;
+                    free(current->svc_data->sub_uri);
+                    free(current->svc_data);
+                }
+                free(current);
+
+                //Iterate to next node in similar level as root node
+                current = next;
+            }
+
             svc_tree->tree_node_count = 0;
             svc_tree->tree_svc_count = 0;
+            svc_tree->root_node = NULL;
         }
     }
 }
diff --git a/bundles/http_admin/http_admin/src/service_tree.h b/bundles/http_admin/http_admin/src/service_tree.h
index 038828b..eeb2460 100644
--- a/bundles/http_admin/http_admin/src/service_tree.h
+++ b/bundles/http_admin/http_admin/src/service_tree.h
@@ -54,8 +54,7 @@ typedef struct service_tree {
 service_tree_node_t *createServiceNode(service_tree_node_t *parent, service_tree_node_t *children, service_tree_node_t *next, service_tree_node_t *prev, const char *uri, void *svc);
 bool addServiceNode(service_tree_t *svc_tree, const char *uri, void *svc);
 void destroyChildrenFromServiceNode(service_tree_node_t *parent, int *tree_item_count, int *tree_svc_count);
-void destroyServiceNodeTree(service_tree_node_t *node, int *tree_item_count, int *tree_svc_count);
-void destroyServiceNode(service_tree_node_t *node, int *tree_item_count, int *tree_svc_count);
+void destroyServiceNode(service_tree_t *svc_tree, service_tree_node_t *node, int *tree_item_count, int *tree_svc_count);
 void destroyServiceTree(service_tree_t *svc_tree);
 service_tree_node_t *findServiceNodeInTree(service_tree_t *svc_tree, const char *uri);
 
diff --git a/bundles/http_admin/http_admin/src/websocket_admin.c b/bundles/http_admin/http_admin/src/websocket_admin.c
index aee8b50..9ec9a21 100644
--- a/bundles/http_admin/http_admin/src/websocket_admin.c
+++ b/bundles/http_admin/http_admin/src/websocket_admin.c
@@ -112,7 +112,7 @@ void websocket_admin_removeWebsocketService(void *handle, void *svc __attribute_
         node = findServiceNodeInTree(&admin->sock_svc_tree, uri);
 
         if(node != NULL){
-            destroyServiceNode(node, &admin->sock_svc_tree.tree_node_count, &admin->sock_svc_tree.tree_svc_count);
+            destroyServiceNode(&admin->sock_svc_tree, node, &admin->sock_svc_tree.tree_node_count, &admin->sock_svc_tree.tree_svc_count);
         } else {
             printf("Couldn't remove websocket service with URI: %s, it doesn't exist\n", uri);
         }
@@ -213,4 +213,4 @@ void websocket_close_handler(const struct mg_connection *connection, void *handl
             }
         }
     }
-}
\ No newline at end of file
+}