= 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.
Back to article page