Functions to get conn by session ID.
FossilOrigin-Name: 7c99abc44308c62f551283f93ecde1e36ed2d3033f3ff86d9e2a44e37291ddcd
This commit is contained in:
parent
fb6d890745
commit
871822c613
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user