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.
This commit is contained in:
Timothy Flynn
2026-02-04 10:07:32 -05:00
committed by Tim Flynn
parent f322e8a29c
commit 4ad9543a65
Notes: github-actions[bot] 2026-02-06 10:32:56 +00:00
3 changed files with 76 additions and 0 deletions

View File

@@ -53,6 +53,7 @@ set(SOURCES
Resource.cpp
ResourceImplementation.cpp
ResourceImplementationFile.cpp
SharedVersion.cpp
SystemServerTakeover.cpp
ThreadEventQueue.cpp
Timer.cpp

View File

@@ -0,0 +1,49 @@
/*
* Copyright (c) 2026, Tim Flynn <trflynn89@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <AK/Platform.h>
#include <LibCore/SharedVersion.h>
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<SharedVersion>();
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<SharedVersion>();
++shared_versions[shared_version_index];
}
Optional<SharedVersion> 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<SharedVersion>();
return shared_versions[shared_version_index];
}
}

View File

@@ -0,0 +1,26 @@
/*
* Copyright (c) 2026, Tim Flynn <trflynn89@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Optional.h>
#include <AK/Types.h>
#include <LibCore/AnonymousBuffer.h>
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<SharedVersion> get_shared_version(AnonymousBuffer const&, SharedVersionIndex);
}