destroy of the connection added;
This commit is contained in:
parent
eba6c0b9fb
commit
dc6a9781cd
@ -90,6 +90,7 @@ typedef struct __connection_t {
|
|||||||
/* Other stuff */
|
/* Other stuff */
|
||||||
pthread_t thrd_poll[8];
|
pthread_t thrd_poll[8];
|
||||||
volatile uint8_t flags; /** < flags of the connection */
|
volatile uint8_t flags; /** < flags of the connection */
|
||||||
|
volatile uint8_t usecount;
|
||||||
usrtc_node_t csnode; /** < node to store the connection within list */
|
usrtc_node_t csnode; /** < node to store the connection within list */
|
||||||
} conn_t;
|
} conn_t;
|
||||||
|
|
||||||
|
@ -436,6 +436,63 @@ static int __eval_syssexp(conn_t *co, sexp_t *sx)
|
|||||||
return rentry->rpcf((void *)co, sx);
|
return rentry->rpcf((void *)co, sx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define _CONN_INUSE(co) (co)->usecount++;
|
||||||
|
#define _CONN_NOTINUSE(co) (co)->usecount--;
|
||||||
|
#define _CONN_UCOUNT(co) (co)->usecount
|
||||||
|
|
||||||
|
static void __connection_destroy(conn_t *co)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
sxmsg_t *msg;
|
||||||
|
chnl_t *chan;
|
||||||
|
sntllv2_head_t *head;
|
||||||
|
conn_sys_t *ssys = co->ssys;
|
||||||
|
|
||||||
|
/* first we will unpin all messages and mark it as errors on */
|
||||||
|
if(co->unused_messages) {
|
||||||
|
/*TODO: kill it all */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* go thru messages */
|
||||||
|
pthread_mutex_lock(&co->idx_msg_lock);
|
||||||
|
for(i = 0; i < 1024; i++) {
|
||||||
|
msg = co->messages[i];
|
||||||
|
if(!msg) continue;
|
||||||
|
else head = &msg->mhead;
|
||||||
|
head->opcode = SNE_LINKERROR;
|
||||||
|
pthread_mutex_unlock(&msg->wait);
|
||||||
|
co->messages[i] = NULL;
|
||||||
|
idx_free(&co->idx_msg, i);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&co->idx_msg_lock);
|
||||||
|
|
||||||
|
/* ok now we will free the channels */
|
||||||
|
pthread_mutex_lock(&co->idx_ch_lock);
|
||||||
|
for(i = 0; i < 512; i++) {
|
||||||
|
chan = co->channels[i];
|
||||||
|
if(!chan) continue;
|
||||||
|
idx_free(&co->idx_ch, i);
|
||||||
|
free(chan);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&co->idx_ch_lock);
|
||||||
|
|
||||||
|
/* update use count */
|
||||||
|
_CONN_NOTINUSE(co);
|
||||||
|
|
||||||
|
/* ok, let's free other if we can */
|
||||||
|
if(!_CONN_UCOUNT(co)) {
|
||||||
|
if(ssys->on_destroy) ssys->on_destroy(co);
|
||||||
|
SSL_shutdown(co->ssl);
|
||||||
|
close(SSL_get_fd(co->ssl));
|
||||||
|
SSL_free(co->ssl);
|
||||||
|
SSL_CTX_free(co->ctx);
|
||||||
|
__connection_second_free(co);
|
||||||
|
__connection_minimal_free(co);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
static void *__sntll_thread(void *b)
|
static void *__sntll_thread(void *b)
|
||||||
{
|
{
|
||||||
sntllv2_bundle_t *bun = (sntllv2_bundle_t *)b;
|
sntllv2_bundle_t *bun = (sntllv2_bundle_t *)b;
|
||||||
@ -468,6 +525,9 @@ static void *__sntll_thread(void *b)
|
|||||||
if(pthread_equal(self, co->thrd_poll[7])) /* dispatcher */
|
if(pthread_equal(self, co->thrd_poll[7])) /* dispatcher */
|
||||||
dispatch = 1;
|
dispatch = 1;
|
||||||
|
|
||||||
|
/* update use count */
|
||||||
|
_CONN_INUSE(co);
|
||||||
|
|
||||||
/* the following logic : (except dispatcher)
|
/* the following logic : (except dispatcher)
|
||||||
* 1. check up pending write -> if exists write one and start again., otherwise go next
|
* 1. check up pending write -> if exists write one and start again., otherwise go next
|
||||||
* 2. read from ssl connection (we will sleep if other already acquire the lock)
|
* 2. read from ssl connection (we will sleep if other already acquire the lock)
|
||||||
@ -683,6 +743,7 @@ static void *__sntll_thread(void *b)
|
|||||||
}
|
}
|
||||||
|
|
||||||
__finish:
|
__finish:
|
||||||
|
__connection_destroy(co);
|
||||||
__sntll_bundle_destroy(b); /* destroy bundle */
|
__sntll_bundle_destroy(b); /* destroy bundle */
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user