From da6c0e6194578538ce0bcd1b9815696b96153f6b Mon Sep 17 00:00:00 2001 From: crupest Date: Mon, 7 Jun 2021 14:05:51 +0800 Subject: import(life): ... --- works/life/computer-network-experiment/Output.cpp | 43 ++++++++++++++++++----- 1 file changed, 34 insertions(+), 9 deletions(-) (limited to 'works/life/computer-network-experiment/Output.cpp') diff --git a/works/life/computer-network-experiment/Output.cpp b/works/life/computer-network-experiment/Output.cpp index 2968c19..8efb525 100644 --- a/works/life/computer-network-experiment/Output.cpp +++ b/works/life/computer-network-experiment/Output.cpp @@ -1,18 +1,43 @@ #include "Output.h" +#include "folly/CancellationToken.h" folly::MPMCQueue output_queue(100); +folly::CancellationSource cancellation_source; + +std::thread output_thread(OutputThread); + +void PrintOutput(const Output &output) { + switch (output.type) { + case OutputType::Error: + error_stream << output.message; + break; + default: + output_stream << output.message; + break; + } +} + void OutputThread() { while (true) { - Output output; - output_queue.blockingRead(output); - switch (output.type) { - case OutputType::Error: - error_stream << output.message; - break; - default: - output_stream << output.message; - break; + if (cancellation_source.getToken().isCancellationRequested()) { + while (true) { + Output output; + if (output_queue.readIfNotEmpty(output)) { + PrintOutput(output); + } else { + return; + } + } } + + Output output; + if (output_queue.readIfNotEmpty(output)) + PrintOutput(output); } } + +void SignalAndWaitForOutputThreadStop() { + cancellation_source.requestCancellation(); + output_thread.join(); +} -- cgit v1.2.3