diff --git a/src/native/clr/host/host.cc b/src/native/clr/host/host.cc index f7895fd365d..bda59ec9cc5 100644 --- a/src/native/clr/host/host.cc +++ b/src/native/clr/host/host.cc @@ -316,7 +316,7 @@ void Host::Java_mono_android_Runtime_initInternal ( FastTiming::initialize ((Logger::log_timing_categories() & LogTimingCategories::FastBare) != LogTimingCategories::FastBare); if (FastTiming::enabled ()) [[unlikely]] { - _timing = std::make_shared (); + _timing = new Timing (); internal_timing.start_event (TimingEventKind::TotalRuntimeInit); } diff --git a/src/native/clr/host/internal-pinvokes-clr.cc b/src/native/clr/host/internal-pinvokes-clr.cc index 844f9b748f0..f547387c67a 100644 --- a/src/native/clr/host/internal-pinvokes-clr.cc +++ b/src/native/clr/host/internal-pinvokes-clr.cc @@ -41,11 +41,8 @@ _monodroid_lookup_replacement_method_info (const char *jniSourceType, const char managed_timing_sequence* monodroid_timing_start (const char *message) { - // Technically a reference here is against the idea of shared pointers, but - // in this instance it's fine since we know we won't be storing the pointer - // and this way things are slightly faster. - std::shared_ptr const &timing = Host::get_timing (); - if (!timing) { + Timing *timing = Host::get_timing (); + if (timing == nullptr) { return nullptr; } @@ -64,8 +61,8 @@ void monodroid_timing_stop (managed_timing_sequence *sequence, const char *messa return; } - std::shared_ptr const &timing = Host::get_timing (); - if (!timing) [[unlikely]] { + Timing *timing = Host::get_timing (); + if (timing == nullptr) [[unlikely]] { return; } diff --git a/src/native/clr/include/host/host.hh b/src/native/clr/include/host/host.hh index a492ecf21b6..96517f1a3b9 100644 --- a/src/native/clr/include/host/host.hh +++ b/src/native/clr/include/host/host.hh @@ -23,7 +23,7 @@ namespace xamarin::android { static void Java_mono_android_Runtime_registerNatives (JNIEnv *env, jclass nativeClass) noexcept; static void propagate_uncaught_exception (JNIEnv *env, jobject javaThread, jthrowable javaException) noexcept; - static auto get_timing () -> std::shared_ptr + static auto get_timing () noexcept -> Timing* { return _timing; } @@ -54,7 +54,9 @@ namespace xamarin::android { private: static inline void *clr_host = nullptr; static inline unsigned int domain_id = 0; - static inline std::shared_ptr _timing{}; + // Allocated once, if fast timing is enabled, and intentionally never freed: the instance + // is used for the whole lifetime of the process and released by the OS when it exits. + static inline Timing *_timing = nullptr; static inline bool found_assembly_store = false; static inline jnienv_register_jni_natives_fn jnienv_register_jni_natives = nullptr; static inline jnienv_propagate_uncaught_exception_fn jnienv_propagate_uncaught_exception = nullptr;