|
|
- #pragma once
-
- #include "gp/utils/allocators/allocator.hpp"
- #include "gp/ipc/bottleneck.hpp"
-
- namespace gp {
- /**
- * @brief A front to make allocators thread safe
- */
- class bottleneck_allocator_front : public allocator {
- allocator& backend;
- fast_bottleneck lock;
- public:
- bottleneck_allocator_front(allocator& _backend)
- : backend(_backend)
- , lock()
- {}
-
- /**
- * @brief Allocates memory, THREAD SAFE
- *
- * @param sz the amount of bytes to allocate
- *
- * @return the allocated memory as a pointer on success
- * @return nullptr if it failed allocating
- */
- virtual void* allocate(size_t sz) {
- auto guard = lock_guard(lock);
- return backend.allocate(sz);
- }
-
- /**
- * @brief Deallocates memory, THREAD SAFE
- *
- * @param ptr the memory to deallocate
- *
- * @return true if the memory was successfully deallocated
- * @return false if the memory was not deallocated
- */
- virtual bool deallocate(void* ptr) {
- auto guard = lock_guard(lock);
- return backend.deallocate(ptr);
- }
-
- /**
- * @brief Tries to reallocate memory, THREAD SAFE
- *
- * @param ptr The memory to reallocate
- * @param sz The new size we want to give the memory
- *
- * @return true if reallocation was successful
- * @return false if the reallocation failed
- */
- virtual bool try_reallocate(void* ptr, size_t sz) {
- auto guard = lock_guard(lock);
- return backend.try_reallocate(ptr, sz);
- }
-
- virtual ~bottleneck_allocator_front() = default;
- };
- }
|