From 1496e247a6a9428cb281da5dee1a593c8ee2cc5f Mon Sep 17 00:00:00 2001 From: Alexander Vdolainen Date: Wed, 5 Aug 2015 15:16:45 +0300 Subject: [PATCH] fixed thread eternal sleep in case of bad connection close; --- lib/sntllv2.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/sntllv2.c b/lib/sntllv2.c index 822a6ae..36ddce6 100644 --- a/lib/sntllv2.c +++ b/lib/sntllv2.c @@ -511,9 +511,31 @@ static int __eval_syssexp(conn_t *co, sexp_t *sx) return rentry->rpcf((void *)co, sx); } +#ifdef _NO_SNTLMP #define _CONN_INUSE(co) (co)->usecount++; #define _CONN_NOTINUSE(co) (co)->usecount--; #define _CONN_UCOUNT(co) (co)->usecount +#else +static inline void _CONN_INUSE(conn_t *co) { + pthread_rwlock_wrlock(&co->ssys->rwlock); + co->usecount++; + pthread_rwlock_unlock(&co->ssys->rwlock); +} + +static inline void _CONN_NOTINUSE(conn_t *co) { + pthread_rwlock_wrlock(&co->ssys->rwlock); + co->usecount--; + pthread_rwlock_unlock(&co->ssys->rwlock); +} + +static inline int _CONN_UCOUNT(conn_t *co) { + int r; + pthread_rwlock_rdlock(&co->ssys->rwlock); + r = co->usecount; + pthread_rwlock_unlock(&co->ssys->rwlock); + return r; +} +#endif static void __connection_destroy(conn_t *co) { @@ -643,7 +665,7 @@ static void *__sntll_thread(void *b) /* check up a thread */ if(pthread_equal(self, co->thrd_poll[7])) /* dispatcher */ - dispatch = 0; + dispatch = 1; /* update use count */ _CONN_INUSE(co); @@ -702,7 +724,10 @@ static void *__sntll_thread(void *b) } else printf("connread(head) µS: %ld\n", end.tv_usec - beg.tv_usec); #endif - if(co->flags & SNSX_CLOSED) goto __finish; /* go away if required asap */ + if(co->flags & SNSX_CLOSED) { + pthread_mutex_unlock(&(co->sslinout[0])); + goto __finish; /* go away if required asap */ + } #ifdef _VERBOSE_DEBUG dumphead(mhead); @@ -755,7 +780,7 @@ static void *__sntll_thread(void *b) pthread_mutex_lock(&(co->sslinout[1])); wr = __conn_write(co, mhead, sizeof(sntllv2_head_t)); pthread_mutex_unlock(&(co->sslinout[1])); - if(wr < 0) goto __finish; + if(wr == -1) goto __finish; else goto __again; } } else pthread_mutex_unlock(&(co->sslinout[0])); @@ -920,6 +945,7 @@ static void *__sntll_thread(void *b) } __finish: + co->flags |= SNSX_CLOSED; __connection_destroy(co); __sntll_bundle_destroy(b); /* destroy bundle */