mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-25 17:25:08 +02:00
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:
Notes:
github-actions[bot]
2026-02-06 10:32:56 +00:00
Author: https://github.com/trflynn89 Commit: https://github.com/LadybirdBrowser/ladybird/commit/4ad9543a654 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/7717 Reviewed-by: https://github.com/gmta
@@ -53,6 +53,7 @@ set(SOURCES
|
||||
Resource.cpp
|
||||
ResourceImplementation.cpp
|
||||
ResourceImplementationFile.cpp
|
||||
SharedVersion.cpp
|
||||
SystemServerTakeover.cpp
|
||||
ThreadEventQueue.cpp
|
||||
Timer.cpp
|
||||
|
||||
49
Libraries/LibCore/SharedVersion.cpp
Normal file
49
Libraries/LibCore/SharedVersion.cpp
Normal 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];
|
||||
}
|
||||
|
||||
}
|
||||
26
Libraries/LibCore/SharedVersion.h
Normal file
26
Libraries/LibCore/SharedVersion.h
Normal 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);
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user