From e61c19c6fe0dd87b1297651b0af0ee6e30aff6b1 Mon Sep 17 00:00:00 2001 From: vraatikka Date: Sun, 8 Sep 2013 23:27:57 +0300 Subject: [PATCH] Major change. router_session is freed as a last operation before freeing session. Fixes frequently occurring failures when multiple threads are running. --- server/core/session.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/server/core/session.c b/server/core/session.c index 4b59ab26b..0c150ba9b 100644 --- a/server/core/session.c +++ b/server/core/session.c @@ -162,10 +162,11 @@ session_link_dcb(SESSION *session, DCB *dcb) * * @param session The session to deallocate */ -void -session_free(SESSION *session) +bool session_free( + SESSION *session) { -SESSION *ptr; + bool succp = false; + SESSION *ptr; CHK_SESSION(session); @@ -178,7 +179,7 @@ SESSION *ptr; * count. */ spinlock_release(&session->ses_lock); - return; + goto return_succp; } session->state = SESSION_STATE_FREE; spinlock_release(&session->ses_lock); @@ -202,8 +203,13 @@ SESSION *ptr; spinlock_release(&session_spin); atomic_add(&session->service->stats.n_current, -1); - /* Clean up session and free the memory */ + /* Free router_session and session */ + free(session->router_session); free(session); + succp = true; + +return_succp : + return succp; } /**