diff options
| author | me_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac> | 2012-07-14 17:07:03 +0000 |
|---|---|---|
| committer | me_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac> | 2012-07-14 17:07:03 +0000 |
| commit | 0a528e8390693412eb170849440ccacf9e29e9f0 (patch) | |
| tree | cbcf72a7c04e312ba84f5984d909ec67eac00825 | |
| parent | 1196b5e6ff4807c9c928fb7507c1a9e30f4069a2 (diff) | |
| download | pica-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-x | PICA_node.c | 53 |
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); } |
