Functions to get conn by session ID.

FossilOrigin-Name: 7c99abc44308c62f551283f93ecde1e36ed2d3033f3ff86d9e2a44e37291ddcd
This commit is contained in:
7u83@mail.ru 2016-04-10 13:54:25 +00:00
parent fb6d890745
commit 871822c613
2 changed files with 42 additions and 13 deletions

View File

@ -34,7 +34,10 @@
#include "sock.h"
static int connlist_cmp(const void * d1,const void *d2)
static int cmp_by_addr(const void * d1,const void *d2)
{
struct conn * c1=(struct conn *) d1;
struct conn * c2=(struct conn *) d2;
@ -42,6 +45,13 @@ static int connlist_cmp(const void * d1,const void *d2)
return sock_cmpaddr((struct sockaddr*)&c1->addr,(struct sockaddr*)&c2->addr,1);
}
static int cmp_by_session_id(const void *d1, const void *d2)
{
struct conn * c1=(struct conn *) d1;
struct conn * c2=(struct conn *) d2;
return memcmp(c1->session_id,c2->session_id,16);
}
struct connlist * connlist_create(int len)
{
@ -51,15 +61,18 @@ struct connlist * connlist_create(int len)
return 0;
cl->t = mavl_create(connlist_cmp,0);
cl->by_addr = mavl_create(cmp_by_addr,0);
if (!cl->t){
if (!cl->by_addr){
free(cl);
return 0;
}
cl->by_session_id = mavl_create(cmp_by_session_id,0);
if (pthread_mutex_init(&cl->connlist_mutex,NULL)){
mavl_destroy(cl->t);
mavl_destroy(cl->by_addr);
free(cl);
return 0;
};
@ -85,8 +98,8 @@ void connlist_destroy(struct connlist * cl)
if (!cl)
return;
if (cl->t)
mavl_destroy(cl->t);
if (cl->by_addr)
mavl_destroy(cl->by_addr);
pthread_mutex_destroy(&cl->connlist_mutex);
free(cl);
@ -97,23 +110,33 @@ struct conn * connlist_get(struct connlist * cl, const struct sockaddr * addr)
{
struct conn search;
sock_copyaddr(&search.addr,addr);
return mavl_get(cl->t,&search);
return mavl_get(cl->by_addr,&search);
}
struct conn * connlist_add(struct connlist * cl, struct conn * conn)
{
if ( cl->len!=0)
if (cl->t->count>=cl->len)
return 0;
return mavl_add(cl->t,conn);
if (cl->by_addr->count>=cl->len)
return NULL;
conn->connlist=cl;
return mavl_add(cl->by_addr,conn);
}
struct conn * connlist_get_by_session_id(struct connlist *cl, struct conn * conn)
{
return mavl_get(cl->by_session_id,conn);
}
struct conn * connlist_add_by_session_id(struct connlist * cl, struct conn * conn)
{
return mavl_add(cl->by_session_id,conn);
}
void connlist_remove(struct connlist *cl,struct conn * conn)
{
mavl_del(cl->t,conn);
mavl_del(cl->by_session_id,conn);
mavl_del(cl->by_addr,conn);
}

View File

@ -8,7 +8,10 @@
struct connlist {
/* struct conn ** connlist; */
struct mavl *t;
struct mavl *by_addr;
struct mavl *by_session_id;
int len;
pthread_mutex_t connlist_mutex;
};
@ -23,4 +26,7 @@ struct conn *connlist_add(struct connlist *cl, struct conn *conn);
void connlist_remove(struct connlist *cl, struct conn *conn);
void connlist_destroy(struct connlist *cl);
struct conn * connlist_get_by_session_id(struct connlist *cl, struct conn * conn);
struct conn * connlist_add_by_session_id(struct connlist * cl, struct conn * conn);
#endif