meso: Implement KObjectRegistry

This commit is contained in:
TuxSH
2018-11-13 16:06:20 +01:00
committed by Michael Scire
parent fb4e0988b9
commit 757aa30e74
3 changed files with 134 additions and 0 deletions

View File

@@ -389,6 +389,18 @@ class KLinkedList final {
return nd->data;
}
template< class... Args>
T *emplace_back_or_fail(Args&&... args)
{
auto *nd = new typename List::Node{std::forward<Args>(args)...};
if (nd != nullptr) {
insert_node_after(list.last(), &nd->link);
return &nd->data;
} else {
return nullptr;
}
}
void pop_back()
{
auto *nd = list.last();

View File

@@ -0,0 +1,43 @@
#pragma once
#include <mesosphere/core/KAutoObject.hpp>
#include <mesosphere/core/KLinkedList.hpp>
#include <mesosphere/core/Result.hpp>
#include <mesosphere/threading/KMutex.hpp>
#include <cstring>
namespace mesosphere
{
class KObjectRegistry {
public:
static KObjectRegistry &GetInstance() { return instance; }
SharedPtr<KAutoObject> Find(const char *name) const;
Result Register(SharedPtr<KAutoObject> obj, const char *name);
Result Unregister(const char *name);
private:
struct Node {
SharedPtr<KAutoObject> obj{};
char name[12] = {0};
Node() = default;
Node(SharedPtr<KAutoObject> &&obj, const char *name) : obj{obj}
{
std::strncpy(this->name, name, sizeof(this->name));
}
};
const Node *FindImpl(const char *name) const;
Node *FindImpl(const char *name);
KLinkedList<Node> nameNodes{};
mutable KMutex mutex{};
static KObjectRegistry instance;
};
}