diff options
author | Andreas Kling <kling@serenityos.org> | 2020-08-22 16:34:49 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-08-22 16:34:49 +0200 |
commit | 8925ad3fa08102c4c4ff2ef36cf5570ddf27c8cd (patch) | |
tree | 0b545d6a1a5257ea261d6929b2645d829727c2c9 /AK | |
parent | b0a24a83be9d3885a18ae95870fff664e8c8d118 (diff) | |
download | serenity-8925ad3fa08102c4c4ff2ef36cf5570ddf27c8cd.zip |
Revert "Kernel: Move Singleton class to AK"
This reverts commit f0906250a181c831508a45434b9f645ff98f33e4.
Diffstat (limited to 'AK')
-rw-r--r-- | AK/FlyString.cpp | 8 | ||||
-rw-r--r-- | AK/Singleton.h | 127 |
2 files changed, 4 insertions, 131 deletions
diff --git a/AK/FlyString.cpp b/AK/FlyString.cpp index e6e369c3f6..fdf2eed56a 100644 --- a/AK/FlyString.cpp +++ b/AK/FlyString.cpp @@ -27,7 +27,6 @@ #include <AK/FlyString.h> #include <AK/HashTable.h> #include <AK/Optional.h> -#include <AK/Singleton.h> #include <AK/String.h> #include <AK/StringUtils.h> #include <AK/StringView.h> @@ -48,11 +47,12 @@ struct FlyStringImplTraits : public AK::Traits<StringImpl*> { } }; -static auto s_table = make_singleton<HashTable<StringImpl*, FlyStringImplTraits>>(); - static HashTable<StringImpl*, FlyStringImplTraits>& fly_impls() { - return *s_table; + static HashTable<StringImpl*, FlyStringImplTraits>* table; + if (!table) + table = new HashTable<StringImpl*, FlyStringImplTraits>; + return *table; } void FlyString::did_destroy_impl(Badge<StringImpl>, StringImpl& impl) diff --git a/AK/Singleton.h b/AK/Singleton.h deleted file mode 100644 index 57962e3176..0000000000 --- a/AK/Singleton.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2020, the SerenityOS developers. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#pragma once - -#include <AK/Assertions.h> -#include <AK/Atomic.h> -#include <AK/kmalloc.h> -#ifdef KERNEL -#include <Kernel/Arch/i386/CPU.h> -#endif - -#ifndef __serenity__ -# include <new> -#endif - -namespace AK { - -template<typename T, T* (*InitFunction)()> -class Singleton { - AK_MAKE_NONCOPYABLE(Singleton); -public: - Singleton() = default; - - T* ptr() const - { - T* obj = AK::atomic_load(&m_obj, AK::memory_order_consume); - if (FlatPtr(obj) <= 0x1) { - // If this is the first time, see if we get to initialize it -#ifdef KERNEL - Kernel::ScopedCritical critical; -#endif - if (obj == nullptr && AK::atomic_compare_exchange_strong(&m_obj, obj, (T*)0x1, AK::memory_order_acq_rel)) { - // We're the first one - obj = InitFunction(); - AK::atomic_store(&m_obj, obj, AK::memory_order_release); - } else { - // Someone else was faster, wait until they're done - while (obj == (T*)0x1) { -#ifdef KERNEL - Kernel::Processor::wait_check(); -#else - // TODO: yield -#endif - obj = AK::atomic_load(&m_obj, AK::memory_order_consume); - } - } - // We should always return an instance - ASSERT(obj != nullptr); - ASSERT(obj != (T*)0x1); - } - return obj; - } - - T* operator->() const - { - return ptr(); - } - - T& operator*() const - { - return *ptr(); - } - - operator T*() const - { - return ptr(); - } - - operator T&() const - { - return *ptr(); - } - - bool is_initialized() const - { - T* obj = AK::atomic_load(&m_obj, AK::memory_order_consume); - return FlatPtr(obj) > 0x1; - } - - void ensure_instance() - { - (void)ptr(); - } - -private: - mutable T* m_obj { nullptr }; // atomic -}; - -template<typename T> -struct SingletonInstanceCreator { - static T* create() - { - return new T(); - } -}; - -template<typename T> -inline Singleton<T, SingletonInstanceCreator<T>::create> make_singleton() -{ - return Singleton<T, SingletonInstanceCreator<T>::create>(); -} - -} |