Chris@16: // Chris@16: // detail/impl/winrt_timer_scheduler.ipp Chris@16: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Chris@16: // Chris@101: // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: Chris@16: #ifndef BOOST_ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_IPP Chris@16: #define BOOST_ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_IPP Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: # pragma once Chris@16: #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: Chris@16: #include Chris@16: Chris@16: #if defined(BOOST_ASIO_WINDOWS_RUNTIME) Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace asio { Chris@16: namespace detail { Chris@16: Chris@16: winrt_timer_scheduler::winrt_timer_scheduler( Chris@16: boost::asio::io_service& io_service) Chris@16: : boost::asio::detail::service_base(io_service), Chris@16: io_service_(use_service(io_service)), Chris@16: mutex_(), Chris@16: event_(), Chris@16: timer_queues_(), Chris@16: thread_(0), Chris@16: stop_thread_(false), Chris@16: shutdown_(false) Chris@16: { Chris@16: thread_ = new boost::asio::detail::thread( Chris@16: bind_handler(&winrt_timer_scheduler::call_run_thread, this)); Chris@16: } Chris@16: Chris@16: winrt_timer_scheduler::~winrt_timer_scheduler() Chris@16: { Chris@16: shutdown_service(); Chris@16: } Chris@16: Chris@16: void winrt_timer_scheduler::shutdown_service() Chris@16: { Chris@16: boost::asio::detail::mutex::scoped_lock lock(mutex_); Chris@16: shutdown_ = true; Chris@16: stop_thread_ = true; Chris@16: event_.signal(lock); Chris@16: lock.unlock(); Chris@16: Chris@16: if (thread_) Chris@16: { Chris@16: thread_->join(); Chris@16: delete thread_; Chris@16: thread_ = 0; Chris@16: } Chris@16: Chris@16: op_queue ops; Chris@16: timer_queues_.get_all_timers(ops); Chris@16: io_service_.abandon_operations(ops); Chris@16: } Chris@16: Chris@16: void winrt_timer_scheduler::fork_service(boost::asio::io_service::fork_event) Chris@16: { Chris@16: } Chris@16: Chris@16: void winrt_timer_scheduler::init_task() Chris@16: { Chris@16: } Chris@16: Chris@16: void winrt_timer_scheduler::run_thread() Chris@16: { Chris@16: boost::asio::detail::mutex::scoped_lock lock(mutex_); Chris@16: while (!stop_thread_) Chris@16: { Chris@16: const long max_wait_duration = 5 * 60 * 1000000; Chris@16: long wait_duration = timer_queues_.wait_duration_usec(max_wait_duration); Chris@16: event_.wait_for_usec(lock, wait_duration); Chris@16: event_.clear(lock); Chris@16: op_queue ops; Chris@16: timer_queues_.get_ready_timers(ops); Chris@16: if (!ops.empty()) Chris@16: { Chris@16: lock.unlock(); Chris@16: io_service_.post_deferred_completions(ops); Chris@16: lock.lock(); Chris@16: } Chris@16: } Chris@16: } Chris@16: Chris@16: void winrt_timer_scheduler::call_run_thread(winrt_timer_scheduler* scheduler) Chris@16: { Chris@16: scheduler->run_thread(); Chris@16: } Chris@16: Chris@16: void winrt_timer_scheduler::do_add_timer_queue(timer_queue_base& queue) Chris@16: { Chris@16: mutex::scoped_lock lock(mutex_); Chris@16: timer_queues_.insert(&queue); Chris@16: } Chris@16: Chris@16: void winrt_timer_scheduler::do_remove_timer_queue(timer_queue_base& queue) Chris@16: { Chris@16: mutex::scoped_lock lock(mutex_); Chris@16: timer_queues_.erase(&queue); Chris@16: } Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace asio Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // defined(BOOST_ASIO_WINDOWS_RUNTIME) Chris@16: Chris@16: #endif // BOOST_ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_IPP