92 template<
typename Proto,
typename ClientOrServer, usize message_index>
101 template<
typename Proto,
typename ClientOrServer, usize message_index>
120 template<
typename Proto,
typename Read,
typename Write,
typename Alloc>
126 [[no_unique_address]] Read
read;
137 template<
typename Proto,
typename Read,
typename Write,
typename Alloc>
140 template<
typename Proto,
typename ClientOrServer>
147 template<
typename Rec>
177 template<
typename Rec>
191 template<concepts::ReceiverOf<CompletionSignatures> Rec>
203 template<
typename Proto,
typename ClientOrServer>
206 template<
typename Proto,
typename Read,
typename Write,
typename Alloc,
typename ClientOrServer>
212 auto header = util::bit_cast<MessageHeader>(buffer);
213 auto const total_size =
u32(header.message_size);
215 return data->receive_buffer.reserve(total_size);
219 header.message_size.value() -
220 sizeof(MessageHeader) }) |
223 header,
Span {
data->receive_buffer.data(),
224 header.message_size.value() });
233 template<
typename Proto,
typename Read,
typename Write,
typename Alloc,
typename ClientOrServer>
236 template<
typename Proto,
typename Read,
typename Write,
typename Alloc,
typename ClientOrServer,
237 usize message_index_,
typename Rec>
253 [
this](
Error error) {
254 set_error(di::move(m_receiver), di::move(error));
262 , m_receiver(di::move(receiver)) {}
267 auto*
data = self.m_data;
268 data->reply_waiters.push_back(self);
276 template<
typename Proto,
typename Read,
typename Write,
typename Alloc,
typename ClientOrServer,
277 usize message_index,
typename Rec>
281 template<
typename Proto,
typename Read,
typename Write,
typename Alloc,
typename ClientOrServer,
292 template<concepts::ReceiverOf<CompletionSignatures> Rec>
308 template<
typename Proto,
typename Read,
typename Write,
typename Alloc,
typename ClientOrServer,
313 template<
typename Proto,
typename Read,
typename Write,
typename Alloc,
typename ClientOrServer>
323 template<concepts::Serializable<Serializer> T,
typename U = meta::Decay<T>,
324 typename MessageList = meta::MessageTypes<Type>>
327 constexpr usize message_index = meta::Lookup<U, MessageList>;
329 "There can be at most 2^32 messages in a protocol.");
335 auto send_buffer = di::move(data->send_buffer);
338 auto total_size = sizeof(MessageHeader) + serialize_size(binary_format, message);
339 if constexpr (concepts::FallibleAllocator<Alloc>) {
340 DI_TRY(send_buffer.reserve(total_size));
342 send_buffer.reserve(total_size);
346 auto message_number =
347 maybe_message_number.has_value() ? *maybe_message_number :
data->message_number++;
349 .message_type = static_cast<u32>(message_index),
350 .message_number = message_number,
351 .message_size = total_size,
356 data->send_buffer = di::move(writer).vector();
357 return message_number;
364 message_index>(
data, message_number);
376 template<
typename Proto,
typename Read,
typename Write,
typename Alloc,
typename ClientOrServer>
379 template<
typename Proto,
typename Read,
typename Write,
typename TxFun,
typename RxFun,
typename Alloc,
380 typename ClientOrServer>
390 for (
auto& waiter :
data->reply_waiters) {
392 waiter.callback(
static_cast<void*
>(di::addressof(message)));
393 data->reply_waiters.erase(waiter);
403 template<
typename Proto,
typename Read,
typename Write,
typename TxFun,
typename RxFun,
typename Alloc,
404 typename ClientOrServer>
408 template<
typename Proto,
typename Read,
typename Write,
typename TxFun,
typename RxFun,
typename Alloc,
409 typename ClientOrServer>
420 &message]<
typename Env>(Env&)
mutable {
421 auto call_function = [&] {
425 return di::invoke(rx_function, di::move(message));
428 "Receiving function must accept all message types.");
432 auto sender_function = [&] {
433 using R =
decltype(call_function());
439 return just(call_function());
442 return call_function();
446 using Send =
decltype(sender_function());
448 "Receiving function must return a single sender.");
453 return sender_function();
456 di::SameAs<meta::MessageReply<T>, Value>,
457 "Receiving function return a sender which sends the correct reply.");
458 return sender_function() |
let_value([
data, &header](Value& reply) {
463 return sender_function() |
let_value([
data](Value& message) {
468 "Receiving function must return a sender which sends void or a "
469 "valid message type.");
481 template<
typename Env>
490 template<
typename Proto,
typename Read,
typename Write,
typename TxFun,
typename RxFun,
typename Alloc,
491 typename ClientOrServer>
495 template<
typename Proto,
typename Read,
typename Write,
typename TxFun,
typename RxFun,
typename Alloc,
496 typename ClientOrServer,
typename Rec>
509 explicit Type(Read
read, Write
write, TxFun&& tx_function, RxFun&& rx_function, Alloc allocator,
513 di::addressof(m_data),
di::forward<TxFun>(tx_function),
514 di::forward<RxFun>(rx_function),
get_env(receiver)),
515 di::move(receiver))) {}
525 template<
typename Proto,
typename Read,
typename Write,
typename TxFun,
typename RxFun,
typename Alloc,
526 typename ClientOrServer,
typename Rec>
529 template<
typename Proto,
typename Read,
typename Write,
typename TxFun,
typename RxFun,
typename Alloc,
530 typename ClientOrServer>
535 explicit Type(Read read_, Write write_, TxFun tx_function_, RxFun rx_function_, Alloc allocator_)
542 template<
typename Env>
548 template<
typename Env>
553 template<
typename Rec>
557 di::move(self.read), di::move(self.write), di::move(self.tx_function), di::move(self.rx_function),
558 di::move(self.allocator), di::move(receiver));
565 [[no_unique_address]] Read
read;
573 template<
typename Proto,
typename Read,
typename Write,
typename TxFun,
typename RxFun,
typename Alloc,
574 typename ClientOrServer>
577 template<
typename Proto,
typename Read,
typename Write,
typename TxFun,
typename RxFun,
typename Alloc>
581 template<
typename Proto,
typename Read,
typename Write,
typename TxFun,
typename RxFun,
typename Alloc>
597 template<concepts::InstanceOf<Protocol> Proto>
599 template<
typename... Args>
601 auto operator()(Args&&... args)
const {
604 using Named =
decltype(named);
609 "ipc connect functions require either a receiver-transmitter or a receiver and a transmitter.");
639 template<concepts::InstanceOf<Protocol> Proto>
641 template<
typename... Args>
643 auto operator()(Args&&... args)
const {
646 using Named =
decltype(named);
651 "ipc connect functions require either a receiver-transmitter or a receiver and a transmitter.");
682template<concepts::InstanceOf<Protocol> Proto>
685template<concepts::InstanceOf<Protocol> Proto>
Definition little_endian.h:25
Definition list_forward_declaration.h:12
Definition vector_forward_declaration.h:8
Definition function.h:365
Definition vector_reader.h:26
Definition vector_writer.h:19
A serializer for a simple binary format.
Definition binary_serializer.h:41
Definition in_place_stop_source.h:11
A helper class for simulation named arguments in c++.
Definition named_arguments.h:76
Definition optional_forward_declaration.h:5
Definition span_forward_declaration.h:10
Definition variant_forward_declaration.h:6
#define DI_IMMOVABLE_NO_UNIQUE_ADDRESS
Definition compiler.h:15
This concept is used with static_assert() to cause the static assert to fail only when the template h...
Definition core.h:98
A concept to check if a named argument is present.
Definition named_arguments.h:242
Definition ipc_protocol.h:21
Definition receiver_of.h:25
Definition ipc_protocol.h:93
Definition single_sender.h:8
A concept to check if a list of named arguments is valid.
Definition named_arguments.h:261
#define DI_TRY(...)
Definition monad_try.h:13
Definition ipc_binary.h:80
constexpr auto message_sequence
Definition ipc_binary.h:234
meta::Type< MessageAtIndexHelper< Proto, ClientOrServer, message_index > > MessageAtIndex
Definition ipc_binary.h:102
meta::Conditional< is_client< T >, Server, Client > Peer
Definition ipc_binary.h:90
Sender< Proto, meta::RemoveCVRef< Read >, meta::RemoveCVRef< Write >, meta::Decay< TxFun >, meta::Decay< RxFun >, meta::Decay< Alloc >, Server > ServerSender
Definition ipc_binary.h:582
constexpr auto make_joined_sender
Definition ipc_binary.h:492
meta::Type< WaitForReplySenderT< Proto, Read, Write, Alloc, ClientOrServer, message_index > > WaitForReplySender
Definition ipc_binary.h:310
constexpr auto default_receive
Definition ipc_binary.h:595
constexpr auto message_decode
Definition ipc_binary.h:204
meta::Type< ConnectionDataT< Proto, Read, Write, Alloc > > ConnectionData
Definition ipc_binary.h:138
meta::Type< SenderT< Proto, Read, Write, TxFun, RxFun, Alloc, ClientOrServer > > Sender
Definition ipc_binary.h:575
constexpr auto default_transmit
Definition ipc_binary.h:589
constexpr auto filter_messages
Definition ipc_binary.h:405
meta::Type< OperationStateT< Proto, Read, Write, TxFun, RxFun, Alloc, ClientOrServer, Rec > > OperationState
Definition ipc_binary.h:527
meta::Type< ConnectionTokenT< Proto, Read, Write, Alloc, ClientOrServer > > ConnectionToken
Definition ipc_binary.h:377
Sender< Proto, meta::RemoveCVRef< Read >, meta::RemoveCVRef< Write >, meta::Decay< TxFun >, meta::Decay< RxFun >, meta::Decay< Alloc >, Client > ClientSender
Definition ipc_binary.h:578
meta::Type< WaitForReplyOperationT< Proto, Read, Write, Alloc, ClientOrServer, message_index, Rec > > WaitForReplyOperation
Definition ipc_binary.h:278
meta::List< InPlaceTemplate< Receiver >, InPlaceTemplate< Transmitter >, InPlaceTemplate< ReceiverTransmitter >, InPlaceTemplate< Transmit >, InPlaceTemplate< Receive >, InPlaceTemplate< Allocator > > BaseNamedArguments
Definition ipc_protocol.h:149
constexpr auto async_write_exactly
Definition async_write_exactly.h:46
constexpr auto read
Definition read.h:68
constexpr auto set_error
Definition set_error.h:14
constexpr auto ignore_all
Adapt a sequence sender to a regular sender of void, ignoring the sequence's values.
Definition ignore_all.h:334
constexpr auto let_value_with
Inject values into an operation state.
Definition let_value_with.h:118
constexpr auto ipc_binary_connect_to_client
Definition ipc_binary.h:683
constexpr auto repeat
Transform a copyable sender into an infinite sequence sender.
Definition repeat.h:150
constexpr auto let_value
Definition let.h:208
constexpr auto start
Definition start.h:20
constexpr auto ipc_binary_connect_to_server
Definition ipc_binary.h:686
constexpr auto make_env
Create an environment with overrides for queries.
Definition make_env.h:147
constexpr auto when_all
Definition when_all.h:390
constexpr auto filter
Filter the values of a sequence.
Definition filter.h:469
constexpr auto with_env
Adapts a sender to run with a specified environment.
Definition with_env.h:107
constexpr auto set_stopped
Definition set_stopped.h:14
constexpr auto let_error
Definition let.h:209
constexpr auto with
Specify an override for an environment query.
Definition make_env.h:112
constexpr auto let_value_each
Transform the values of a sequence into new senders.
Definition let_each.h:59
constexpr auto get_stop_token
Definition get_stop_token.h:25
constexpr auto just_from
Creates a sender from a function.
Definition just_from.h:34
constexpr auto get_env
Definition get_env.h:27
constexpr auto get_allocator
Definition get_allocator.h:27
constexpr auto connect
Definition connect.h:42
constexpr auto set_value
Definition set_value.h:14
constexpr auto async_read_exactly
Definition async_read_exactly.h:46
constexpr auto send
Definition ipc_protocol.h:108
constexpr auto just
Definition just.h:86
constexpr auto index_dispatch
Definition index_dispatch.h:41
constexpr auto representable_as
Definition representable_as.h:19
std::byte byte
Definition byte.h:64
size_t usize
Definition integers.h:33
__UINT32_TYPE__ u32
Definition integers.h:11
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Expected< T, Error > Result
Definition result.h:8
StatusCode< Erased< long > > Error
Definition error.h:8
Definition zstring_parser.h:9
constexpr auto make_deferred
Creates a deferred function object.
Definition make_deferred.h:75
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
constexpr auto write_exactly
Definition write_exactly.h:51
constexpr auto invoke
Definition invoke.h:100
constexpr auto get_named_argument
A helper function to access a named argument.
Definition named_arguments.h:126
constexpr auto serialize_binary
Definition binary_serializer.h:145
constexpr auto visit(Vis &&visitor, Vars &&... variants) -> R
Definition visit.h:39
constexpr auto as_bytes
Definition as_bytes.h:16
constexpr auto get_named_argument_or
A helper function to access a named argument or a fallback value.
Definition named_arguments.h:179
constexpr auto data
Definition data.h:51
constexpr auto deserialize_binary
Definition binary_deserializer.h:151
constexpr auto overload
Definition overload.h:28
constexpr auto empty_env
Definition empty_env.h:6
Defines the sequence sender concepts and related CPOs.
Definition set_stopped.h:6
Definition ipc_binary.h:81
void is_client
Definition ipc_binary.h:82
Definition ipc_binary.h:598
Definition ipc_binary.h:640
sync::InPlaceStopSource stop_source
Definition ipc_binary.h:132
Vector< byte, Alloc > receive_buffer
Definition ipc_binary.h:131
Alloc allocator
Definition ipc_binary.h:128
Read read
Definition ipc_binary.h:126
Write write
Definition ipc_binary.h:127
IntrusiveList< ReplyWaiterBase > reply_waiters
Definition ipc_binary.h:129
u32 message_number
Definition ipc_binary.h:133
Vector< byte, Alloc > send_buffer
Definition ipc_binary.h:130
Type(Read &&read, Write &&write, Alloc &&allocator)
Definition ipc_binary.h:123
Definition ipc_binary.h:121
ConnectionData< Proto, Read, Write, Alloc > * data
Definition ipc_binary.h:372
BinarySerializer< VectorWriter< Vector< byte, Alloc > > > Serializer
Definition ipc_binary.h:316
Proto Protocol
Definition ipc_binary.h:317
Type(ConnectionData< Proto, Read, Write, Alloc > *data_)
Definition ipc_binary.h:319
friend auto tag_invoke(Tag< send >, Type self, T &&message, Optional< u32 > maybe_message_number={})
Definition ipc_binary.h:326
friend auto tag_invoke(Tag< request_stop >, Type &self)
Definition ipc_binary.h:321
Definition ipc_binary.h:314
Definition ipc_binary.h:591
constexpr void operator()(auto &&...) const
Definition ipc_binary.h:592
Definition ipc_binary.h:585
auto operator()(auto) const
Definition ipc_binary.h:586
Definition ipc_binary.h:381
auto operator()(concepts::Sender auto messages, Data *data) const
Definition ipc_binary.h:385
Proto Protocol
Definition ipc_binary.h:383
ConnectionData< Proto, Read, Write, Alloc > Data
Definition ipc_binary.h:382
Definition ipc_binary.h:410
ConnectionToken< Proto, Read, Write, Alloc, ClientOrServer > Token
Definition ipc_binary.h:412
auto operator()(Data *data, TxFun &&tx_function, RxFun &&rx_function, Env &&env) const
Definition ipc_binary.h:482
static auto make_rx_sequence(Data *data, RxFun &&rx_function)
Definition ipc_binary.h:414
ConnectionData< Proto, Read, Write, Alloc > Data
Definition ipc_binary.h:411
static auto make_rx_sender(Data *data, RxFun &&rx_function)
Definition ipc_binary.h:475
Definition ipc_binary.h:93
meta::MessageTypes< MessageAtIndexHelper > Messages
Definition ipc_binary.h:96
Proto Protocol
Definition ipc_binary.h:94
meta::At< Messages, message_index > Type
Definition ipc_binary.h:98
Rec receiver
Definition ipc_binary.h:153
Span< byte const > buffer
Definition ipc_binary.h:155
friend void tag_invoke(Tag< start >, Type &self)
Definition ipc_binary.h:157
MessageHeader header
Definition ipc_binary.h:154
Type(Rec receiver_, MessageHeader header_, Span< byte const > buffer_)
Definition ipc_binary.h:150
Definition ipc_binary.h:148
Proto Protocol
Definition ipc_binary.h:145
Span< byte const > buffer
Definition ipc_binary.h:197
MessageHeader header
Definition ipc_binary.h:196
friend auto tag_invoke(Tag< connect >, Sender self, Rec receiver)
Definition ipc_binary.h:192
void is_sender
Definition ipc_binary.h:143
meta::AsTemplate< types::CompletionSignatures, meta::PushBack< meta::Transform< meta::MessageTypes< Sender >, meta::Chain< meta::Quote< meta::List >, meta::BindBack< meta::Quote< meta::PushFront >, MessageHeader >, meta::BindFront< meta::Quote< meta::AsLanguageFunction >, SetValue > > >, SetError(Error)> > CompletionSignatures
Definition ipc_binary.h:180
Sender(MessageHeader header_, Span< byte const > buffer_)
Definition ipc_binary.h:189
meta::Type< OperationStateT< Rec > > OperationState
Definition ipc_binary.h:178
Definition ipc_binary.h:141
auto operator()(MessageHeader header, Span< byte const > buffer) const
Definition ipc_binary.h:200
Definition ipc_binary.h:207
auto operator()(ConnectionData< Proto, Read, Write, Alloc > *data) const
Definition ipc_binary.h:208
meta::ConnectResult< InnerSender, Rec > InnerOp
Definition ipc_binary.h:507
friend void tag_invoke(Tag< start >, Type &self)
Definition ipc_binary.h:518
ConnectionToken< Proto, Read, Write, Alloc, ClientOrServer > ItemToken
Definition ipc_binary.h:500
Type(Read read, Write write, TxFun &&tx_function, RxFun &&rx_function, Alloc allocator, Rec receiver)
Definition ipc_binary.h:509
meta::InvokeResult< TxFun, ItemToken > TxSender
Definition ipc_binary.h:501
decltype(make_joined_sender< Proto, Read, Write, TxFun, RxFun, Alloc, ClientOrServer >( di::declval< ConnectionData< Proto, Read, Write, Alloc > * >(), di::declval< TxFun >(), di::declval< RxFun >(), get_env(di::declval< Rec >()))) InnerSender
Definition ipc_binary.h:503
Definition ipc_binary.h:497
u32 message_index
Definition ipc_binary.h:116
Function< void(Variant< void *, Error, SetStopped >)> callback
Definition ipc_binary.h:117
u32 message_number
Definition ipc_binary.h:115
ReplyWaiterBase(u32 message_number_, u32 message_index_, Function< void(Variant< void *, Error, SetStopped >)> callback_)
Definition ipc_binary.h:111
meta::CompletionSignaturesOf< decltype(make_joined_sender< Proto, Read, Write, TxFun, RxFun, Alloc, ClientOrServer >( di::declval< ConnectionData< Proto, Read, Write, Alloc > * >(), di::declval< TxFun >(), di::declval< RxFun >(), di::declval< Env >))> Sigs
Definition ipc_binary.h:543
RxFun rx_function
Definition ipc_binary.h:568
friend auto tag_invoke(Tag< connect >, Type &&self, Rec receiver)
Definition ipc_binary.h:555
Write write
Definition ipc_binary.h:566
void is_sender
Definition ipc_binary.h:533
Alloc allocator
Definition ipc_binary.h:569
TxFun tx_function
Definition ipc_binary.h:567
Read read
Definition ipc_binary.h:565
friend auto tag_invoke(Tag< get_completion_signatures >, Type &&, Env &&) -> Sigs< Env >
Definition ipc_binary.h:549
friend auto tag_invoke(Tag< get_env >, Type const &self)
Definition ipc_binary.h:561
Type(Read read_, Write write_, TxFun tx_function_, RxFun rx_function_, Alloc allocator_)
Definition ipc_binary.h:535
Definition ipc_binary.h:531
Definition ipc_binary.h:85
void is_server
Definition ipc_binary.h:86
MessageAtIndex< Proto, ClientOrServer, message_index > Message
Definition ipc_binary.h:241
friend void tag_invoke(Tag< start >, Type &self)
Definition ipc_binary.h:265
static constexpr auto message_index
Definition ipc_binary.h:240
meta::MessageReply< Message > Reply
Definition ipc_binary.h:242
Type(ConnectionData< Proto, Read, Write, Alloc > *data, u32 message_number, Rec receiver)
Definition ipc_binary.h:245
Definition ipc_binary.h:238
Definition ipc_binary.h:284
friend auto tag_invoke(Tag< connect >, Type self, Rec receiver)
Definition ipc_binary.h:293
di::CompletionSignatures< SetValue(Reply), SetError(Error), SetStopped()> CompletionSignatures
Definition ipc_binary.h:290
void is_sender
Definition ipc_binary.h:285
MessageAtIndex< Proto, ClientOrServer, message_index > Message
Definition ipc_binary.h:287
meta::MessageReply< Message > Reply
Definition ipc_binary.h:288
ConnectionData< Proto, Read, Write, Alloc > * data
Definition ipc_binary.h:303
u32 message_number
Definition ipc_binary.h:304
friend auto tag_invoke(Tag< get_env >, Type const &self)
Definition ipc_binary.h:298
Definition ipc_binary.h:283
Definition completion_signuatures.h:7
Definition in_place_template.h:5
Definition span_fixed_size.h:37
ssize_t write(int __fd, void const *__buffer, size_t __count)
Definition write.cpp:7