From f0906250a181c831508a45434b9f645ff98f33e4 Mon Sep 17 00:00:00 2001 From: Tom Date: Fri, 21 Aug 2020 09:36:51 -0600 Subject: [PATCH] Kernel: Move Singleton class to AK --- AK/FlyString.cpp | 8 ++++---- {Kernel => AK}/Singleton.h | 25 +++++++++++++++++++++---- Kernel/Console.cpp | 4 ++-- Kernel/Devices/BXVGADevice.cpp | 4 ++-- Kernel/Devices/Device.cpp | 4 ++-- Kernel/Devices/KeyboardDevice.cpp | 4 ++-- Kernel/Devices/NullDevice.cpp | 4 ++-- Kernel/Devices/PATAChannel.cpp | 4 ++-- Kernel/Devices/PS2MouseDevice.cpp | 4 ++-- Kernel/Devices/SB16.cpp | 4 ++-- Kernel/Devices/VMWareBackdoor.cpp | 4 ++-- Kernel/FileSystem/DevPtsFS.cpp | 4 ++-- Kernel/FileSystem/FIFO.cpp | 4 ++-- Kernel/FileSystem/FileSystem.cpp | 4 ++-- Kernel/FileSystem/Inode.cpp | 4 ++-- Kernel/FileSystem/VirtualFileSystem.cpp | 4 ++-- Kernel/Interrupts/APIC.cpp | 4 ++-- Kernel/Net/IPv4Socket.cpp | 4 ++-- Kernel/Net/LocalSocket.cpp | 4 ++-- Kernel/Net/LoopbackAdapter.cpp | 4 ++-- Kernel/Net/NetworkAdapter.cpp | 4 ++-- Kernel/Net/Routing.cpp | 4 ++-- Kernel/Net/TCPSocket.cpp | 13 ++++++------- Kernel/Net/UDPSocket.cpp | 4 ++-- Kernel/Random.cpp | 4 ++-- Kernel/SharedBuffer.cpp | 4 ++-- Kernel/TTY/PTYMultiplexer.cpp | 4 ++-- Kernel/Time/TimeManagement.cpp | 4 ++-- Kernel/TimerQueue.cpp | 4 ++-- Kernel/VM/MemoryManager.cpp | 4 ++-- Kernel/VM/PageDirectory.cpp | 4 ++-- 31 files changed, 87 insertions(+), 71 deletions(-) rename {Kernel => AK}/Singleton.h (87%) diff --git a/AK/FlyString.cpp b/AK/FlyString.cpp index fdf2eed56a..e6e369c3f6 100644 --- a/AK/FlyString.cpp +++ b/AK/FlyString.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -47,12 +48,11 @@ struct FlyStringImplTraits : public AK::Traits { } }; +static auto s_table = make_singleton>(); + static HashTable& fly_impls() { - static HashTable* table; - if (!table) - table = new HashTable; - return *table; + return *s_table; } void FlyString::did_destroy_impl(Badge, StringImpl& impl) diff --git a/Kernel/Singleton.h b/AK/Singleton.h similarity index 87% rename from Kernel/Singleton.h rename to AK/Singleton.h index 5271aa08ee..57962e3176 100644 --- a/Kernel/Singleton.h +++ b/AK/Singleton.h @@ -26,20 +26,33 @@ #pragma once +#include #include +#include +#ifdef KERNEL #include +#endif -namespace Kernel { +#ifndef __serenity__ +# include +#endif + +namespace AK { template 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 - ScopedCritical critical; +#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(); @@ -47,7 +60,11 @@ public: } else { // Someone else was faster, wait until they're done while (obj == (T*)0x1) { - Processor::wait_check(); +#ifdef KERNEL + Kernel::Processor::wait_check(); +#else + // TODO: yield +#endif obj = AK::atomic_load(&m_obj, AK::memory_order_consume); } } @@ -102,7 +119,7 @@ struct SingletonInstanceCreator { }; template -static Singleton::create> make_singleton() +inline Singleton::create> make_singleton() { return Singleton::create>(); } diff --git a/Kernel/Console.cpp b/Kernel/Console.cpp index f1416cb535..c3fa023521 100644 --- a/Kernel/Console.cpp +++ b/Kernel/Console.cpp @@ -24,16 +24,16 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include -#include #include // Bytes output to 0xE9 end up on the Bochs console. It's very handy. #define CONSOLE_OUT_TO_E9 -static auto s_the = Kernel::make_singleton(); +static auto s_the = AK::make_singleton(); static Kernel::SpinLock g_console_lock; void Console::initialize() diff --git a/Kernel/Devices/BXVGADevice.cpp b/Kernel/Devices/BXVGADevice.cpp index c31e6ec1f1..ee822dac29 100644 --- a/Kernel/Devices/BXVGADevice.cpp +++ b/Kernel/Devices/BXVGADevice.cpp @@ -25,11 +25,11 @@ */ #include +#include #include #include #include #include -#include #include #include #include @@ -57,7 +57,7 @@ namespace Kernel { #define VBE_DISPI_ENABLED 0x01 #define VBE_DISPI_LFB_ENABLED 0x40 -static auto s_the = make_singleton(); +static auto s_the = AK::make_singleton(); void BXVGADevice::initialize() { diff --git a/Kernel/Devices/Device.cpp b/Kernel/Devices/Device.cpp index d89a57506c..e08a0ac6f5 100644 --- a/Kernel/Devices/Device.cpp +++ b/Kernel/Devices/Device.cpp @@ -24,14 +24,14 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include -#include #include namespace Kernel { -static auto s_all_devices = make_singleton>(); +static auto s_all_devices = AK::make_singleton>(); HashMap& Device::all_devices() { diff --git a/Kernel/Devices/KeyboardDevice.cpp b/Kernel/Devices/KeyboardDevice.cpp index 2fd53797e6..192b54c721 100644 --- a/Kernel/Devices/KeyboardDevice.cpp +++ b/Kernel/Devices/KeyboardDevice.cpp @@ -26,12 +26,12 @@ #include #include +#include #include #include #include #include #include -#include #include //#define KEYBOARD_DEBUG @@ -336,7 +336,7 @@ void KeyboardDevice::handle_irq(const RegisterState&) } } -static auto s_the = make_singleton(); +static auto s_the = AK::make_singleton(); void KeyboardDevice::initialize() { diff --git a/Kernel/Devices/NullDevice.cpp b/Kernel/Devices/NullDevice.cpp index 5e64920acc..e879759d1d 100644 --- a/Kernel/Devices/NullDevice.cpp +++ b/Kernel/Devices/NullDevice.cpp @@ -25,12 +25,12 @@ */ #include "NullDevice.h" +#include #include -#include namespace Kernel { -static auto s_the = make_singleton(); +static auto s_the = AK::make_singleton(); void NullDevice::initialize() { diff --git a/Kernel/Devices/PATAChannel.cpp b/Kernel/Devices/PATAChannel.cpp index 59295e5373..553acd412b 100644 --- a/Kernel/Devices/PATAChannel.cpp +++ b/Kernel/Devices/PATAChannel.cpp @@ -25,13 +25,13 @@ */ #include +#include #include #include #include #include #include #include -#include #include namespace Kernel { @@ -108,7 +108,7 @@ namespace Kernel { #define PCI_Mass_Storage_Class 0x1 #define PCI_IDE_Controller_Subclass 0x1 -static auto s_pata_lock = make_singleton(); +static auto s_pata_lock = AK::make_singleton(); static Lock& s_lock() { diff --git a/Kernel/Devices/PS2MouseDevice.cpp b/Kernel/Devices/PS2MouseDevice.cpp index dfb5f01bec..913b6d5c73 100644 --- a/Kernel/Devices/PS2MouseDevice.cpp +++ b/Kernel/Devices/PS2MouseDevice.cpp @@ -25,10 +25,10 @@ */ #include +#include #include #include #include -#include namespace Kernel { @@ -57,7 +57,7 @@ namespace Kernel { //#define PS2MOUSE_DEBUG -static auto s_the = make_singleton(); +static auto s_the = AK::make_singleton(); PS2MouseDevice::PS2MouseDevice() : IRQHandler(IRQ_MOUSE) diff --git a/Kernel/Devices/SB16.cpp b/Kernel/Devices/SB16.cpp index 38f81f2680..8e5611a836 100644 --- a/Kernel/Devices/SB16.cpp +++ b/Kernel/Devices/SB16.cpp @@ -25,13 +25,13 @@ */ #include +#include #include #include #include #include #include #include -#include //#define SB16_DEBUG @@ -77,7 +77,7 @@ void SB16::set_sample_rate(uint16_t hz) dsp_write((u8)hz); } -static auto s_the = make_singleton(); +static auto s_the = AK::make_singleton(); SB16::SB16() : IRQHandler(SB16_DEFAULT_IRQ) diff --git a/Kernel/Devices/VMWareBackdoor.cpp b/Kernel/Devices/VMWareBackdoor.cpp index 8ba15600da..04499e522a 100644 --- a/Kernel/Devices/VMWareBackdoor.cpp +++ b/Kernel/Devices/VMWareBackdoor.cpp @@ -26,13 +26,13 @@ #include #include +#include #include #include #include #include #include #include -#include namespace Kernel { @@ -111,7 +111,7 @@ private: OwnPtr m_backdoor; }; -static auto s_vmware_backdoor = make_singleton(); +static auto s_vmware_backdoor = AK::make_singleton(); VMWareBackdoor* VMWareBackdoor::the() { diff --git a/Kernel/FileSystem/DevPtsFS.cpp b/Kernel/FileSystem/DevPtsFS.cpp index b3db215c5d..2849b8f58b 100644 --- a/Kernel/FileSystem/DevPtsFS.cpp +++ b/Kernel/FileSystem/DevPtsFS.cpp @@ -24,11 +24,11 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include #include -#include #include namespace Kernel { @@ -46,7 +46,7 @@ DevPtsFS::~DevPtsFS() { } -static auto s_ptys = make_singleton>(); +static auto s_ptys = AK::make_singleton>(); bool DevPtsFS::initialize() { diff --git a/Kernel/FileSystem/FIFO.cpp b/Kernel/FileSystem/FIFO.cpp index 670266cbce..52daa26f50 100644 --- a/Kernel/FileSystem/FIFO.cpp +++ b/Kernel/FileSystem/FIFO.cpp @@ -25,20 +25,20 @@ */ #include +#include #include #include #include #include #include #include -#include #include //#define FIFO_DEBUG namespace Kernel { -static auto s_table = make_singleton>>(); +static auto s_table = AK::make_singleton>>(); static Lockable>& all_fifos() { diff --git a/Kernel/FileSystem/FileSystem.cpp b/Kernel/FileSystem/FileSystem.cpp index 450f401253..2a96fb6e6c 100644 --- a/Kernel/FileSystem/FileSystem.cpp +++ b/Kernel/FileSystem/FileSystem.cpp @@ -26,19 +26,19 @@ #include #include +#include #include #include #include #include #include -#include #include #include namespace Kernel { static u32 s_lastFileSystemID; -static auto s_fs_map = make_singleton>(); +static auto s_fs_map = AK::make_singleton>(); static HashMap& all_fses() { diff --git a/Kernel/FileSystem/Inode.cpp b/Kernel/FileSystem/Inode.cpp index c136ffc2a0..edfba2eac9 100644 --- a/Kernel/FileSystem/Inode.cpp +++ b/Kernel/FileSystem/Inode.cpp @@ -25,6 +25,7 @@ */ #include +#include #include #include #include @@ -33,13 +34,12 @@ #include #include #include -#include #include namespace Kernel { static SpinLock s_all_inodes_lock; -static auto s_list = make_singleton>(); +static auto s_list = AK::make_singleton>(); InlineLinkedList& Inode::all_with_lock() { diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp index cc0510a570..9ea1a2d5c7 100644 --- a/Kernel/FileSystem/VirtualFileSystem.cpp +++ b/Kernel/FileSystem/VirtualFileSystem.cpp @@ -25,6 +25,7 @@ */ #include +#include #include #include #include @@ -34,14 +35,13 @@ #include #include #include -#include #include //#define VFS_DEBUG namespace Kernel { -static auto s_the = make_singleton(); +static auto s_the = AK::make_singleton(); static constexpr int symlink_recursion_limit { 5 }; // FIXME: increase? static constexpr int root_mount_flags = MS_NODEV | MS_NOSUID | MS_RDONLY; diff --git a/Kernel/Interrupts/APIC.cpp b/Kernel/Interrupts/APIC.cpp index d3e86af19d..d92416ab9c 100644 --- a/Kernel/Interrupts/APIC.cpp +++ b/Kernel/Interrupts/APIC.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -34,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -69,7 +69,7 @@ namespace Kernel { -static auto s_apic = make_singleton(); +static auto s_apic = AK::make_singleton(); class APICIPIInterruptHandler final : public GenericInterruptHandler { public: diff --git a/Kernel/Net/IPv4Socket.cpp b/Kernel/Net/IPv4Socket.cpp index 8286e5a2e8..2861f1a90e 100644 --- a/Kernel/Net/IPv4Socket.cpp +++ b/Kernel/Net/IPv4Socket.cpp @@ -24,8 +24,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include -#include #include #include #include @@ -46,7 +46,7 @@ namespace Kernel { -static auto s_table = make_singleton>>(); +static auto s_table = AK::make_singleton>>(); Lockable>& IPv4Socket::all_sockets() { diff --git a/Kernel/Net/LocalSocket.cpp b/Kernel/Net/LocalSocket.cpp index c703cc8ac6..6750f93403 100644 --- a/Kernel/Net/LocalSocket.cpp +++ b/Kernel/Net/LocalSocket.cpp @@ -24,12 +24,12 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include #include #include -#include #include #include #include @@ -38,7 +38,7 @@ namespace Kernel { -static auto s_list = make_singleton>>(); +static auto s_list = AK::make_singleton>>(); Lockable>& LocalSocket::all_sockets() { diff --git a/Kernel/Net/LoopbackAdapter.cpp b/Kernel/Net/LoopbackAdapter.cpp index 27faa8bfad..6b858c9549 100644 --- a/Kernel/Net/LoopbackAdapter.cpp +++ b/Kernel/Net/LoopbackAdapter.cpp @@ -24,12 +24,12 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include -#include namespace Kernel { -static auto s_loopback = make_singleton(); +static auto s_loopback = AK::make_singleton(); LoopbackAdapter& LoopbackAdapter::the() { diff --git a/Kernel/Net/NetworkAdapter.cpp b/Kernel/Net/NetworkAdapter.cpp index 936bf9a2e7..898c95d710 100644 --- a/Kernel/Net/NetworkAdapter.cpp +++ b/Kernel/Net/NetworkAdapter.cpp @@ -25,6 +25,7 @@ */ #include +#include #include #include #include @@ -33,12 +34,11 @@ #include #include #include -#include #include namespace Kernel { -static auto s_table = make_singleton>>(); +static auto s_table = AK::make_singleton>>(); static Lockable>& all_adapters() { diff --git a/Kernel/Net/Routing.cpp b/Kernel/Net/Routing.cpp index 5f72ab1166..d73704cccf 100644 --- a/Kernel/Net/Routing.cpp +++ b/Kernel/Net/Routing.cpp @@ -25,16 +25,16 @@ */ #include +#include #include #include #include -#include //#define ROUTING_DEBUG namespace Kernel { -static auto s_arp_table = make_singleton>>(); +static auto s_arp_table = AK::make_singleton>>(); Lockable>& arp_table() { diff --git a/Kernel/Net/TCPSocket.cpp b/Kernel/Net/TCPSocket.cpp index 7b8c12a49c..af7f5bb9f4 100644 --- a/Kernel/Net/TCPSocket.cpp +++ b/Kernel/Net/TCPSocket.cpp @@ -24,6 +24,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include @@ -33,7 +34,6 @@ #include #include #include -#include //#define TCP_SOCKET_DEBUG @@ -63,19 +63,18 @@ void TCPSocket::set_state(State new_state) } } +static auto s_socket_closing = AK::make_singleton>>>(); + Lockable>>& TCPSocket::closing_sockets() { - static Lockable>>* s_map; - if (!s_map) - s_map = new Lockable>>; - return *s_map; + return *s_socket_closing; } -static auto s_map = make_singleton>>(); +static auto s_socket_tuples = AK::make_singleton>>(); Lockable>& TCPSocket::sockets_by_tuple() { - return *s_map; + return *s_socket_tuples; } RefPtr TCPSocket::from_tuple(const IPv4SocketTuple& tuple) diff --git a/Kernel/Net/UDPSocket.cpp b/Kernel/Net/UDPSocket.cpp index ad57696675..27901a2e82 100644 --- a/Kernel/Net/UDPSocket.cpp +++ b/Kernel/Net/UDPSocket.cpp @@ -24,6 +24,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include @@ -31,7 +32,6 @@ #include #include #include -#include namespace Kernel { @@ -42,7 +42,7 @@ void UDPSocket::for_each(Function callback) callback(*it.value); } -static auto s_map = make_singleton>>(); +static auto s_map = AK::make_singleton>>(); Lockable>& UDPSocket::sockets_by_port() { diff --git a/Kernel/Random.cpp b/Kernel/Random.cpp index b01b4aa5da..472f4519c5 100644 --- a/Kernel/Random.cpp +++ b/Kernel/Random.cpp @@ -25,15 +25,15 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include -#include #include namespace Kernel { -static auto s_the = make_singleton(); +static auto s_the = AK::make_singleton(); KernelRng& KernelRng::the() { diff --git a/Kernel/SharedBuffer.cpp b/Kernel/SharedBuffer.cpp index 49401e15e0..a5186773a4 100644 --- a/Kernel/SharedBuffer.cpp +++ b/Kernel/SharedBuffer.cpp @@ -24,13 +24,13 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include -#include #include namespace Kernel { -static auto s_map = make_singleton>>>(); +static auto s_map = AK::make_singleton>>>(); Lockable>>& shared_buffers() { diff --git a/Kernel/TTY/PTYMultiplexer.cpp b/Kernel/TTY/PTYMultiplexer.cpp index 4f8d48806e..c44a565ae9 100644 --- a/Kernel/TTY/PTYMultiplexer.cpp +++ b/Kernel/TTY/PTYMultiplexer.cpp @@ -26,9 +26,9 @@ #include "PTYMultiplexer.h" #include "MasterPTY.h" +#include #include #include -#include #include //#define PTMX_DEBUG @@ -36,7 +36,7 @@ namespace Kernel { static const unsigned s_max_pty_pairs = 8; -static auto s_the = make_singleton(); +static auto s_the = AK::make_singleton(); PTYMultiplexer& PTYMultiplexer::the() { diff --git a/Kernel/Time/TimeManagement.cpp b/Kernel/Time/TimeManagement.cpp index 7982c354b5..ff37fa33aa 100644 --- a/Kernel/Time/TimeManagement.cpp +++ b/Kernel/Time/TimeManagement.cpp @@ -24,6 +24,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include #include @@ -32,7 +33,6 @@ #include #include #include -#include #include #include @@ -40,7 +40,7 @@ namespace Kernel { -static auto s_the = make_singleton(); +static auto s_the = AK::make_singleton(); TimeManagement& TimeManagement::the() { diff --git a/Kernel/TimerQueue.cpp b/Kernel/TimerQueue.cpp index 41197d6861..d12e4ecd52 100644 --- a/Kernel/TimerQueue.cpp +++ b/Kernel/TimerQueue.cpp @@ -27,14 +27,14 @@ #include #include #include +#include #include -#include #include #include namespace Kernel { -static auto s_the = make_singleton(); +static auto s_the = AK::make_singleton(); TimerQueue& TimerQueue::the() { diff --git a/Kernel/VM/MemoryManager.cpp b/Kernel/VM/MemoryManager.cpp index 8280503679..9c984de81e 100644 --- a/Kernel/VM/MemoryManager.cpp +++ b/Kernel/VM/MemoryManager.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -39,7 +40,6 @@ #include #include #include -#include #include //#define MM_DEBUG @@ -51,7 +51,7 @@ extern FlatPtr end_of_kernel_bss; namespace Kernel { -static auto s_the = make_singleton(); +static auto s_the = AK::make_singleton(); RecursiveSpinLock s_mm_lock; MemoryManager& MM diff --git a/Kernel/VM/PageDirectory.cpp b/Kernel/VM/PageDirectory.cpp index 1b15853d94..573caa28db 100644 --- a/Kernel/VM/PageDirectory.cpp +++ b/Kernel/VM/PageDirectory.cpp @@ -25,9 +25,9 @@ */ #include +#include #include #include -#include #include #include #include @@ -38,7 +38,7 @@ static const FlatPtr userspace_range_base = 0x00800000; static const FlatPtr userspace_range_ceiling = 0xbe000000; static const FlatPtr kernelspace_range_base = 0xc0800000; -static auto s_cr3_map = make_singleton>(); +static auto s_cr3_map = AK::make_singleton>(); static HashMap& cr3_map() {