/* * Copyright (c) 2021, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Kernel { class DeviceManagement { AK_MAKE_ETERNAL; public: DeviceManagement(); static void initialize(); static DeviceManagement& the(); void attach_null_device(NullDevice const&); bool is_console_device_attached() const { return !m_console_device.is_null(); } void attach_console_device(ConsoleDevice const&); // FIXME: Once we have a singleton for managing many sound cards, remove this from here void attach_sb16_device(SB16 const&); void after_inserting_device(Badge, Device&); void before_device_removal(Badge, Device&); void for_each(Function); Device* get_device(unsigned major, unsigned minor); NullDevice const& null_device() const; NullDevice& null_device(); ConsoleDevice const& console_device() const; ConsoleDevice& console_device(); template static inline ErrorOr> try_create_device(Args&&... args) { auto device = TRY(adopt_nonnull_ref_or_enomem(new DeviceType(forward(args)...))); device->after_inserting(); return device; } private: RefPtr m_null_device; RefPtr m_console_device; // FIXME: Once we have a singleton for managing many sound cards, remove this from here RefPtr m_sb16_device; MutexProtected> m_devices; }; }