MOS Source Code
Loading...
Searching...
No Matches
slab.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#pragma once
4
7#include <mos/string.hpp>
8#include <mos/string_view.hpp>
10#include <mos/type_utils.hpp>
11#include <stddef.h>
12
17void slab_init();
18
25void *slab_alloc(size_t size);
26
34void *slab_calloc(size_t nmemb, size_t size);
35
43void *slab_realloc(void *addr, size_t size);
44
50void slab_free(const void *addr);
51
62
63void slab_register(slab_t *slab);
64void *kmemcache_alloc(slab_t *slab);
65void kmemcache_free(slab_t *slab, const void *addr);
66
67namespace mos
68{
69 template<typename T>
70 struct Slab : public slab_t
71 {
72 constexpr Slab(mos::string_view name = T::type_name, size_t size = sizeof(T), mos::string_view type_name = mos::getTypeName<T>())
73 {
74 this->name = name;
75 this->type_name = type_name;
76 this->ent_size = size;
77 }
78
80 {
81 pr_emerg("slab: freeing slab for '%s'", this->type_name.data());
82 }
83
84 template<typename... Args>
85 T *create(Args &&...args)
86 {
87 if (!registered)
88 slab_register(this), registered = true;
89
90 const auto ptr = kmemcache_alloc(this);
91 new (ptr) T(std::forward<Args>(args)...);
92 return static_cast<T *>(ptr);
93 }
94
95 size_t size()
96 {
97 return ent_size;
98 }
99
100 private:
101 bool registered = false;
102 };
103} // namespace mos
char args[3][16]
Definition avr_io.c:16
basic_string_view< char > string_view
static consteval string_view getTypeName()
#define pr_emerg(fmt,...)
Definition printk.hpp:39
mos::shared_ptr< T > ptr
size_t size
Definition slab.cpp:34
void slab_init()
initialise the slab allocator
Definition slab.cpp:112
void * slab_realloc(void *addr, size_t size)
Reallocate a block of memory from the slab allocator.
Definition slab.cpp:157
void slab_register(slab_t *slab)
Definition slab.cpp:122
void * slab_alloc(size_t size)
Allocate a block of memory from the slab allocator.
Definition slab.cpp:129
void kmemcache_free(slab_t *slab, const void *addr)
Definition slab.cpp:245
void slab_free(const void *addr)
Free a block of memory from the slab allocator.
Definition slab.cpp:199
void * kmemcache_alloc(slab_t *slab)
Definition slab.cpp:219
void * slab_calloc(size_t nmemb, size_t size)
Allocate a block of memory from the slab allocator and zero it.
Definition slab.cpp:147
#define SPINLOCK_INIT
Definition spinlock.hpp:31
size_t size()
Definition slab.hpp:95
T * create(Args &&...args)
Definition slab.hpp:85
bool registered
Definition slab.hpp:101
constexpr Slab(mos::string_view name=T::type_name, size_t size=sizeof(T), mos::string_view type_name=mos::getTypeName< T >())
Definition slab.hpp:72
~Slab()
Definition slab.hpp:79
mos::string_view name
Definition slab.hpp:59
as_linked_list
Definition slab.hpp:54
size_t nobjs
Definition slab.hpp:58
spinlock_t lock
Definition slab.hpp:55
ptr_t first_free
Definition slab.hpp:56
mos::string_view type_name
Definition slab.hpp:60
size_t ent_size
Definition slab.hpp:57
unsigned long ptr_t
Definition types.h:21