From 8ce7df73fba22d7a78143643b64443f0a8a5d4ab Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Sun, 27 Dec 2020 19:09:59 -0700 Subject: [PATCH] AK: Enable AK::SharedBuffer for all platforms A future patch could do some MacOS specific things for set_volatile/set_nonvolatile. For now, swap out the defined(__linux__) branches for simple not __serenity__ branches. --- AK/SharedBuffer.cpp | 61 +++++++++++++++++++++------------------------ AK/SharedBuffer.h | 8 ++---- 2 files changed, 30 insertions(+), 39 deletions(-) diff --git a/AK/SharedBuffer.cpp b/AK/SharedBuffer.cpp index 9947a2710a..5f784a2466 100644 --- a/AK/SharedBuffer.cpp +++ b/AK/SharedBuffer.cpp @@ -24,39 +24,36 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#if defined(__serenity__) || defined(__linux__) +#include +#include -# include -# include +#if defined(__serenity__) # include -# include - -# if defined(__serenity__) -# include -# elif defined(__linux__) -# include -# include -# include +# include +#else +# include +# include +# include static String shbuf_shm_name(int shbuf_id) { return String::formatted("/serenity-shm:{}", shbuf_id); } -# endif +#endif namespace AK { RefPtr SharedBuffer::create_with_size(int size) { -# if defined(__serenity__) +#if defined(__serenity__) void* data; int shbuf_id = shbuf_create(size, &data); if (shbuf_id < 0) { perror("shbuf_create"); return nullptr; } -# elif defined(__linux__) +#else // Not atomic, so don't create shared buffers from many threads too hard under lagom. static unsigned g_shm_id = 0; @@ -85,42 +82,42 @@ RefPtr SharedBuffer::create_with_size(int size) perror("close"); return nullptr; } -# endif +#endif return adopt(*new SharedBuffer(shbuf_id, size, data)); } bool SharedBuffer::share_with([[maybe_unused]] pid_t peer) { -# if defined(__serenity__) +#if defined(__serenity__) int ret = shbuf_allow_pid(shbuf_id(), peer); if (ret < 0) { perror("shbuf_allow_pid"); return false; } -# endif +#endif return true; } bool SharedBuffer::share_globally() { -# if defined(__serenity__) +#if defined(__serenity__) int ret = shbuf_allow_all(shbuf_id()); if (ret < 0) { perror("shbuf_allow_all"); return false; } -# endif +#endif return true; } RefPtr SharedBuffer::create_from_shbuf_id(int shbuf_id) { -# if defined(__serenity__) +#if defined(__serenity__) size_t size = 0; void* data = shbuf_get(shbuf_id, &size); if (data == (void*)-1) return nullptr; -# elif defined(__linux__) +#else int fd = shm_open(shbuf_shm_name(shbuf_id).characters(), O_RDWR, S_IRUSR | S_IWUSR); if (fd < 0) { perror("shm_open"); @@ -151,7 +148,7 @@ RefPtr SharedBuffer::create_from_shbuf_id(int shbuf_id) perror("close"); return nullptr; } -# endif +#endif return adopt(*new SharedBuffer(shbuf_id, size, data)); } @@ -166,50 +163,48 @@ SharedBuffer::SharedBuffer(int shbuf_id, int size, void* data) SharedBuffer::~SharedBuffer() { if (m_shbuf_id >= 0) { -# if defined(__serenity__) +#if defined(__serenity__) int rc = shbuf_release(m_shbuf_id); if (rc < 0) { perror("shbuf_release"); } -# elif defined(__linux__) +#else if (munmap(reinterpret_cast(m_data) - sizeof(size_t), m_size + sizeof(size_t)) < 0) perror("munmap"); if (shm_unlink(shbuf_shm_name(m_shbuf_id).characters()) < 0) perror("unlink"); -# endif +#endif } } void SharedBuffer::seal() { -# if defined(__serenity__) +#if defined(__serenity__) int rc = shbuf_seal(m_shbuf_id); if (rc < 0) { perror("shbuf_seal"); ASSERT_NOT_REACHED(); } -# endif +#endif } void SharedBuffer::set_volatile() { -# if defined(__serenity__) +#if defined(__serenity__) u32 rc = syscall(SC_shbuf_set_volatile, m_shbuf_id, true); ASSERT(rc == 0); -# endif +#endif } bool SharedBuffer::set_nonvolatile() { -# if defined(__serenity__) +#if defined(__serenity__) u32 rc = syscall(SC_shbuf_set_volatile, m_shbuf_id, false); if (rc == 0) return true; ASSERT(rc == 1); -# endif +#endif return false; } } - -#endif diff --git a/AK/SharedBuffer.h b/AK/SharedBuffer.h index 06e413eeae..56e025046d 100644 --- a/AK/SharedBuffer.h +++ b/AK/SharedBuffer.h @@ -26,10 +26,8 @@ #pragma once -#if defined(__serenity__) || defined(__linux__) - -# include -# include +#include +#include namespace AK { @@ -73,5 +71,3 @@ private: } using AK::SharedBuffer; - -#endif