diff options
Diffstat (limited to 'pw_allocator/public/pw_allocator/fallback_allocator.h')
-rw-r--r-- | pw_allocator/public/pw_allocator/fallback_allocator.h | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/pw_allocator/public/pw_allocator/fallback_allocator.h b/pw_allocator/public/pw_allocator/fallback_allocator.h new file mode 100644 index 000000000..5707c1aee --- /dev/null +++ b/pw_allocator/public/pw_allocator/fallback_allocator.h @@ -0,0 +1,51 @@ +// Copyright 2023 The Pigweed Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations under +// the License. +#pragma once + +#include "pw_allocator/allocator.h" +#include "pw_status/status.h" + +namespace pw::allocator { + +/// This class simply dispatches between a primary and secondary allocator. Any +/// attempt to allocate memory will first be handled by the primary allocator. +/// If it cannot allocate memory, e.g. because it is out of memory, the +/// secondary alloator will try to allocate memory instead. +class FallbackAllocator : public Allocator { + public: + constexpr FallbackAllocator() = default; + + /// Sets the primary and secondary allocators. + /// + /// It is an error to call any method without calling this method first. + void Initialize(Allocator& primary, Allocator& secondary); + + private: + /// @copydoc Allocator::Query + Status DoQuery(const void* ptr, Layout layout) const override; + + /// @copydoc Allocator::Allocate + void* DoAllocate(Layout layout) override; + + /// @copydoc Allocator::Deallocate + void DoDeallocate(void* ptr, Layout layout) override; + + /// @copydoc Allocator::Resize + bool DoResize(void* ptr, Layout layout, size_t new_size) override; + + Allocator* primary_ = nullptr; + Allocator* secondary_ = nullptr; +}; + +} // namespace pw::allocator |