summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2012-07-14 17:07:03 +0000
committerme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2012-07-14 17:07:03 +0000
commit0a528e8390693412eb170849440ccacf9e29e9f0 (patch)
treecbcf72a7c04e312ba84f5984d909ec67eac00825
parent1196b5e6ff4807c9c928fb7507c1a9e30f4069a2 (diff)
downloadpica-pica-0a528e8390693412eb170849440ccacf9e29e9f0.tar.gz
pica-pica-0a528e8390693412eb170849440ccacf9e29e9f0.zip
delete associated c2c connections on client and node disconnect
git-svn-id: svn://localhost/project_picapica/trunk@146 fb96df88-216d-11de-830c-f3023f12d8ac
-rwxr-xr-xPICA_node.c53
1 files changed, 52 insertions, 1 deletions
diff --git a/PICA_node.c b/PICA_node.c
index 131bd76..1a6433c 100755
--- a/PICA_node.c
+++ b/PICA_node.c
@@ -89,6 +89,9 @@ void cclink_list_addn2ncle(unsigned int caller_id, struct nodelink *caller_node,
void cclink_activate(struct cclink *ccl,SOCKET s);
void cclink_attach_remotecle_node(struct cclink *ccl, struct nodelink *callee_node);
+void cclink_list_delete_by_client(struct client *cl);
+void cclink_list_delete_by_nodelink(struct nodelink *node);
+
struct client* client_tree_search(unsigned int id);//
struct client *client_list_addnew(struct newconn *nc);
struct PICA_proto_msg* client_wbuf_push(struct client *c,unsigned int msgid,unsigned int size);
@@ -840,6 +843,7 @@ return 0;
void cclink_list_delete(struct cclink *l)
{
+PICA_debug1("cclink_list_delete(%p)", (void*)l);
//удаление из глобального списка
if (l->prev)
l->prev->next=l->next;
@@ -876,6 +880,48 @@ free(l);
cclink_list_count--;
}
+void cclink_list_delete_by_client(struct client *cl)
+{
+struct cclink *kill_ptr = 0, *l = cclink_list_head;
+PICA_debug1("cclink_list_delete_by_client(%p)", (void*)cl);
+
+while(l)
+ {
+ if (l->p1 == cl || l->p2 == cl)
+ kill_ptr = l;
+
+ l = l->next;
+
+ if (kill_ptr)
+ {
+ cclink_list_delete(kill_ptr);
+ kill_ptr = 0;
+ }
+ }
+
+}
+
+void cclink_list_delete_by_nodelink(struct nodelink *node)
+{
+struct cclink *kill_ptr = 0, *l = cclink_list_head;
+
+PICA_debug1("cclink_list_delete_by_nodelink(%p)", (void*)node);
+
+while(l)
+ {
+ if (l->caller_node == node || l->callee_node == node)
+ kill_ptr = l;
+
+ l = l->next;
+
+ if (kill_ptr)
+ {
+ cclink_list_delete(kill_ptr);
+ kill_ptr = 0;
+ }
+ }
+}
+
//clr - caller
//cle - callee
@@ -1384,7 +1430,7 @@ return ci;
void client_list_delete(struct client* ci)
{
-
+PICA_debug1("client_list_delete(%p)", (void*)ci);
SSL_free(ci->ssl_comm);
//удаление из списка
if (ci->prev)
@@ -1404,6 +1450,7 @@ if (client_tree_search(ci->id) == ci)
client_tree_print(client_tree_root);//debug
}
+cclink_list_delete_by_client(ci);
CLOSE(ci->sck_comm);
@@ -1467,6 +1514,8 @@ return nl;
void nodelink_list_delete(struct nodelink *n)
{
+PICA_debug1("nodelink_list_delete(%p)", (void*)n);
+
if (n->r_buf)
free(n->r_buf);
@@ -1488,6 +1537,8 @@ if (n->next)
else
nodelink_list_end=n->prev;
+cclink_list_delete_by_nodelink(n);
+
nodelink_list_count--;
free(n);
}