| Index: docs/intro/message_pipes.md
|
| diff --git a/docs/intro/message_pipes.md b/docs/intro/message_pipes.md
|
| index cf9959e8ecbe1230e0991748982569122c32b6ad..abe3013b789894382395f26795bf2f0720a332aa 100644
|
| --- a/docs/intro/message_pipes.md
|
| +++ b/docs/intro/message_pipes.md
|
| @@ -11,13 +11,13 @@ of the meaning of the data or of the handles (other than their intrinsic
|
| properties).
|
|
|
| That said, Mojo provides a *standard* way of communicating over message pipes,
|
| -namely via a standardized protocol together with [Mojom IDL](mojom.md) files.
|
| +namely via a standardized protocol together with [Mojom](mojom.md) IDL files.
|
|
|
| ## Messages
|
|
|
| A *message* consists of two things:
|
| * a finite sequence of bytes, and
|
| -* a finite sequence of Mojo handles.
|
| +* a finite sequence of [Mojo handles](handles.md).
|
|
|
| Both of these are determined when the message is sent (or *written*). Messages
|
| are *framed* in the sense that they are "atomic" units: they are sent and
|
| @@ -75,4 +75,44 @@ about this in the context of Mojom.)
|
|
|
| ## "Synchronous" operation
|
|
|
| -**TODO(vtl)**
|
| +Though message pipes are asynchronous as discussed above, they may be used in a
|
| +synchronous fashion: immediately after sending a *request* message, one can then
|
| +just block and wait for the *response* message (and then read it and process
|
| +it). Of course, this requires that the protocol support this:
|
| +* Message pipes must be used in a "directional" way: there must be fixed request
|
| + and response directions or, equivalently, one endpoint belongs to the *client*
|
| + and the other to the *server* (or *impl*). (Historical note: This is the case
|
| + for the current Mojom protocol, but not in previous versions.) The issue here
|
| + is that without this, the sender of the request messages may have to process
|
| + incoming request messages from its peer.
|
| +* Request messages must have unique response messages. (In the Mojom protocol,
|
| + request messages have optional unique responses. For messages without
|
| + responses, one can just proceed immediately without waiting. However, without
|
| + response messages there may be flow control issues; again, see above.) The
|
| + important point is that for each request message, there is a well-defined
|
| + number of response messages for each request and not arbitrary "callback"
|
| + messages.
|
| +* The sending of a response message must not depend on a future action of the
|
| + client. (This is a higher-level semantic that is not enforced by the Mojom
|
| + protocol. E.g., one may define a Mojom interface in which the response to a
|
| + message *Foo* isn't sent until the client sends a request *Bar*.)
|
| +
|
| +That said, whether one wants to, or even can, use this synchronous mode of
|
| +operation may depend on a number of things:
|
| +* For message-loop-centric programming languages, this mode is at best
|
| + undesirable (and possibly infeasible, depending on what facilities are exposed
|
| + to user code). (E.g., this is the case for JavaScript and Dart.)
|
| +* Similarly, on a message-loop programming model (in which threads -- if there
|
| + are more than one -- are mostly coordinated by "message passing"), it is
|
| + typically undesirable to block any thread (with a message loop). Indeed, if
|
| + other message pipes are serviced by a message loop, blocking the thread may
|
| + result in deadlock. (E.g., this is the usual programming model for the
|
| + standard Mojom C++ bindings.)
|
| +* Even when blocking is permissible, it may not be desirable to do so:
|
| + advancement of the program then relies on trusting the server to be
|
| + responsive and send responses in a timely fashion.
|
| +* Mixing asynchronous and synchronous operation is problematic: one cannot send
|
| + a request and synchronously wait for a response while responses to other
|
| + messages are still pending. (Theoretically, one could buffer such other
|
| + responses until the response to particular request is received, and process
|
| + those other responses later, but this would be dubious at best.)
|
|
|