diff --git a/Libraries/LibCore/CMakeLists.txt b/Libraries/LibCore/CMakeLists.txt index e48bddb8251..e027380c1c6 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 00000000000..60852e29763 --- /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 00000000000..cf064435f74 --- /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); + +}