24#include "fastmm/core/msg_ring.hpp"
50 return static_cast<MsgRing*
>(c)->try_push(&m.hdr, m.hdr.len);
63 void* (*clone)(
const void* src);
65 std::optional<std::string> (*
validate)(
const void* p);
68 template <
class Params>
77 std::size_t instruments = 0)
78 : sink_(sink), schema_(&
schema), ops_(ops), per_instrument_(instruments != 0) {
79 const std::size_t n = instruments == 0 ? 1 : instruments;
81 for (std::size_t i = 0; i < n; ++i) blocks_.push_back(clone(current));
99 std::string_view source) {
100 const std::lock_guard<std::mutex> lock(mutex_);
101 if (closed_)
return 0;
103 std::vector<std::pair<std::size_t, Block>> next;
104 if (
auto err = build_locked(
values, inst, m, &next))
throw std::invalid_argument(*err);
105 m.publish_seq = seq_ + 1;
107 m.set_source(source);
109 if (!sink_.
push(sink_.
ctx, m)) {
114 for (
auto& [k, block] : next) blocks_[k] = std::move(block);
120 [[nodiscard]] std::optional<std::string>
build(
const std::vector<ParamValue>&
values,
123 const std::lock_guard<std::mutex> lock(mutex_);
124 return build_locked(
values, inst, out,
nullptr);
129 const std::lock_guard<std::mutex> lock(mutex_);
132 [[nodiscard]]
bool closed()
const {
133 const std::lock_guard<std::mutex> lock(mutex_);
137 [[nodiscard]] std::uint64_t
published()
const {
138 const std::lock_guard<std::mutex> lock(mutex_);
141 [[nodiscard]] std::uint64_t
refused()
const {
142 const std::lock_guard<std::mutex> lock(mutex_);
154 const std::lock_guard<std::mutex> lock(mutex_);
155 const std::size_t k =
156 per_instrument_ && inst.valid() && inst.value < blocks_.size() ? inst.value : 0;
157 std::vector<Value> out;
158 out.reserve(schema_->
size());
160 out.push_back({d.name, d.type, d.get_raw(blocks_[k].get()), d.format(blocks_[k].get())});
165 const std::lock_guard<std::mutex> lock(mutex_);
166 const std::size_t k =
167 per_instrument_ && inst.valid() && inst.value < blocks_.size() ? inst.value : 0;
168 return detail::describe_params(*schema_, blocks_[k].get());
173 static const BlockOps& block_ops() {
174 static constexpr BlockOps kOps{
175 [](
const void* src) ->
void* {
return new P(*
static_cast<const P*
>(src)); },
176 [](
void* p)
noexcept {
delete static_cast<P*
>(p); },
177 [](
const void* p) {
return detail::validate_params(*
static_cast<const P*
>(p)); }};
181 void (*destroy)(
void*)
noexcept;
182 void operator()(
void* p)
const noexcept { destroy(p); }
184 using Block = std::unique_ptr<void, Deleter>;
186 [[nodiscard]] Block clone(
const void* src)
const {
187 return Block(ops_.
clone(src), Deleter{ops_.destroy});
190 std::optional<std::string> build_locked(
const std::vector<ParamValue>&
values,
193 std::vector<std::pair<std::size_t, Block>>* next)
const {
194 const ParamSchema&
schema = *schema_;
197 " parameters per update, got " + std::to_string(
values.size());
199 std::size_t first = 0;
200 std::size_t last = blocks_.size();
202 if (!per_instrument_) {
204 "the strategy keeps one parameter set for all instruments; publish "
205 "without an instrument");
207 if (inst.value >= blocks_.size())
208 return "instrument " + std::to_string(inst.value) +
" is not in the instrument table";
212 out = ParamUpdateMsg{};
215 out.count =
static_cast<std::uint32_t
>(
values.size());
216 for (std::size_t k = first; k < last; ++k) {
217 Block copy = clone(blocks_[k].get());
218 for (std::size_t i = 0; i <
values.size(); ++i) {
219 const auto& [name, value] =
values[i];
221 if (d ==
nullptr)
return "unknown parameter '" + name +
"'";
222 for (std::size_t j = 0; j < i; ++j) {
223 if (
values[j].first == name)
return "parameter '" + name +
"' given twice";
225 if (
auto err = d->parse(copy.get(), value))
return "parameter '" + name +
"': " + *err;
226 out.field[i] =
static_cast<std::uint16_t
>(d -
schema.
begin());
227 out.value[i] = d->
get_raw(copy.get());
229 if (
auto err = ops_.
validate(copy.get())) {
230 if (per_instrument_)
return "instrument " + std::to_string(k) +
": " + *err;
233 if (next !=
nullptr) next->emplace_back(k, std::move(copy));
239 const ParamSchema* schema_;
241 bool per_instrument_;
242 std::vector<Block> blocks_;
243 mutable std::mutex mutex_;
244 std::uint64_t seq_ = 0;
245 std::uint64_t refused_ = 0;
246 bool closed_ =
false;
Definition param_publisher.hpp:57
bool closed() const
Definition param_publisher.hpp:134
std::string describe(InstrumentId inst=kAllInstruments) const
name=value pairs of the copy: one instrument's, or the shared set.
Definition param_publisher.hpp:166
bool publish(const std::vector< ParamValue > &values, InstrumentId inst=kAllInstruments)
Validates and sends one update.
Definition param_publisher.hpp:93
std::optional< std::string > build(const std::vector< ParamValue > &values, InstrumentId inst, ParamUpdateMsg &out) const
The update publish() would send, without sending it or changing the copy; the error message when it i...
Definition param_publisher.hpp:122
ParamPublisher(const ParamPublisher &)=delete
~ParamPublisher()=default
void close()
Later publishes return false (the session has stopped).
Definition param_publisher.hpp:130
std::uint64_t publish_as(const std::vector< ParamValue > &values, InstrumentId inst, ParamUpdateMsg::Origin origin, std::string_view source)
publish() with the update's origin and source (ParamUpdateMsg::source, cut to 39 bytes).
Definition param_publisher.hpp:98
ParamPublisher & operator=(const ParamPublisher &)=delete
std::vector< Value > values(InstrumentId inst=kAllInstruments) const
Definition param_publisher.hpp:155
const ParamSchema & schema() const
Definition param_publisher.hpp:147
std::uint64_t refused() const
Definition param_publisher.hpp:143
static constexpr InstrumentId kAllInstruments
Definition param_publisher.hpp:60
std::uint64_t published() const
Updates sent, and updates the sink refused.
Definition param_publisher.hpp:139
std::pair< std::string, std::string > ParamValue
name, value as ParamDesc::parse takes
Definition param_publisher.hpp:59
Definition params.hpp:102
const ParamDesc * begin() const noexcept
Definition params.hpp:112
std::size_t size() const noexcept
Definition params.hpp:111
const ParamDesc * find(std::string_view name) const noexcept
Definition params.hpp:105
Event bus message structs (5.5).
Definition strategy.hpp:16
@ ParamUpdate
new strategy parameter values (ParamUpdateMsg)
Timestamp wall_now() noexcept
CLOCK_REALTIME via vDSO (~20 ns). Implemented in src/core/time.cpp.
constexpr void init_header(M &m, EventType type, InstrumentId inst={}, VenueId venue={}, std::uint32_t len=static_cast< std::uint32_t >(sizeof(M))) noexcept
For fixed-size messages len defaults to sizeof(M); BookDeltaMsg passes size_for().
Definition messages.hpp:75
StrongId< struct InstrumentTag, std::uint32_t > InstrumentId
Dense index into the engine's instrument table.
Definition strong_id.hpp:38
ParamType
Definition params.hpp:55
Strategy parameter schema (8.6, ADR-0012).
Strongly typed identifiers.
std::int64_t(* get_raw)(const void *obj) noexcept
The field as the int64 a ParamUpdateMsg carries, and back (engine thread: no checks).
Definition params.hpp:96
Copying and freeing a parameter block whose layout is known only at run time (strategies/hot_params....
Definition param_publisher.hpp:64
std::optional< std::string >(* validate)(const void *p)
Definition param_publisher.hpp:67
void(* destroy)(void *p) noexcept
Definition param_publisher.hpp:66
void *(* clone)(const void *src)
Definition param_publisher.hpp:65
Every parameter of the copy, in schema order: one instrument's, or the shared set.
Definition param_publisher.hpp:149
ParamType type
Definition param_publisher.hpp:151
std::string name
Definition param_publisher.hpp:150
std::string text
ParamDesc::format.
Definition param_publisher.hpp:153
std::int64_t raw
ParamDesc::get_raw.
Definition param_publisher.hpp:152
Where a built update goes; push returns false when it was not accepted (full).
Definition param_publisher.hpp:45
static ParamSink to_ring(MsgRing &ring) noexcept
The SPSC ring an engine's RingFeed polls.
Definition param_publisher.hpp:50
bool(* push)(void *ctx, const ParamUpdateMsg &m) noexcept
Definition param_publisher.hpp:47
void * ctx
Definition param_publisher.hpp:46
New strategy parameter values (ADR-0013): up to kMaxFields (field index, raw value) pairs,...
Definition messages.hpp:574
Origin
Definition messages.hpp:579
@ Strategy
the strategy's own publisher (a slow tier, a model), or not recorded
static constexpr std::size_t kMaxFields
Definition messages.hpp:575
static constexpr InstrumentId kAllInstruments
hdr.instrument of an update for every instrument: the invalid id.
Definition messages.hpp:578