Skip to content

Commit 953e657

Browse files
committed
WIP: Files
1 parent 819bb98 commit 953e657

File tree

4 files changed

+41
-1
lines changed

4 files changed

+41
-1
lines changed

src/realm/object-store/sync/sync_manager.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,25 @@ void SyncManager::close_all_sessions()
397397
get_sync_client().wait_for_session_terminations();
398398
}
399399

400+
401+
void SyncManager::clear_connection_change_callbacks()
402+
{
403+
// force_close() will call unregister_session(), which requires m_session_mutex,
404+
// so we need to iterate over them without holding the lock.
405+
decltype(m_sessions) sessions;
406+
{
407+
util::CheckedLockGuard lk(m_session_mutex);
408+
m_sessions.swap(sessions);
409+
}
410+
411+
for (auto& [_, session] : sessions) {
412+
session->clear_connection_change_callbacks();
413+
}
414+
415+
get_sync_client().wait_for_session_terminations();
416+
}
417+
418+
400419
void SyncManager::set_sync_route(std::string sync_route, bool verified)
401420
{
402421
REALM_ASSERT(!sync_route.empty()); // Cannot be set to empty string

src/realm/object-store/sync/sync_manager.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ class SyncManager : public std::enable_shared_from_this<SyncManager> {
109109
// Immediately closes any open sync sessions for this sync manager
110110
void close_all_sessions() REQUIRES(!m_mutex, !m_session_mutex);
111111

112+
void clear_connection_change_callbacks() REQUIRES(!m_mutex, !m_session_mutex);
113+
112114
// Force all the active sessions to restart
113115
void restart_all_sessions() REQUIRES(!m_mutex, !m_session_mutex);
114116

src/realm/object-store/sync/sync_session.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,11 @@ void SyncSession::do_restart_session(util::CheckedUniqueLock)
200200
become_active();
201201
}
202202

203+
void SyncSession::clear_connection_change_callbacks()
204+
{
205+
m_connection_change_notifier.clear_callbacks();
206+
}
207+
203208
void SyncSession::do_become_inactive(util::CheckedUniqueLock lock, Status status,
204209
bool cancel_subscription_notifications)
205210
{
@@ -224,8 +229,10 @@ void SyncSession::do_become_inactive(util::CheckedUniqueLock lock, Status status
224229

225230
// Send notifications after releasing the lock to prevent deadlocks in the callback.
226231
if (old_state != new_state) {
227-
m_connection_change_notifier.invoke_callbacks(old_state, connection_state());
232+
// m_connection_change_notifier.invoke_callbacks(old_state, connection_state());
228233
}
234+
m_connection_change_notifier.clear_callbacks();
235+
229236

230237
if (status.is_ok())
231238
status = Status(ErrorCodes::OperationAborted, "Sync session became inactive");
@@ -1662,6 +1669,15 @@ void SyncSession::ConnectionChangeNotifier::remove_callback(uint64_t token)
16621669
}
16631670
}
16641671

1672+
void SyncSession::ConnectionChangeNotifier::clear_callbacks()
1673+
{
1674+
std::lock_guard<std::mutex> lock(m_callback_mutex);
1675+
1676+
m_callbacks.clear();
1677+
m_callback_count = 0;
1678+
m_callback_index = npos; // Reset callback index since all callbacks are removed
1679+
}
1680+
16651681
void SyncSession::ConnectionChangeNotifier::invoke_callbacks(ConnectionState old_state, ConnectionState new_state)
16661682
{
16671683
std::unique_lock lock(m_callback_mutex);

src/realm/object-store/sync/sync_session.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,7 @@ class SyncSession : public std::enable_shared_from_this<SyncSession> {
369369
uint64_t add_callback(std::function<ConnectionStateChangeCallback> callback);
370370
void remove_callback(uint64_t token);
371371
void invoke_callbacks(ConnectionState old_state, ConnectionState new_state);
372+
void clear_callbacks();
372373

373374
private:
374375
struct Callback {
@@ -445,6 +446,8 @@ class SyncSession : public std::enable_shared_from_this<SyncSession> {
445446
void do_restart_session(util::CheckedUniqueLock)
446447
REQUIRES(m_state_mutex, !m_connection_state_mutex, !m_config_mutex);
447448

449+
void clear_connection_change_callbacks() REQUIRES(!m_connection_state_mutex);
450+
448451
// do_become_inactive is called from both become_paused()/become_inactive() and does all the steps to
449452
// shutdown and cleanup the sync session besides setting m_state.
450453
void do_become_inactive(util::CheckedUniqueLock, Status, bool) RELEASE(m_state_mutex)

0 commit comments

Comments
 (0)