Iros
 
Loading...
Searching...
No Matches
ipc_binary.h
Go to the documentation of this file.
1#pragma once
2
41#include "di/function/invoke.h"
45#include "di/io/vector_reader.h"
46#include "di/io/vector_writer.h"
47#include "di/io/write_exactly.h"
49#include "di/meta/algorithm.h"
50#include "di/meta/core.h"
51#include "di/meta/function.h"
52#include "di/meta/language.h"
53#include "di/meta/list.h"
54#include "di/meta/operations.h"
55#include "di/meta/util.h"
57#include "di/platform/prelude.h"
65#include "di/types/byte.h"
66#include "di/util/addressof.h"
67#include "di/util/bit_cast.h"
69#include "di/util/immovable.h"
71#include "di/util/noncopyable.h"
78
79namespace di::execution {
80namespace ipc_binary_ns {
81 struct Client {
82 using is_client = void;
83 };
84
85 struct Server {
86 using is_server = void;
87 };
88
89 template<typename T>
91
92 template<typename Proto, typename ClientOrServer, usize message_index>
100
101 template<typename Proto, typename ClientOrServer, usize message_index>
103
109
111 explicit ReplyWaiterBase(u32 message_number_, u32 message_index_,
113 : message_number(message_number_), message_index(message_index_), callback(di::move(callback_)) {}
114
118 };
119
120 template<typename Proto, typename Read, typename Write, typename Alloc>
122 struct Type {
123 explicit Type(Read&& read, Write&& write, Alloc&& allocator)
124 : read(di::move(read)), write(di::move(write)), allocator(di::move(allocator)) {}
125
126 [[no_unique_address]] Read read;
127 [[no_unique_address]] Write write;
128 [[no_unique_address]] Alloc allocator;
134 };
135 };
136
137 template<typename Proto, typename Read, typename Write, typename Alloc>
139
140 template<typename Proto, typename ClientOrServer>
142 struct Sender : Peer<ClientOrServer> {
143 using is_sender = void;
144
145 using Protocol = Proto;
146
147 template<typename Rec>
150 explicit Type(Rec receiver_, MessageHeader header_, Span<byte const> buffer_)
151 : receiver(di::move(receiver_)), header(header_), buffer(buffer_) {}
152
153 [[no_unique_address]] Rec receiver;
156
157 friend void tag_invoke(Tag<start>, Type& self) {
158 using Messages = meta::MessageTypes<Sender>;
160 return set_error(di::move(self.receiver), Error { BasicError::InvalidArgument });
161 }
162
164 self.header.message_type, [&]<usize index>(Constexpr<index>) {
165 using Message = meta::At<Messages, index>;
166
168 if (!result) {
169 return set_error(di::move(self.receiver), Error(di::move(result).error()));
170 }
171 return set_value(di::move(self.receiver), self.header, di::move(result).value());
172 });
173 }
174 };
175 };
176
177 template<typename Rec>
179
187 SetError(Error)>>;
188
189 explicit Sender(MessageHeader header_, Span<byte const> buffer_) : header(header_), buffer(buffer_) {}
190
191 template<concepts::ReceiverOf<CompletionSignatures> Rec>
192 friend auto tag_invoke(Tag<connect>, Sender self, Rec receiver) {
193 return OperationState<Rec> { di::move(receiver), self.header, self.buffer };
194 }
195
198 };
199
200 auto operator()(MessageHeader header, Span<byte const> buffer) const { return Sender(header, buffer); }
201 };
202
203 template<typename Proto, typename ClientOrServer>
205
206 template<typename Proto, typename Read, typename Write, typename Alloc, typename ClientOrServer>
209 return repeat(let_value_with(
210 [data](Array<byte, sizeof(MessageHeader)>& buffer) {
211 return async_read_exactly(data->read, buffer.span()) | let_value([data, &buffer] {
212 auto header = util::bit_cast<MessageHeader>(buffer);
213 auto const total_size = u32(header.message_size);
214 return just_from([data, total_size] {
215 return data->receive_buffer.reserve(total_size);
216 }) |
217 let_value([data, header] {
218 return async_read_exactly(data->read, Span { data->receive_buffer.data(),
219 header.message_size.value() -
220 sizeof(MessageHeader) }) |
221 let_value([data, header] {
223 header, Span { data->receive_buffer.data(),
224 header.message_size.value() });
225 });
226 });
227 });
228 },
229 make_deferred<Array<byte, sizeof(MessageHeader)>>()));
230 }
231 };
232
233 template<typename Proto, typename Read, typename Write, typename Alloc, typename ClientOrServer>
235
236 template<typename Proto, typename Read, typename Write, typename Alloc, typename ClientOrServer,
237 usize message_index_, typename Rec>
240 constexpr static auto message_index = message_index_;
243
244 public:
247 [this](Variant<void*, Error, SetStopped> result) {
249 [this](void* data) {
250 set_value(di::move(m_receiver),
251 di::move(*static_cast<Reply*>(data)));
252 },
253 [this](Error error) {
254 set_error(di::move(m_receiver), di::move(error));
255 },
256 [this](SetStopped) {
257 set_stopped(di::move(m_receiver));
258 }),
259 di::move(result));
260 })
261 , m_data(data)
262 , m_receiver(di::move(receiver)) {}
263
264 private:
265 friend void tag_invoke(Tag<start>, Type& self) {
266 // FIXME: we actually need to add ourselves as a waiter before sending the message.
267 auto* data = self.m_data;
268 data->reply_waiters.push_back(self);
269 }
270
272 Rec m_receiver;
273 };
274 };
275
276 template<typename Proto, typename Read, typename Write, typename Alloc, typename ClientOrServer,
277 usize message_index, typename Rec>
280
281 template<typename Proto, typename Read, typename Write, typename Alloc, typename ClientOrServer,
282 usize message_index>
284 struct Type {
285 using is_sender = void;
286
289
291
292 template<concepts::ReceiverOf<CompletionSignatures> Rec>
293 friend auto tag_invoke(Tag<connect>, Type self, Rec receiver) {
295 self.data, self.message_number, di::move(receiver));
296 }
297
298 friend auto tag_invoke(Tag<get_env>, Type const& self) {
299 return make_env(empty_env, with(get_allocator, self.data->allocator),
300 with(get_stop_token, self.data->stop_source.get_stop_token()));
301 }
302
305 };
306 };
307
308 template<typename Proto, typename Read, typename Write, typename Alloc, typename ClientOrServer,
309 usize message_index>
312
313 template<typename Proto, typename Read, typename Write, typename Alloc, typename ClientOrServer>
315 struct Type : ClientOrServer {
317 using Protocol = Proto;
318
320
321 friend auto tag_invoke(Tag<request_stop>, Type& self) { return self.data->stop_source.request_stop(); }
322
323 template<concepts::Serializable<Serializer> T, typename U = meta::Decay<T>,
324 typename MessageList = meta::MessageTypes<Type>>
326 friend auto tag_invoke(Tag<send>, Type self, T&& message, Optional<u32> maybe_message_number = {}) {
327 constexpr usize message_index = meta::Lookup<U, MessageList>;
328 static_assert(math::representable_as<u32>(message_index),
329 "There can be at most 2^32 messages in a protocol.");
330
331 // FIXME: acquire a async mutex first.
332 return just_from([message = util::forward<T>(message), data = self.data,
333 maybe_message_number] -> Result<u32> {
334 // Serialize the message. We re-use the send buffer to prevent extra allocations.
335 auto send_buffer = di::move(data->send_buffer);
336 send_buffer.clear();
337
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));
341 } else {
342 send_buffer.reserve(total_size);
343 }
344
345 auto writer = VectorWriter(di::move(send_buffer));
346 auto message_number =
347 maybe_message_number.has_value() ? *maybe_message_number : data->message_number++;
348 auto message_header = MessageHeader {
349 .message_type = static_cast<u32>(message_index),
350 .message_number = message_number,
351 .message_size = total_size,
352 };
353 auto as_bytes = di::bit_cast<Array<byte, sizeof(MessageHeader)>>(message_header);
354 DI_TRY(write_exactly(writer, as_bytes.span()));
355 DI_TRY(serialize_binary(writer, message));
356 data->send_buffer = di::move(writer).vector();
357 return message_number;
358 }) |
359 let_value([data = self.data](u32 message_number) {
360 if constexpr (concepts::MessageWithReply<U>) {
361 return async_write_exactly(data->write, data->send_buffer.span()) |
362 let_value([data, message_number] {
363 return WaitForReplySender<Proto, Read, Write, Alloc, ClientOrServer,
364 message_index>(data, message_number);
365 });
366 } else {
367 return async_write_exactly(data->write, data->send_buffer.span());
368 }
369 });
370 }
371
373 };
374 };
375
376 template<typename Proto, typename Read, typename Write, typename Alloc, typename ClientOrServer>
378
379 template<typename Proto, typename Read, typename Write, typename TxFun, typename RxFun, typename Alloc,
380 typename ClientOrServer>
381 struct FilterMessagesFunction : Peer<ClientOrServer> {
383 using Protocol = Proto;
384
385 auto operator()(concepts::Sender auto messages, Data* data) const {
386 return filter(di::move(messages), [data]<typename T>(MessageHeader& header, T& message) {
388 return just(true);
389 } else {
390 for (auto& waiter : data->reply_waiters) {
391 if (waiter.message_number == header.message_number) {
392 waiter.callback(static_cast<void*>(di::addressof(message)));
393 data->reply_waiters.erase(waiter);
394 break;
395 }
396 }
397 return just(false);
398 }
399 });
400 }
401 };
402
403 template<typename Proto, typename Read, typename Write, typename TxFun, typename RxFun, typename Alloc,
404 typename ClientOrServer>
407
408 template<typename Proto, typename Read, typename Write, typename TxFun, typename RxFun, typename Alloc,
409 typename ClientOrServer>
413
414 static auto make_rx_sequence(Data* data, RxFun&& rx_function) {
417 let_value_each([data, rx_function = di::forward<RxFun>(rx_function)]<typename T>(
418 MessageHeader& header, T& message) mutable {
419 return get_env() | let_value([data, &header, rx_function = di::move(rx_function),
420 &message]<typename Env>(Env&) mutable {
421 auto call_function = [&] {
423 return di::invoke(rx_function, di::move(message), Token(data));
424 } else if constexpr (concepts::Invocable<RxFun&, T>) {
425 return di::invoke(rx_function, di::move(message));
426 } else {
427 static_assert(di::concepts::AlwaysFalse<T>,
428 "Receiving function must accept all message types.");
429 }
430 };
431
432 auto sender_function = [&] {
433 using R = decltype(call_function());
434 if constexpr (!concepts::Sender<R>) {
435 if constexpr (concepts::LanguageVoid<R>) {
436 call_function();
437 return just();
438 } else {
439 return just(call_function());
440 }
441 } else {
442 return call_function();
443 }
444 };
445
446 using Send = decltype(sender_function());
448 "Receiving function must return a single sender.");
449
451 if constexpr (concepts::LanguageVoid<Value>) {
452 (void) header;
453 return sender_function();
454 } else if constexpr (concepts::MessageWithReply<T>) {
455 static_assert(
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) {
459 return send(Token(data), di::move(reply), header.message_number);
460 });
461 } else if constexpr (meta::Contains<meta::MessageTypes<Token>, Value>) {
462 (void) header;
463 return sender_function() | let_value([data](Value& message) {
464 return send(Token(data), di::move(message));
465 });
466 } else {
468 "Receiving function must return a sender which sends void or a "
469 "valid message type.");
470 }
471 });
472 });
473 }
474
475 static auto make_rx_sender(Data* data, RxFun&& rx_function) {
476 return ignore_all(make_rx_sequence(data, di::forward<RxFun>(rx_function))) | let_error([](auto&&) {
477 return just();
478 });
479 }
480
481 template<typename Env>
482 auto operator()(Data* data, TxFun&& tx_function, RxFun&& rx_function, Env&& env) const {
483 return with_env(make_env(di::forward<Env>(env), with(get_allocator, auto(data->allocator)),
484 with(get_stop_token, data->stop_source.get_stop_token())),
485 when_all(di::invoke(di::forward<TxFun>(tx_function), Token(data)),
486 make_rx_sender(data, di::forward<RxFun>(rx_function))));
487 }
488 };
489
490 template<typename Proto, typename Read, typename Write, typename TxFun, typename RxFun, typename Alloc,
491 typename ClientOrServer>
494
495 template<typename Proto, typename Read, typename Write, typename TxFun, typename RxFun, typename Alloc,
496 typename ClientOrServer, typename Rec>
499 public:
502
506
508
509 explicit Type(Read read, Write write, TxFun&& tx_function, RxFun&& rx_function, Alloc allocator,
510 Rec receiver)
511 : m_data(di::move(read), di::move(write), di::move(allocator))
512 , m_inner_op(connect(make_joined_sender<Proto, Read, Write, TxFun, RxFun, Alloc, ClientOrServer>(
513 di::addressof(m_data), di::forward<TxFun>(tx_function),
514 di::forward<RxFun>(rx_function), get_env(receiver)),
515 di::move(receiver))) {}
516
517 private:
518 friend void tag_invoke(Tag<start>, Type& self) { start(self.m_inner_op); }
519
521 DI_IMMOVABLE_NO_UNIQUE_ADDRESS InnerOp m_inner_op;
522 };
523 };
524
525 template<typename Proto, typename Read, typename Write, typename TxFun, typename RxFun, typename Alloc,
526 typename ClientOrServer, typename Rec>
528
529 template<typename Proto, typename Read, typename Write, typename TxFun, typename RxFun, typename Alloc,
530 typename ClientOrServer>
531 struct SenderT {
532 struct Type : NonCopyable {
533 using is_sender = void;
534
535 explicit Type(Read read_, Write write_, TxFun tx_function_, RxFun rx_function_, Alloc allocator_)
536 : read(di::move(read_))
537 , write(di::move(write_))
538 , tx_function(di::move(tx_function_))
539 , rx_function(di::move(rx_function_))
540 , allocator(di::move(allocator_)) {}
541
542 template<typename Env>
547
548 template<typename Env>
550 return {};
551 }
552
553 template<typename Rec>
555 friend auto tag_invoke(Tag<connect>, Type&& self, Rec receiver) {
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));
559 }
560
561 friend auto tag_invoke(Tag<get_env>, Type const& self) {
563 }
564
565 [[no_unique_address]] Read read;
566 [[no_unique_address]] Write write;
567 [[no_unique_address]] TxFun tx_function;
568 [[no_unique_address]] RxFun rx_function;
569 [[no_unique_address]] Alloc allocator;
570 };
571 };
572
573 template<typename Proto, typename Read, typename Write, typename TxFun, typename RxFun, typename Alloc,
574 typename ClientOrServer>
576
577 template<typename Proto, typename Read, typename Write, typename TxFun, typename RxFun, typename Alloc>
580
581 template<typename Proto, typename Read, typename Write, typename TxFun, typename RxFun, typename Alloc>
584
586 auto operator()(auto) const { return just(); }
587 };
588
589 constexpr inline auto default_transmit = DefaultTransmit {};
590
592 constexpr void operator()(auto&&...) const {}
593 };
594
595 constexpr inline auto default_receive = DefaultReceive {};
596
597 template<concepts::InstanceOf<Protocol> Proto>
599 template<typename... Args>
601 auto operator()(Args&&... args) const {
602 auto named = NamedArguments(di::forward<Args>(args)...);
603
604 using Named = decltype(named);
605 static_assert(
609 "ipc connect functions require either a receiver-transmitter or a receiver and a transmitter.");
610
614
617 using Write = Read;
618
625 } else {
628
635 }
636 }
637 };
638
639 template<concepts::InstanceOf<Protocol> Proto>
641 template<typename... Args>
643 auto operator()(Args&&... args) const {
644 auto named = NamedArguments(di::forward<Args>(args)...);
645
646 using Named = decltype(named);
647 static_assert(
651 "ipc connect functions require either a receiver-transmitter or a receiver and a transmitter.");
652
656
659 using Write = Read;
660
667 } else {
670
677 }
678 }
679 };
680}
681
682template<concepts::InstanceOf<Protocol> Proto>
684
685template<concepts::InstanceOf<Protocol> Proto>
687}
688
689namespace di {
692}
Definition little_endian.h:25
Definition list_node.h:9
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 invoke.h:58
Definition core.h:128
Definition ipc_protocol.h:21
Definition receiver_of.h:25
Definition ipc_protocol.h:93
Definition sender.h:11
Definition single_sender.h:8
A concept to check if a list of named arguments is valid.
Definition named_arguments.h:261
Definition list.h:119
#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
Definition bulk.h:30
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
typename T::template At< index > At
Definition list.h:110
detail::ConditionalHelper< value, T, U >::Type Conditional
Definition core.h:88
detail::ChainHelper< Funs... > Chain
Definition function.h:119
T::Type Type
Definition core.h:26
decltype(execution::get_completion_signatures(util::declval< Sender >(), util::declval< Env >())) CompletionSignaturesOf
Definition completion_signatures_of.h:12
Type< detail::AsTemplateHelper< Template, T > > AsTemplate
Definition algorithm.h:60
Conditional< concepts::LanguageArray< RemoveReference< T > >, RemoveExtent< RemoveReference< T > > *, Conditional< concepts::LanguageFunction< RemoveReference< T > >, AddPointer< RemoveReference< T > >, RemoveCVRef< T > > > Decay
Definition language.h:574
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
constexpr usize Size
Definition list.h:106
meta::Decay< NamedArgument< Args, Tag > > NamedArgumentValue
A metafunction to get the value type of a named argument.
Definition named_arguments.h:204
Concat< MessageTypesWithoutReplies< T >, detail::MessagesReplies< PeerMessageTypesWithoutReplies< T > > > MessageTypes
Definition ipc_protocol.h:85
decltype(function::detail::invoke_impl(util::declval< Ts >()...)) InvokeResult
Definition invoke.h:64
Type< detail::MessageReplyHelper< T > > MessageReply
Definition ipc_protocol.h:38
Concat< L, List< T > > PushBack
Definition algorithm.h:86
detail::TransformHelper< List, Function >::Type Transform
Definition algorithm.h:186
meta::Decay< NamedArgumentOr< Args, Tag, Fallback > > NamedArgumentValueOr
A metafunction to get the value type of a named argument with fallback.
Definition named_arguments.h:229
decltype(execution::connect(util::declval< Send >(), util::declval< Rec >())) ConnectResult
Definition connect_result.h:7
ValueTypesOf< Send, Env, detail::SingleSenderValueTypeHelper, detail::SingleSenderValueTypeHelper > SingleSenderValueType
Definition single_sender_value_type.h:22
container::InfallibleAllocator DefaultAllocator
Definition custom.h:39
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_error.h:6
Definition set_stopped.h:6
Definition set_value.h:6
Definition ipc_binary.h:81
void is_client
Definition ipc_binary.h:82
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
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
ConnectionData< Proto, Read, Write, Alloc > * data
Definition ipc_binary.h:372
BinarySerializer< VectorWriter< Vector< byte, Alloc > > > Serializer
Definition ipc_binary.h:316
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
constexpr void operator()(auto &&...) const
Definition ipc_binary.h:592
auto operator()(auto) const
Definition ipc_binary.h:586
auto operator()(concepts::Sender auto messages, Data *data) const
Definition ipc_binary.h:385
ConnectionData< Proto, Read, Write, Alloc > Data
Definition ipc_binary.h:382
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
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
friend void tag_invoke(Tag< start >, Type &self)
Definition ipc_binary.h:157
Type(Rec receiver_, MessageHeader header_, Span< byte const > buffer_)
Definition ipc_binary.h:150
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
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
auto operator()(MessageHeader header, Span< byte const > buffer) const
Definition ipc_binary.h:200
LittleEndian< u32 > message_number
Definition ipc_binary.h:106
LittleEndian< u32 > message_type
Definition ipc_binary.h:105
LittleEndian< u32 > message_size
Definition ipc_binary.h:107
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
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
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
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
friend auto tag_invoke(Tag< get_env >, Type const &self)
Definition ipc_binary.h:298
Definition function.h:70
Definition function.h:64
A wrapper for a constexpr value.
Definition core.h:77
Definition completion_signuatures.h:7
Definition in_place_template.h:5
Definition immovable.h:4
Definition span_fixed_size.h:37
ssize_t write(int __fd, void const *__buffer, size_t __count)
Definition write.cpp:7