IceShard 1
A personal game engine project, with development focused on 2D/2.5D games.
Loading...
Searching...
No Matches
task_transaction.hxx
Go to the documentation of this file.
1
3
4#pragma once
7
8namespace ice
9{
10
16
18 {
19 std::atomic<ice::TaskTransaction*> current_transaction = nullptr;
20
21 inline auto start_transaction(ice::TaskTransaction& transaction) noexcept -> ice::TaskTransaction&
22 {
23 ice::TaskTransaction* ongoing_transaction = nullptr;
24 if (current_transaction.compare_exchange_strong(ongoing_transaction, &transaction, std::memory_order_relaxed))
25 {
26 return transaction;
27 }
28 return *ongoing_transaction;
29 }
30
31 inline void finish_transaction(ice::TaskTransaction& transaction) noexcept
32 {
33 if (current_transaction.load(std::memory_order_relaxed) == ice::addressof(transaction))
34 {
35 current_transaction.store(nullptr, std::memory_order_relaxed);
36 }
37 }
38 };
39
40} // namespace ice
SPDX-License-Identifier: MIT.
Definition array.hxx:12
Definition atomic_linked_queue.hxx:16
Definition task_transaction.hxx:12
std::atomic< ice::u32 > awaiters
Definition task_transaction.hxx:14
ice::AtomicLinkedQueue< ice::TaskAwaitableBase > queue
Definition task_transaction.hxx:13
Definition task_transaction.hxx:18
auto start_transaction(ice::TaskTransaction &transaction) noexcept -> ice::TaskTransaction &
Definition task_transaction.hxx:21
std::atomic< ice::TaskTransaction * > current_transaction
Definition task_transaction.hxx:19
void finish_transaction(ice::TaskTransaction &transaction) noexcept
Definition task_transaction.hxx:31