| // Copyright Microsoft and CHERIoT Contributors. |
| // SPDX-License-Identifier: MIT |
| |
| #include "consumer.h" |
| #include <debug.hh> |
| #include <fail-simulator-on-error.h> |
| #include <queue.h> |
| #include <timeout.hh> |
| #include <token.h> |
| |
| using Debug = ConditionalDebug<true, "Producer">; |
| |
| /** |
| * Run the producer thread, sending integers to the consumer. |
| */ |
| void __cheri_compartment("producer") run() |
| { |
| // Allocate the queue |
| SObj sendHandle; |
| SObj receiveHandle; |
| non_blocking<queue_create_sealed>( |
| MALLOC_CAPABILITY, &sendHandle, &receiveHandle, sizeof(int), 16); |
| // Pass the queue handle to the consumer. |
| set_queue(receiveHandle); |
| Debug::log("Starting producer loop"); |
| // Loop, sending some numbers to the other thread. |
| for (int i = 1; i < 200; i++) |
| { |
| int ret = blocking_forever<queue_send_sealed>(sendHandle, &i); |
| // Abort if the queue send errors. |
| Debug::Invariant(ret == 0, "Queue send failed {}", ret); |
| } |
| Debug::log("Producer sent all messages to consumer"); |
| } |