From 8dd516846af4a7a8ed839184b032ecac5c13c4da Mon Sep 17 00:00:00 2001 From: Patrick Ohly Date: Thu, 16 May 2013 02:10:59 -0700 Subject: engine: free engine while still protected from signals Explicitly free the engine before releasing our lock on shutdown signals. This prevents getting killed by a signal while we are still freeing resources, which can take some time when a background thread is involved (seen in some tests covering that). --- src/syncevo/SyncContext.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/syncevo/SyncContext.cpp b/src/syncevo/SyncContext.cpp index 9ceb2c6c..2f335824 100644 --- a/src/syncevo/SyncContext.cpp +++ b/src/syncevo/SyncContext.cpp @@ -3666,7 +3666,7 @@ SyncMLStatus SyncContext::doSync() sysync::STEPCMD_CLIENTSTART; SharedSession session = m_engine.OpenSession(m_sessionID); SharedBuffer sendBuffer; - SessionSentinel sessionSentinel(*this, session); + std::auto_ptr sessionSentinel(new SessionSentinel(*this, session)); if (m_serverMode && !m_localSync) { m_engine.WriteSyncMLBuffer(session, @@ -4095,6 +4095,15 @@ SyncMLStatus SyncContext::doSync() } } + // Let session shut down before auto-destructing anything else + // (like our signal blocker). This may take a while, because it + // may involve shutting down the helper background thread which + // opened our local datastore. + SE_LOG_DEBUG(NULL, "closing session"); + sessionSentinel.reset(); + session.reset(); + SE_LOG_DEBUG(NULL, "session closed"); + return status; } -- cgit v1.2.3