diff --git a/kernel/include/mem.h b/kernel/include/mem.h index 21bf409b01efa179f5cb73b5f0139bdd4a7b420c..9fccc85d518e72cdb2f5a8692218750f4615f945 100644 --- a/kernel/include/mem.h +++ b/kernel/include/mem.h @@ -139,9 +139,10 @@ public: init(backing_allocator); } - T *create() { + template<typename ...Ts> + T *create(Ts ...args) { auto ptr = reinterpret_cast<T*>(__alloc(0, 0).value()); - new (ptr) T(); + new (ptr) T(args...); return ptr; } @@ -203,17 +204,19 @@ void free(Slice<T> buf) general_allocator->free(buf); } -template <typename T> -Optional<T*> create() +template <typename T, typename ...Ts> +Optional<T*> create(Ts ...args) { auto ptr = alloc<T>(1); if (!ptr.has_value()) return nullptr; + new (ptr.value().data()) T(args...); return ptr.value().data(); } template <typename T> void destroy(T *ptr) { + ptr->~T(); free(Slice<T>(ptr, 1)); } diff --git a/libs/include/new.h b/libs/include/new.h index b8eacc63ee20d8b07e5d2a998d2c4de1d5ee202c..024723f0afb26777f3f1acd16cdf3c843dd938ec 100644 --- a/libs/include/new.h +++ b/libs/include/new.h @@ -5,4 +5,8 @@ inline void *operator new(size_t, void *p) { return p; } inline void *operator new[](size_t, void *p) { return p; } inline void operator delete (void *, void *) { }; -inline void operator delete[](void *, void *) { }; \ No newline at end of file +inline void operator delete[](void *, void *) { }; +extern void *operator new(size_t size); +extern void *operator new[](size_t size); +extern void operator delete(void *p, size_t s); +extern void operator delete[](void *p, size_t s); \ No newline at end of file diff --git a/libs/new.cpp b/libs/new.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f2f970fa0115f87f4d1ba10fd399ac95ab7fe21e --- /dev/null +++ b/libs/new.cpp @@ -0,0 +1,23 @@ +#include <mem.h> + +void *operator new(size_t size) +{ + auto ptr = alloc<byte>(size).value().data(); + return ptr; +} + +void *operator new[](size_t size) +{ + auto ptr = alloc<byte>(size).value().data(); + return ptr; +} + +void operator delete(void *p, size_t s) +{ + free(Slice<byte>((byte *)p, s)); +} + +void operator delete[](void *p, size_t s) +{ + free(Slice<byte>((byte *)p, s)); +} \ No newline at end of file