diff --git a/include/asynchronousBridge.h b/include/asynchronousBridge.h new file mode 100644 index 0000000..96add90 --- /dev/null +++ b/include/asynchronousBridge.h @@ -0,0 +1,47 @@ +#ifndef ASYNCHRONOUS_BRIDGE_H +#define ASYNCHRONOUS_BRIDGE_H + +#include +#include + +namespace smo { + +class AsynchronousBridge +{ +public: + AsynchronousBridge(boost::asio::io_service &io_service) + : io_service(io_service), isAsyncOperationComplete(false) + {} + + void setAsyncOperationComplete(void) + { + /** EXPLANATION: + * This empty post()ed message is necessary to ensure that the thread + * that's waiting on the io_service is signaled to wake up and check + * the io_service's queue. + */ + isAsyncOperationComplete.store(true); + io_service.post([]{}); + } + + void waitForAsyncOperationCompleteOrIoServiceStopped(void) + { + for (;;) + { + io_service.run_one(); + if (isAsyncOperationComplete.load() || io_service.stopped()) + { break; } + } + } + + bool exitedBecauseIoServiceStopped(void) const + { return io_service.stopped(); } + +private: + std::atomic isAsyncOperationComplete; + boost::asio::io_service &io_service; +}; + +} // namespace smo + +#endif // ASYNCHRONOUS_BRIDGE_H