diff --git a/src/RJSRealm.mm b/src/RJSRealm.mm index 5966052d..4f6cf76d 100644 --- a/src/RJSRealm.mm +++ b/src/RJSRealm.mm @@ -454,7 +454,7 @@ JSValueRef RealmClose(JSContextRef ctx, JSObjectRef function, JSObjectRef thisOb try { RJSValidateArgumentCount(argumentCount, 0); SharedRealm realm = *RJSGetInternal(thisObject); - realm->invalidate(); + realm->close(); realm::Realm::s_global_cache.remove(realm->config().path, realm->thread_id()); } diff --git a/src/RealmJS.h b/src/RealmJS.h index 5bdd0b2f..daf34de6 100644 --- a/src/RealmJS.h +++ b/src/RealmJS.h @@ -24,7 +24,6 @@ // add realm apis to the given js context + (void)initializeContext:(JSContextRef)ctx; -+ (void)disposeContext:(JSContextRef)ctx; + (void)clearTestState; @end diff --git a/src/RealmJS.mm b/src/RealmJS.mm index 34edaac6..59699320 100644 --- a/src/RealmJS.mm +++ b/src/RealmJS.mm @@ -83,7 +83,7 @@ static JSValueRef ClearTestState(JSContextRef ctx, JSObjectRef function, JSObjec } + (void)clearTestState { - realm::Realm::s_global_cache.invalidate_all(); + realm::Realm::s_global_cache.close_all(); realm::Realm::s_global_cache.clear(); NSFileManager *manager = [NSFileManager defaultManager]; diff --git a/src/object-store/shared_realm.cpp b/src/object-store/shared_realm.cpp index 42217a8f..8eab3700 100644 --- a/src/object-store/shared_realm.cpp +++ b/src/object-store/shared_realm.cpp @@ -295,6 +295,16 @@ void Realm::invalidate() m_group = nullptr; } +void Realm::close() +{ + invalidate(); + if (m_notifier) { + m_notifier->remove_realm(this); + m_notifier = nullptr; + } + m_delegate = nullptr; +} + bool Realm::compact() { verify_thread(); @@ -440,14 +450,15 @@ void RealmCache::cache_realm(SharedRealm &realm, std::thread::id thread_id) } } -void RealmCache::invalidate_all() +void RealmCache::close_all(std::thread::id thread_id) { std::lock_guard lock(m_mutex); for (auto &path_realms : m_cache) { - for (auto &realm_iter : path_realms.second) { - if (auto realm = realm_iter.second.lock()) { - realm->invalidate(); + auto thread_realm = path_realms.second.find(thread_id); + if (thread_realm != path_realms.second.end()) { + if (auto realm = thread_realm->second.lock()) { + realm->close(); } } } diff --git a/src/object-store/shared_realm.hpp b/src/object-store/shared_realm.hpp index 4721e37e..310c41a1 100644 --- a/src/object-store/shared_realm.hpp +++ b/src/object-store/shared_realm.hpp @@ -94,6 +94,7 @@ namespace realm { void invalidate(); bool compact(); + void close(); std::thread::id thread_id() const { return m_thread_id; } void verify_thread() const; @@ -131,7 +132,7 @@ namespace realm { SharedRealm get_any_realm(const std::string &path); void remove(const std::string &path, std::thread::id thread_id); void cache_realm(SharedRealm &realm, std::thread::id thread_id = std::this_thread::get_id()); - void invalidate_all(); + void close_all(std::thread::id thread_id = std::this_thread::get_id()); void clear(); private: