summaryrefslogtreecommitdiff
path: root/Kernel/KBuffer.h
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-12-18 13:14:59 +0100
committerAndreas Kling <kling@serenityos.org>2020-12-18 19:22:26 +0100
commit8cde8ba511eaa0678b23cb7fdad25091bd219030 (patch)
treecf0051c7d7366123fb34d5721a54f19c30791ec0 /Kernel/KBuffer.h
parent5d1425718e65ba166098b65c2cbc01758fa8f43f (diff)
downloadserenity-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.h20
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));