AnonymousBuffer.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /*
  2. * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Try.h>
  7. #include <LibCore/AnonymousBuffer.h>
  8. #include <LibCore/System.h>
  9. #include <LibIPC/File.h>
  10. #include <fcntl.h>
  11. #include <sys/mman.h>
  12. namespace Core {
  13. ErrorOr<AnonymousBuffer> AnonymousBuffer::create_with_size(size_t size)
  14. {
  15. auto fd = TRY(Core::System::anon_create(size, O_CLOEXEC));
  16. return create_from_anon_fd(fd, size);
  17. }
  18. ErrorOr<NonnullRefPtr<AnonymousBufferImpl>> AnonymousBufferImpl::create(int fd, size_t size)
  19. {
  20. auto* data = mmap(nullptr, round_up_to_power_of_two(size, PAGE_SIZE), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  21. if (data == MAP_FAILED)
  22. return Error::from_errno(errno);
  23. return AK::adopt_nonnull_ref_or_enomem(new (nothrow) AnonymousBufferImpl(fd, size, data));
  24. }
  25. AnonymousBufferImpl::~AnonymousBufferImpl()
  26. {
  27. if (m_fd != -1) {
  28. auto rc = close(m_fd);
  29. VERIFY(rc == 0);
  30. }
  31. auto rc = munmap(m_data, round_up_to_power_of_two(m_size, PAGE_SIZE));
  32. VERIFY(rc == 0);
  33. }
  34. ErrorOr<AnonymousBuffer> AnonymousBuffer::create_from_anon_fd(int fd, size_t size)
  35. {
  36. auto impl = TRY(AnonymousBufferImpl::create(fd, size));
  37. return AnonymousBuffer(move(impl));
  38. }
  39. AnonymousBuffer::AnonymousBuffer(NonnullRefPtr<AnonymousBufferImpl> impl)
  40. : m_impl(move(impl))
  41. {
  42. }
  43. AnonymousBufferImpl::AnonymousBufferImpl(int fd, size_t size, void* data)
  44. : m_fd(fd)
  45. , m_size(size)
  46. , m_data(data)
  47. {
  48. }
  49. }