Solution (source code)

= Solution

Provide a blocking <request-reply sensor conversion> operation, using <synchronous send-and-receive> when the system supplies it:

``
get_temp():
    token := a new token for this process's call
    reply := request-and-wait(
        destination = temperature_driver,
        message = REQUEST(self, token),
        expected_reply = RESULT(token, value))
    return reply.value
``

Here `request-and-wait` means sending the request and remaining ready to accept its matching response; it denotes a protocol action, not a claimed library symbol. Separate blocking send and receive operations are also adequate if they preserve the sender identity and the reply cannot be lost between them. With a synchronous reply, the driver simply waits until this client's receive is ready.

The call returns only after the driver has selected this request, issued `TEMP_START`, observed completion, read the new value and replied with the matching token. \b[Each call therefore starts its own fresh conversion and returns its own result.] It never returns a cached sample or another caller's reply. Local request and response storage belong to the calling process and are not a shared global message buffer.