#include #include #include #include #include namespace lcamera_dev_probe { namespace { constexpr sscl::ThreadId PROBE_PUPPETEER_THREAD_ID = 1; class DummyPuppeteerComponent : public sscl::pptr::PuppeteerComponent { public: explicit DummyPuppeteerComponent( const std::shared_ptr& componentThread) : sscl::pptr::PuppeteerComponent(componentThread) {} void handleLoopExceptionHook() override { std::cerr << "lcameraDev probe: puppeteer loop exception\n"; } }; void probePuppeteerMain( const sscl::PuppeteerThread::EntryFnArguments& args, const std::function&)>& work, std::promise& donePromise) { sscl::PuppeteerThread& thr = args.usableBeforeJolt; thr.initializeTls(); sscl::ComponentThread::setPuppeteerThreadId(PROBE_PUPPETEER_THREAD_ID); std::shared_ptr thrPtr = std::static_pointer_cast(thr.shared_from_this()); sscl::ComponentThread::setPuppeteerThread(thrPtr); try { work(thrPtr); donePromise.set_value(nullptr); } catch (...) { donePromise.set_value(std::current_exception()); } thr.getIoContext().stop(); } } // namespace void runOnComponentThread( const std::function&)>& work) { std::promise donePromise; std::future doneFuture = donePromise.get_future(); DummyPuppeteerComponent dummyComponent{ std::shared_ptr()}; std::shared_ptr probeThread = std::make_shared( PROBE_PUPPETEER_THREAD_ID, "lcameraDev-probe", [&work, &donePromise]( const sscl::PuppeteerThread::EntryFnArguments& args) { probePuppeteerMain(args, work, donePromise); }, dummyComponent, nullptr); dummyComponent.thread = probeThread; probeThread->thread.join(); std::exception_ptr probeException = doneFuture.get(); if (probeException) { std::rethrow_exception(probeException); } } } // namespace lcamera_dev_probe