T pop() { T data; if (!m_has_reached_end_of_data) { std::future<T> data_future; m_queue.wait_and_pop(data_future); data = std::move(data_future.get()); if (at_end_of_data(data)) { m_has_reached_end_of_data = true; } } return data; }
void operator()() { osmium::thread::set_thread_name("_osmium_write"); try { while (true) { std::string data = m_queue.pop(); if (at_end_of_data(data)) { break; } m_compressor->write(data); } m_compressor->close(); m_promise.set_value(true); } catch (...) { m_promise.set_exception(std::current_exception()); m_queue.drain(); } }
void run_in_thread() { osmium::thread::set_thread_name("_osmium_read"); try { while (!m_done) { std::string data {m_decompressor.read()}; if (at_end_of_data(data)) { break; } add_to_queue(m_queue, std::move(data)); } m_decompressor.close(); } catch (...) { add_to_queue(m_queue, std::current_exception()); } add_end_of_data_to_queue(m_queue); }