From 22b7a9d46818834d8fc86bedf778868ebbcc202b Mon Sep 17 00:00:00 2001 From: Lee Maguire Date: Wed, 12 Jun 2024 16:08:32 +0100 Subject: [PATCH] More cleanup --- CHANGELOG.md | 5 ++++- include/cpprealm/internal/bridge/realm.hpp | 2 +- include/cpprealm/macros.hpp | 1 - .../cpprealm/schedulers/default_scheduler.hpp | 2 +- src/cpprealm/internal/bridge/realm.cpp | 4 ++++ .../scheduler/realm_core_scheduler.cpp | 1 - src/cpprealm/schedulers/default_scheduler.cpp | 6 +++--- tests/db/run_loop_tests.cpp | 21 ++++++++++++++++--- 8 files changed, 31 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cd80caf..a67604ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,10 @@ X.Y.Z Release notes (YYYY-MM-DD) * Fixed a compilation issue seen in MSBuild 17.10.4 due to usage of `std::apply`. ### Enhancements -* None +* Add `realm::default_scheduler::set_default_factory(std::function()>&& factory_fn)` for generating a default scheduler. + Set your scheduler factory before instantiating a `realm::db_config`. +* Add `realm::default_scheduler::make_uv(uv_loop_t* loop);` which generates a scheduler powered by libuv with a user defined `uv_loop_t`. +* Add `realm::default_scheduler::make_default()` which generates a platform default scheduler if `realm::default_scheduler::set_default_factory` is not set. ### Compatibility * Fileformat: Generates files with format v24. Reads and automatically upgrade from fileformat v10. diff --git a/include/cpprealm/internal/bridge/realm.hpp b/include/cpprealm/internal/bridge/realm.hpp index 89ebb72e..b0a1d467 100644 --- a/include/cpprealm/internal/bridge/realm.hpp +++ b/include/cpprealm/internal/bridge/realm.hpp @@ -187,7 +187,7 @@ namespace realm::internal::bridge { const std::shared_ptr& scheduler); [[nodiscard]] std::string path() const; [[nodiscard]] struct sync_config sync_config() const; - [[nodiscard]] std::shared_ptr scheduler(); + [[nodiscard]] std::shared_ptr scheduler() const; operator RealmConfig() const; //NOLINT(google-explicit-constructor) void set_path(const std::string&); void set_schema(const std::vector&); diff --git a/include/cpprealm/macros.hpp b/include/cpprealm/macros.hpp index 6c8cf9f1..059d11c6 100644 --- a/include/cpprealm/macros.hpp +++ b/include/cpprealm/macros.hpp @@ -271,7 +271,6 @@ namespace realm { #define DECLARE_MANAGED_PROPERTY_NAME(cls, p) #p, #define DECLARE_COND_UNMANAGED_TO_MANAGED(cls, p) if constexpr (std::is_same_v) { return &managed::p; } -#include #include #include diff --git a/include/cpprealm/schedulers/default_scheduler.hpp b/include/cpprealm/schedulers/default_scheduler.hpp index 11bc07d7..a855a072 100644 --- a/include/cpprealm/schedulers/default_scheduler.hpp +++ b/include/cpprealm/schedulers/default_scheduler.hpp @@ -54,7 +54,7 @@ namespace realm::default_scheduler { * `scheduler::make_default()` is called. This function is not thread-safe * and must be called before any schedulers are created. */ - void set_default_factory(std::shared_ptr (*factory)()); + void set_default_factory(std::function()>&& factory_fn); /** * Create a new instance of the scheduler type returned by the default diff --git a/src/cpprealm/internal/bridge/realm.cpp b/src/cpprealm/internal/bridge/realm.cpp index eddf65f0..eb219938 100644 --- a/src/cpprealm/internal/bridge/realm.cpp +++ b/src/cpprealm/internal/bridge/realm.cpp @@ -333,6 +333,10 @@ namespace realm::internal::bridge { return get_config()->sync_config; } + struct std::shared_ptr realm::config::scheduler() const { + return std::make_shared(realm_core_scheduler(get_config()->scheduler)); + } + struct std::shared_ptr realm::scheduler() const { return std::make_shared(realm_core_scheduler(m_realm->scheduler())); } diff --git a/src/cpprealm/internal/scheduler/realm_core_scheduler.cpp b/src/cpprealm/internal/scheduler/realm_core_scheduler.cpp index 3fa1f32e..00d1804c 100644 --- a/src/cpprealm/internal/scheduler/realm_core_scheduler.cpp +++ b/src/cpprealm/internal/scheduler/realm_core_scheduler.cpp @@ -14,7 +14,6 @@ namespace realm::internal { bool realm_core_scheduler::is_same_as(const scheduler *other) const noexcept { if (auto o = dynamic_cast(other)) { return o->s->is_same_as(this->s.get()); - ; } return false; } diff --git a/src/cpprealm/schedulers/default_scheduler.cpp b/src/cpprealm/schedulers/default_scheduler.cpp index fb23f065..a3e15c74 100644 --- a/src/cpprealm/schedulers/default_scheduler.cpp +++ b/src/cpprealm/schedulers/default_scheduler.cpp @@ -8,7 +8,7 @@ #endif namespace realm::default_scheduler { - std::shared_ptr (*s_factory)() = make_platform_default; + std::function()> s_factory = make_platform_default; std::shared_ptr make_platform_default() { #if REALM_PLATFORM_APPLE || REALM_ANDROID && !defined(REALM_AOSP_VENDOR) @@ -20,8 +20,8 @@ namespace realm::default_scheduler { #endif } - void set_default_factory(std::shared_ptr (*factory)()) { - s_factory = std::move(factory); + void set_default_factory(std::function()>&& factory_fn) { + s_factory = std::move(factory_fn); } /** diff --git a/tests/db/run_loop_tests.cpp b/tests/db/run_loop_tests.cpp index c19aa760..1daee199 100644 --- a/tests/db/run_loop_tests.cpp +++ b/tests/db/run_loop_tests.cpp @@ -136,17 +136,20 @@ TEST_CASE("user defined uv_loop", "[scheduler]") { v2.wait(lock2, [&] { return signal2; }); } - SECTION("main thread", "[run loops]") { + SECTION("main thread", "[scheduler]") { realm::notification_token t1; realm::notification_token t2; bool signal = false; auto loop = uv_loop_new(); + auto scheduler = realm::default_scheduler::make_uv(loop); auto obj = realm::AllTypesObject(); - auto config = realm::db_config(path, realm::default_scheduler::make_uv(loop)); + auto config = realm::db_config(); + config.set_path(path); + config.set_scheduler(scheduler); + auto realm = realm::db(config); - auto realm = realm::db(std::move(config)); auto managed_obj = realm.write([&realm, &obj] { return realm.add(std::move(obj)); }); @@ -168,6 +171,18 @@ TEST_CASE("user defined uv_loop", "[scheduler]") { uv_loop_close(loop); free(loop); } + + SECTION("set default factory", "[scheduler]") { + auto loop = uv_loop_new(); + auto scheduler = realm::default_scheduler::make_uv(loop); + + realm::default_scheduler::set_default_factory([&]() { return scheduler; }); + auto default_scheduler = realm::default_scheduler::make_default(); + CHECK(scheduler->is_same_as(default_scheduler.get())); + + uv_loop_close(loop); + free(loop); + } } #endif \ No newline at end of file