Major change. router_session is freed as a last operation before freeing session. Fixes frequently occurring failures when multiple threads are running.

This commit is contained in:
vraatikka
2013-09-08 23:27:57 +03:00
parent 6a07ef8245
commit e61c19c6fe

View File

@ -162,10 +162,11 @@ session_link_dcb(SESSION *session, DCB *dcb)
* *
* @param session The session to deallocate * @param session The session to deallocate
*/ */
void bool session_free(
session_free(SESSION *session) SESSION *session)
{ {
SESSION *ptr; bool succp = false;
SESSION *ptr;
CHK_SESSION(session); CHK_SESSION(session);
@ -178,7 +179,7 @@ SESSION *ptr;
* count. * count.
*/ */
spinlock_release(&session->ses_lock); spinlock_release(&session->ses_lock);
return; goto return_succp;
} }
session->state = SESSION_STATE_FREE; session->state = SESSION_STATE_FREE;
spinlock_release(&session->ses_lock); spinlock_release(&session->ses_lock);
@ -202,8 +203,13 @@ SESSION *ptr;
spinlock_release(&session_spin); spinlock_release(&session_spin);
atomic_add(&session->service->stats.n_current, -1); 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); free(session);
succp = true;
return_succp :
return succp;
} }
/** /**