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.)
This commit is contained in:
Andreas Kling 2020-12-18 13:14:59 +01:00
parent 5d1425718e
commit 8cde8ba511
Notes: sideshowbarker 2024-07-19 00:45:21 +09:00

View File

@ -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));