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:
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user