summaryrefslogtreecommitdiff
path: root/AK
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-08-22 16:34:49 +0200
committerAndreas Kling <kling@serenityos.org>2020-08-22 16:34:49 +0200
commit8925ad3fa08102c4c4ff2ef36cf5570ddf27c8cd (patch)
tree0b545d6a1a5257ea261d6929b2645d829727c2c9 /AK
parentb0a24a83be9d3885a18ae95870fff664e8c8d118 (diff)
downloadserenity-8925ad3fa08102c4c4ff2ef36cf5570ddf27c8cd.zip
Revert "Kernel: Move Singleton class to AK"
This reverts commit f0906250a181c831508a45434b9f645ff98f33e4.
Diffstat (limited to 'AK')
-rw-r--r--AK/FlyString.cpp8
-rw-r--r--AK/Singleton.h127
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>();
-}
-
-}