From 4ad9543a654a2b8d5c965aec2d099c025bfd510b Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 4 Feb 2026 10:07:32 -0500 Subject: [PATCH] LibCore: Add helpers to share arbitrary versions between processes This will allow sharing e.g. document cookie versions between the UI and WebContent processes, and safely accessing those versions. Core::AnonymousBuffer internally creates a minimum buffer of PAGE_SIZE bytes. This is much more than the size of a single version, but this affords us the opportunity to share multiple versions in a single buffer between processes. With a PAGE_SIZE of 4096, we can share up to 512 versions in a single buffer. --- Libraries/LibCore/CMakeLists.txt | 1 + Libraries/LibCore/SharedVersion.cpp | 49 +++++++++++++++++++++++++++++ Libraries/LibCore/SharedVersion.h | 26 +++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 Libraries/LibCore/SharedVersion.cpp create mode 100644 Libraries/LibCore/SharedVersion.h diff --git a/Libraries/LibCore/CMakeLists.txt b/Libraries/LibCore/CMakeLists.txt index e48bddb825..e027380c1c 100644 --- a/Libraries/LibCore/CMakeLists.txt +++ b/Libraries/LibCore/CMakeLists.txt @@ -53,6 +53,7 @@ set(SOURCES Resource.cpp ResourceImplementation.cpp ResourceImplementationFile.cpp + SharedVersion.cpp SystemServerTakeover.cpp ThreadEventQueue.cpp Timer.cpp diff --git a/Libraries/LibCore/SharedVersion.cpp b/Libraries/LibCore/SharedVersion.cpp new file mode 100644 index 0000000000..60852e2976 --- /dev/null +++ b/Libraries/LibCore/SharedVersion.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2026, Tim Flynn + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Core { + +static size_t SHARED_VERSION_BUFFER_SIZE = PAGE_SIZE; +static size_t SHARED_VERSION_BUFFER_COUNT = SHARED_VERSION_BUFFER_SIZE / sizeof(SharedVersion); + +AnonymousBuffer create_shared_version_buffer() +{ + return MUST(AnonymousBuffer::create_with_size(SHARED_VERSION_BUFFER_SIZE)); +} + +bool initialize_shared_version(AnonymousBuffer& shared_version_buffer, SharedVersionIndex shared_version_index) +{ + if (!shared_version_buffer.is_valid() || shared_version_index >= SHARED_VERSION_BUFFER_COUNT) + return false; + + auto* shared_versions = shared_version_buffer.data(); + shared_versions[shared_version_index] = INITIAL_SHARED_VERSION; + + return true; +} + +void increment_shared_version(AnonymousBuffer& shared_version_buffer, SharedVersionIndex shared_version_index) +{ + if (!shared_version_buffer.is_valid() || shared_version_index >= SHARED_VERSION_BUFFER_COUNT) + return; + + auto* shared_versions = shared_version_buffer.data(); + ++shared_versions[shared_version_index]; +} + +Optional get_shared_version(AnonymousBuffer const& shared_version_buffer, SharedVersionIndex shared_version_index) +{ + if (!shared_version_buffer.is_valid() || shared_version_index >= SHARED_VERSION_BUFFER_COUNT) + return {}; + + auto const* shared_versions = shared_version_buffer.data(); + return shared_versions[shared_version_index]; +} + +} diff --git a/Libraries/LibCore/SharedVersion.h b/Libraries/LibCore/SharedVersion.h new file mode 100644 index 0000000000..cf064435f7 --- /dev/null +++ b/Libraries/LibCore/SharedVersion.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2026, Tim Flynn + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Core { + +using SharedVersion = u64; +using SharedVersionIndex = u32; + +constexpr inline SharedVersion INVALID_SHARED_VERSION = 0; +constexpr inline SharedVersion INITIAL_SHARED_VERSION = 1; + +[[nodiscard]] AnonymousBuffer create_shared_version_buffer(); +[[nodiscard]] bool initialize_shared_version(AnonymousBuffer&, SharedVersionIndex); +void increment_shared_version(AnonymousBuffer&, SharedVersionIndex); +Optional get_shared_version(AnonymousBuffer const&, SharedVersionIndex); + +}