1[/
2 / Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com)
3 /
4 / Distributed under the Boost Software License, Version 1.0. (See accompanying
5 / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 /]
7
8[section:OperationState Operation state concept]
9
10        template<class O>
11          concept operation_state =
12            destructible<O> &&
13            is_object_v<O> &&
14            requires (O& o) {
15              { execution::start(o) } noexcept;
16            };
17
18An object whose type satisfies `operation_state` represents the state of an
19asynchronous operation. It is the result of calling `execution::connect` with a
20`sender` and a `receiver`.
21
22`execution::start` may be called on an `operation_state` object at most once.
23Once `execution::start` has been invoked, the caller shall ensure that the
24start of a non-exceptional invocation of one of the receiver's
25completion-signalling operations strongly happens before [intro.multithread]
26the call to the `operation_state` destructor.
27
28The start of the invocation of `execution::start` shall strongly happen before
29[intro.multithread] the invocation of one of the three receiver operations.
30
31`execution::start` may or may not block pending the successful transfer of
32execution to one of the three receiver operations.
33
34[endsect]
35