SharedBuffer.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include <AK/kmalloc.h>
  2. #include <Kernel/Syscall.h>
  3. #include <SharedBuffer.h>
  4. #include <stdio.h>
  5. #include <unistd.h>
  6. RefPtr<SharedBuffer> SharedBuffer::create_with_size(int size)
  7. {
  8. void* data;
  9. int shared_buffer_id = create_shared_buffer(size, &data);
  10. if (shared_buffer_id < 0) {
  11. perror("create_shared_buffer");
  12. return nullptr;
  13. }
  14. return adopt(*new SharedBuffer(shared_buffer_id, size, data));
  15. }
  16. bool SharedBuffer::share_with(pid_t peer)
  17. {
  18. int ret = share_buffer_with(shared_buffer_id(), peer);
  19. if (ret < 0) {
  20. perror("share_buffer_with");
  21. return false;
  22. }
  23. return true;
  24. }
  25. bool SharedBuffer::share_globally()
  26. {
  27. int ret = share_buffer_globally(shared_buffer_id());
  28. if (ret < 0) {
  29. perror("share_buffer_globally");
  30. return false;
  31. }
  32. return true;
  33. }
  34. RefPtr<SharedBuffer> SharedBuffer::create_from_shared_buffer_id(int shared_buffer_id)
  35. {
  36. void* data = get_shared_buffer(shared_buffer_id);
  37. if (data == (void*)-1) {
  38. perror("get_shared_buffer");
  39. return nullptr;
  40. }
  41. int size = get_shared_buffer_size(shared_buffer_id);
  42. if (size < 0) {
  43. perror("get_shared_buffer_size");
  44. return nullptr;
  45. }
  46. return adopt(*new SharedBuffer(shared_buffer_id, size, data));
  47. }
  48. SharedBuffer::SharedBuffer(int shared_buffer_id, int size, void* data)
  49. : m_shared_buffer_id(shared_buffer_id)
  50. , m_size(size)
  51. , m_data(data)
  52. {
  53. }
  54. SharedBuffer::~SharedBuffer()
  55. {
  56. if (m_shared_buffer_id >= 0) {
  57. int rc = release_shared_buffer(m_shared_buffer_id);
  58. if (rc < 0) {
  59. perror("release_shared_buffer");
  60. }
  61. }
  62. }
  63. void SharedBuffer::seal()
  64. {
  65. int rc = seal_shared_buffer(m_shared_buffer_id);
  66. if (rc < 0) {
  67. perror("seal_shared_buffer");
  68. ASSERT_NOT_REACHED();
  69. }
  70. }
  71. void SharedBuffer::set_volatile()
  72. {
  73. u32 rc = syscall(SC_set_shared_buffer_volatile, m_shared_buffer_id, true);
  74. ASSERT(rc == 0);
  75. }
  76. bool SharedBuffer::set_nonvolatile()
  77. {
  78. u32 rc = syscall(SC_set_shared_buffer_volatile, m_shared_buffer_id, false);
  79. if (rc == 0)
  80. return true;
  81. if (rc == 1)
  82. return false;
  83. ASSERT_NOT_REACHED();
  84. }