diff options
author | Andreas Kling <kling@serenityos.org> | 2020-12-18 13:14:59 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-12-18 19:22:26 +0100 |
commit | 8cde8ba511eaa0678b23cb7fdad25091bd219030 (patch) | |
tree | cf0051c7d7366123fb34d5721a54f19c30791ec0 /Kernel/KBuffer.h | |
parent | 5d1425718e65ba166098b65c2cbc01758fa8f43f (diff) | |
download | serenity-8cde8ba511eaa0678b23cb7fdad25091bd219030.zip |
Kernel: Add KBuffer::try_create_with_size()
We need to stop assuming that KBuffer allocation always succeeds.
This patch adds the following API:
- static OwnPtr<KBuffer> KBuffer::create_with_size(size_t);
All KBuffer clients should move towards using this (and handling any
failures with grace.)
Diffstat (limited to 'Kernel/KBuffer.h')
-rw-r--r-- | Kernel/KBuffer.h | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/Kernel/KBuffer.h b/Kernel/KBuffer.h index b6369f1839..b57ca20581 100644 --- a/Kernel/KBuffer.h +++ b/Kernel/KBuffer.h @@ -48,13 +48,21 @@ namespace Kernel { class KBufferImpl : public RefCounted<KBufferImpl> { public: - static NonnullRefPtr<KBufferImpl> create_with_size(size_t size, u8 access, const char* name) + static RefPtr<KBufferImpl> try_create_with_size(size_t size, u8 access, const char* name) { auto region = MM.allocate_kernel_region(PAGE_ROUND_UP(size), name, access, false, false); - ASSERT(region); + if (!region) + return nullptr; return adopt(*new KBufferImpl(region.release_nonnull(), size)); } + static NonnullRefPtr<KBufferImpl> create_with_size(size_t size, u8 access, const char* name) + { + auto impl = try_create_with_size(size, access, name); + ASSERT(impl); + return impl.release_nonnull(); + } + static NonnullRefPtr<KBufferImpl> copy(const void* data, size_t size, u8 access, const char* name) { auto buffer = create_with_size(size, access, name); @@ -90,6 +98,14 @@ private: class KBuffer { public: + static OwnPtr<KBuffer> try_create_with_size(size_t size, u8 access = Region::Access::Read | Region::Access::Write, const char* name = "KBuffer") + { + auto impl = KBufferImpl::try_create_with_size(size, access, name); + if (!impl) + return nullptr; + return adopt_own(*new KBuffer(impl.release_nonnull())); + } + static KBuffer create_with_size(size_t size, u8 access = Region::Access::Read | Region::Access::Write, const char* name = "KBuffer") { return KBuffer(KBufferImpl::create_with_size(size, access, name)); |