Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
journal.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <cstddef>
6#include <optional>
7#include <span>
8#include <vector>
9
10namespace pulp::timeline {
11
15
16namespace detail {
17class JournalAccess;
18}
19
25 std::size_t max_transactions = 1024;
26 std::size_t max_commands = 8192;
27 std::size_t max_retained_bytes = 16 * 1024 * 1024;
28};
29
31enum class JournalEntryKind : std::uint8_t { Ordinary, History };
32
44
52
60 public:
61 virtual ~JournalSink() = default;
62
63 JournalSink(const JournalSink&) = delete;
65
76 append_batch(const JournalEntry& entry) noexcept = 0;
77
88 checkpoint(const Project& snapshot, DocumentRevision durable_revision) noexcept = 0;
89
101
102 protected:
103 JournalSink() = default;
104};
105
113 public:
115 explicit CommandJournal(JournalLimits limits) : limits_(limits) {}
116
124 DocumentRevision checkpoint_revision) const;
125
127 std::span<const JournalEntry> entries() const noexcept {
128 return entries_;
129 }
130
131 std::size_t retained_bytes() const noexcept {
132 return retained_bytes_;
133 }
134
135 std::size_t command_count() const noexcept {
136 return command_count_;
137 }
138
140 return base_revision_;
141 }
142
143 private:
144 struct WriterWatermark {
145 WriterId id;
146 std::uint64_t transaction = 0;
147 std::uint64_t command = 0;
148 };
150 runtime::Result<bool, TransactionError> preflight(const JournalEntry& entry) const;
151 std::optional<Project> prepare_append(const Project& before);
152 void append_prepared(JournalEntry entry, std::optional<Project> initial_snapshot) noexcept;
153 bool checkpoint(DocumentRevision durable_revision);
154
155 JournalLimits limits_;
156 std::vector<JournalEntry> entries_;
157 std::size_t retained_bytes_ = 0;
158 std::size_t command_count_ = 0;
159 DocumentRevision base_revision_{};
160 std::optional<Project> base_snapshot_;
161 std::vector<WriterWatermark> base_writers_;
162};
163
165std::size_t retained_size(const JournalEntry& entry) noexcept;
166
168
169} // namespace pulp::timeline
Wrap a value as a failure result.
Definition result.hpp:58
Result<T, E> — either holds a T or an E, never both.
Definition result.hpp:76
std::size_t command_count() const noexcept
Returns the total number of command envelopes in retained entries.
Definition journal.hpp:135
std::size_t retained_bytes() const noexcept
Returns the saturated retained-size accounting for entries.
Definition journal.hpp:131
std::span< const JournalEntry > entries() const noexcept
Returns the retained suffix in revision order.
Definition journal.hpp:127
DocumentRevision base_revision() const noexcept
Returns the revision of the checkpoint preceding entries().
Definition journal.hpp:139
friend class detail::JournalAccess
Definition journal.hpp:149
runtime::Result< Project, TransactionError > replay(const Project &checkpoint, DocumentRevision checkpoint_revision) const
Deterministically applies all entries after the supplied checkpoint.
CommandJournal(JournalLimits limits)
Creates an empty revision-zero journal with fixed quotas.
Definition journal.hpp:115
Owned canonical collection of incremental invalidations.
Definition transaction.hpp:74
JournalSink & operator=(const JournalSink &)=delete
JournalSink(const JournalSink &)=delete
virtual runtime::Result< bool, JournalSinkError > append_batch(const JournalEntry &entry) noexcept=0
Makes a complete transaction entry durable as one batch.
virtual ~JournalSink()=default
virtual runtime::Result< bool, JournalSinkError > checkpoint(const Project &snapshot, DocumentRevision durable_revision) noexcept=0
Installs a checkpoint before entries through its revision are discarded.
virtual runtime::Result< bool, JournalSinkError > validate_restore(const Project &, DocumentRevision) noexcept
Validates attachment to an already-durable snapshot and revision.
Definition journal.hpp:96
Immutable root of a Timeline document and its monotonic identity domain.
Definition model.hpp:1079
std::size_t retained_size(const Command &command) noexcept
Returns the retained heap-byte estimate used for command/journal limits.
JournalEntryKind
Distinguishes user submissions from generated undo/redo transactions.
Definition journal.hpp:31
JournalSinkError
Failure category returned by a durable JournalSink.
Definition journal.hpp:46
@ History
Definition journal.hpp:31
@ Ordinary
Definition journal.hpp:31
@ DurabilityUncertain
Definition file_journal.hpp:29
@ IoError
Definition file_journal.hpp:20
@ Closed
Definition journal.hpp:47
@ InvalidState
Definition journal.hpp:49
Definition clip_launch.hpp:30
Definition program_compiler.hpp:18
Monotonic document snapshot revision used for optimistic admission.
Definition command.hpp:54
One contiguous revision transition retained by the command journal.
Definition journal.hpp:37
DocumentRevision before
Definition journal.hpp:38
Transaction transaction
Definition journal.hpp:40
DocumentRevision after
Definition journal.hpp:39
DirtySet dirty
Definition journal.hpp:41
JournalEntryKind kind
Definition journal.hpp:42
In-memory command-journal quotas.
Definition journal.hpp:24
std::size_t max_retained_bytes
Definition journal.hpp:27
std::size_t max_transactions
Definition journal.hpp:25
std::size_t max_commands
Definition journal.hpp:26
Atomically admitted ordered command batch.
Definition command.hpp:824
Stable non-zero identity of a document writer.
Definition command.hpp:22