|
|
|
@ -436,6 +436,63 @@ static int __eval_syssexp(conn_t *co, sexp_t *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)
|
|
|
|
|
{
|
|
|
|
|
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 */
|
|
|
|
|
dispatch = 1;
|
|
|
|
|
|
|
|
|
|
/* update use count */
|
|
|
|
|
_CONN_INUSE(co);
|
|
|
|
|
|
|
|
|
|
/* the following logic : (except dispatcher)
|
|
|
|
|
* 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)
|
|
|
|
@ -683,6 +743,7 @@ static void *__sntll_thread(void *b)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
__finish:
|
|
|
|
|
__connection_destroy(co);
|
|
|
|
|
__sntll_bundle_destroy(b); /* destroy bundle */
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|