/* * 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 #include #include namespace Kernel { class DeviceManagement { public: DeviceManagement(); static void initialize(); static DeviceManagement& the(); void attach_null_device(NullDevice const&); void attach_device_control_device(DeviceControlDevice 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_audio_device(CharacterDevice const&); bool is_device_event_queue_ready_to_read() const; Optional dequeue_top_device_event(Badge); void after_inserting_device(Badge, Device&); void before_device_removal(Badge, Device&); void for_each(Function); Device* get_device(MajorNumber major, MinorNumber 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; RefPtr m_device_control_device; // FIXME: Once we have a singleton for managing many sound cards, remove this from here NonnullRefPtrVector m_audio_devices; MutexProtected> m_devices; mutable Spinlock m_event_queue_lock; CircularQueue m_event_queue; }; }