mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	kernel: remove KLinkedList
This commit is contained in:
		@@ -211,7 +211,6 @@ add_library(core STATIC
 | 
			
		||||
    hle/kernel/k_light_condition_variable.h
 | 
			
		||||
    hle/kernel/k_light_lock.cpp
 | 
			
		||||
    hle/kernel/k_light_lock.h
 | 
			
		||||
    hle/kernel/k_linked_list.h
 | 
			
		||||
    hle/kernel/k_memory_block.h
 | 
			
		||||
    hle/kernel/k_memory_block_manager.cpp
 | 
			
		||||
    hle/kernel/k_memory_block_manager.h
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@
 | 
			
		||||
#include "core/arm/exclusive_monitor.h"
 | 
			
		||||
#include "core/core.h"
 | 
			
		||||
#include "core/hle/kernel/k_condition_variable.h"
 | 
			
		||||
#include "core/hle/kernel/k_linked_list.h"
 | 
			
		||||
#include "core/hle/kernel/k_process.h"
 | 
			
		||||
#include "core/hle/kernel/k_scheduler.h"
 | 
			
		||||
#include "core/hle/kernel/k_scoped_scheduler_lock_and_sleep.h"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,238 +0,0 @@
 | 
			
		||||
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
 | 
			
		||||
// SPDX-License-Identifier: GPL-2.0-or-later
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <boost/intrusive/list.hpp>
 | 
			
		||||
 | 
			
		||||
#include "common/assert.h"
 | 
			
		||||
#include "core/hle/kernel/slab_helpers.h"
 | 
			
		||||
 | 
			
		||||
namespace Kernel {
 | 
			
		||||
 | 
			
		||||
class KernelCore;
 | 
			
		||||
 | 
			
		||||
class KLinkedListNode : public boost::intrusive::list_base_hook<>,
 | 
			
		||||
                        public KSlabAllocated<KLinkedListNode> {
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    explicit KLinkedListNode(KernelCore&) {}
 | 
			
		||||
    KLinkedListNode() = default;
 | 
			
		||||
 | 
			
		||||
    void Initialize(void* it) {
 | 
			
		||||
        m_item = it;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void* GetItem() const {
 | 
			
		||||
        return m_item;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    void* m_item = nullptr;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class KLinkedList : private boost::intrusive::list<KLinkedListNode> {
 | 
			
		||||
private:
 | 
			
		||||
    using BaseList = boost::intrusive::list<KLinkedListNode>;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    template <bool Const>
 | 
			
		||||
    class Iterator;
 | 
			
		||||
 | 
			
		||||
    using value_type = T;
 | 
			
		||||
    using size_type = size_t;
 | 
			
		||||
    using difference_type = ptrdiff_t;
 | 
			
		||||
    using pointer = value_type*;
 | 
			
		||||
    using const_pointer = const value_type*;
 | 
			
		||||
    using reference = value_type&;
 | 
			
		||||
    using const_reference = const value_type&;
 | 
			
		||||
    using iterator = Iterator<false>;
 | 
			
		||||
    using const_iterator = Iterator<true>;
 | 
			
		||||
    using reverse_iterator = std::reverse_iterator<iterator>;
 | 
			
		||||
    using const_reverse_iterator = std::reverse_iterator<const_iterator>;
 | 
			
		||||
 | 
			
		||||
    template <bool Const>
 | 
			
		||||
    class Iterator {
 | 
			
		||||
    private:
 | 
			
		||||
        using BaseIterator = BaseList::iterator;
 | 
			
		||||
        friend class KLinkedList;
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
        using iterator_category = std::bidirectional_iterator_tag;
 | 
			
		||||
        using value_type = typename KLinkedList::value_type;
 | 
			
		||||
        using difference_type = typename KLinkedList::difference_type;
 | 
			
		||||
        using pointer = std::conditional_t<Const, KLinkedList::const_pointer, KLinkedList::pointer>;
 | 
			
		||||
        using reference =
 | 
			
		||||
            std::conditional_t<Const, KLinkedList::const_reference, KLinkedList::reference>;
 | 
			
		||||
 | 
			
		||||
    public:
 | 
			
		||||
        explicit Iterator(BaseIterator it) : m_base_it(it) {}
 | 
			
		||||
 | 
			
		||||
        pointer GetItem() const {
 | 
			
		||||
            return static_cast<pointer>(m_base_it->GetItem());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        bool operator==(const Iterator& rhs) const {
 | 
			
		||||
            return m_base_it == rhs.m_base_it;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        bool operator!=(const Iterator& rhs) const {
 | 
			
		||||
            return !(*this == rhs);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        pointer operator->() const {
 | 
			
		||||
            return this->GetItem();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        reference operator*() const {
 | 
			
		||||
            return *this->GetItem();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Iterator& operator++() {
 | 
			
		||||
            ++m_base_it;
 | 
			
		||||
            return *this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Iterator& operator--() {
 | 
			
		||||
            --m_base_it;
 | 
			
		||||
            return *this;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Iterator operator++(int) {
 | 
			
		||||
            const Iterator it{*this};
 | 
			
		||||
            ++(*this);
 | 
			
		||||
            return it;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        Iterator operator--(int) {
 | 
			
		||||
            const Iterator it{*this};
 | 
			
		||||
            --(*this);
 | 
			
		||||
            return it;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        operator Iterator<true>() const {
 | 
			
		||||
            return Iterator<true>(m_base_it);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
        BaseIterator m_base_it;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    constexpr KLinkedList(KernelCore& kernel_) : BaseList(), kernel{kernel_} {}
 | 
			
		||||
 | 
			
		||||
    ~KLinkedList() {
 | 
			
		||||
        // Erase all elements.
 | 
			
		||||
        for (auto it = begin(); it != end(); it = erase(it)) {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Ensure we succeeded.
 | 
			
		||||
        ASSERT(this->empty());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Iterator accessors.
 | 
			
		||||
    iterator begin() {
 | 
			
		||||
        return iterator(BaseList::begin());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const_iterator begin() const {
 | 
			
		||||
        return const_iterator(BaseList::begin());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    iterator end() {
 | 
			
		||||
        return iterator(BaseList::end());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const_iterator end() const {
 | 
			
		||||
        return const_iterator(BaseList::end());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const_iterator cbegin() const {
 | 
			
		||||
        return this->begin();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const_iterator cend() const {
 | 
			
		||||
        return this->end();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    reverse_iterator rbegin() {
 | 
			
		||||
        return reverse_iterator(this->end());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const_reverse_iterator rbegin() const {
 | 
			
		||||
        return const_reverse_iterator(this->end());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    reverse_iterator rend() {
 | 
			
		||||
        return reverse_iterator(this->begin());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const_reverse_iterator rend() const {
 | 
			
		||||
        return const_reverse_iterator(this->begin());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const_reverse_iterator crbegin() const {
 | 
			
		||||
        return this->rbegin();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const_reverse_iterator crend() const {
 | 
			
		||||
        return this->rend();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Content management.
 | 
			
		||||
    using BaseList::empty;
 | 
			
		||||
    using BaseList::size;
 | 
			
		||||
 | 
			
		||||
    reference back() {
 | 
			
		||||
        return *(--this->end());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const_reference back() const {
 | 
			
		||||
        return *(--this->end());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    reference front() {
 | 
			
		||||
        return *this->begin();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const_reference front() const {
 | 
			
		||||
        return *this->begin();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    iterator insert(const_iterator pos, reference ref) {
 | 
			
		||||
        KLinkedListNode* new_node = KLinkedListNode::Allocate(kernel);
 | 
			
		||||
        ASSERT(new_node != nullptr);
 | 
			
		||||
        new_node->Initialize(std::addressof(ref));
 | 
			
		||||
        return iterator(BaseList::insert(pos.m_base_it, *new_node));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void push_back(reference ref) {
 | 
			
		||||
        this->insert(this->end(), ref);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void push_front(reference ref) {
 | 
			
		||||
        this->insert(this->begin(), ref);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void pop_back() {
 | 
			
		||||
        this->erase(--this->end());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void pop_front() {
 | 
			
		||||
        this->erase(this->begin());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    iterator erase(const iterator pos) {
 | 
			
		||||
        KLinkedListNode* freed_node = std::addressof(*pos.m_base_it);
 | 
			
		||||
        iterator ret = iterator(BaseList::erase(pos.m_base_it));
 | 
			
		||||
        KLinkedListNode::Free(kernel, freed_node);
 | 
			
		||||
 | 
			
		||||
        return ret;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    KernelCore& kernel;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace Kernel
 | 
			
		||||
@@ -1320,7 +1320,6 @@ const Core::System& KernelCore::System() const {
 | 
			
		||||
struct KernelCore::SlabHeapContainer {
 | 
			
		||||
    KSlabHeap<KClientSession> client_session;
 | 
			
		||||
    KSlabHeap<KEvent> event;
 | 
			
		||||
    KSlabHeap<KLinkedListNode> linked_list_node;
 | 
			
		||||
    KSlabHeap<KPort> port;
 | 
			
		||||
    KSlabHeap<KProcess> process;
 | 
			
		||||
    KSlabHeap<KResourceLimit> resource_limit;
 | 
			
		||||
@@ -1347,8 +1346,6 @@ KSlabHeap<T>& KernelCore::SlabHeap() {
 | 
			
		||||
        return slab_heap_container->client_session;
 | 
			
		||||
    } else if constexpr (std::is_same_v<T, KEvent>) {
 | 
			
		||||
        return slab_heap_container->event;
 | 
			
		||||
    } else if constexpr (std::is_same_v<T, KLinkedListNode>) {
 | 
			
		||||
        return slab_heap_container->linked_list_node;
 | 
			
		||||
    } else if constexpr (std::is_same_v<T, KPort>) {
 | 
			
		||||
        return slab_heap_container->port;
 | 
			
		||||
    } else if constexpr (std::is_same_v<T, KProcess>) {
 | 
			
		||||
@@ -1390,7 +1387,6 @@ KSlabHeap<T>& KernelCore::SlabHeap() {
 | 
			
		||||
 | 
			
		||||
template KSlabHeap<KClientSession>& KernelCore::SlabHeap();
 | 
			
		||||
template KSlabHeap<KEvent>& KernelCore::SlabHeap();
 | 
			
		||||
template KSlabHeap<KLinkedListNode>& KernelCore::SlabHeap();
 | 
			
		||||
template KSlabHeap<KPort>& KernelCore::SlabHeap();
 | 
			
		||||
template KSlabHeap<KProcess>& KernelCore::SlabHeap();
 | 
			
		||||
template KSlabHeap<KResourceLimit>& KernelCore::SlabHeap();
 | 
			
		||||
 
 | 
			
		||||
@@ -47,7 +47,6 @@ class KEvent;
 | 
			
		||||
class KEventInfo;
 | 
			
		||||
class KHandleTable;
 | 
			
		||||
class KHardwareTimer;
 | 
			
		||||
class KLinkedListNode;
 | 
			
		||||
class KMemoryLayout;
 | 
			
		||||
class KMemoryManager;
 | 
			
		||||
class KObjectName;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user