From 026003bb65356f59dbfdac85f4ae3bcf44746f17 Mon Sep 17 00:00:00 2001 From: Oliver Kowalke Date: Tue, 17 Jun 2014 11:51:14 +0200 Subject: [PATCH] use the free fm_ - functions --- examples/Jamfile.v2 | 42 +++++++++++++++--------------- include/boost/fiber/condition.hpp | 12 ++++----- include/boost/fiber/fss.hpp | 12 ++++----- include/boost/fiber/operations.hpp | 30 ++++++++++----------- src/detail/scheduler.cpp | 2 +- src/detail/spinlock.cpp | 18 +++---------- src/fiber.cpp | 6 ++--- src/fiber_manager.cpp | 12 ++++----- src/interruption.cpp | 16 ++++++------ src/mutex.cpp | 6 ++--- src/recursive_mutex.cpp | 6 ++--- src/recursive_timed_mutex.cpp | 12 ++++----- src/timed_mutex.cpp | 12 ++++----- 13 files changed, 87 insertions(+), 99 deletions(-) diff --git a/examples/Jamfile.v2 b/examples/Jamfile.v2 index d37b38be..7b4165b2 100644 --- a/examples/Jamfile.v2 +++ b/examples/Jamfile.v2 @@ -30,26 +30,26 @@ project boost/fiber/example # BOOST_ASIO_ENABLE_HANDLER_TRACKING ; -exe barrier : barrier.cpp ; -exe future : future.cpp ; -exe futures_mt : futures_mt.cpp ; -exe interrupt : interrupt.cpp ; -exe join : join.cpp ; -exe ping_pong : ping_pong.cpp ; -exe segmented_stack : segmented_stack.cpp ; -exe simple : simple.cpp ; -#exe migrate_fibers -# : migrate_fibers.cpp -# workstealing_round_robin.cpp -# ; +#exe barrier : barrier.cpp ; +#exe future : future.cpp ; +#exe futures_mt : futures_mt.cpp ; +#exe interrupt : interrupt.cpp ; +#exe join : join.cpp ; +#exe ping_pong : ping_pong.cpp ; +#exe segmented_stack : segmented_stack.cpp ; +#exe simple : simple.cpp ; +exe migrate_fibers + : migrate_fibers.cpp + workstealing_round_robin.cpp + ; -exe asio/daytime_client : asio/daytime_client.cpp ; -exe asio/daytime_client2 : asio/daytime_client2.cpp ; -exe asio/echo_client : asio/echo_client.cpp ; -exe asio/echo_client2 : asio/echo_client2.cpp ; -exe asio/echo_server : asio/echo_server.cpp ; -exe asio/echo_server2 : asio/echo_server2.cpp ; +#exe asio/daytime_client : asio/daytime_client.cpp ; +#exe asio/daytime_client2 : asio/daytime_client2.cpp ; +#exe asio/echo_client : asio/echo_client.cpp ; +#exe asio/echo_client2 : asio/echo_client2.cpp ; +#exe asio/echo_server : asio/echo_server.cpp ; +#exe asio/echo_server2 : asio/echo_server2.cpp ; -exe asio/publish_subscribe/server : asio/publish_subscribe/server.cpp ; -exe asio/publish_subscribe/publisher : asio/publish_subscribe/publisher.cpp ; -exe asio/publish_subscribe/subscriber : asio/publish_subscribe/subscriber.cpp ; +#exe asio/publish_subscribe/server : asio/publish_subscribe/server.cpp ; +#exe asio/publish_subscribe/publisher : asio/publish_subscribe/publisher.cpp ; +#exe asio/publish_subscribe/subscriber : asio/publish_subscribe/subscriber.cpp ; diff --git a/include/boost/fiber/condition.hpp b/include/boost/fiber/condition.hpp index ec98386f..17bf7e9a 100644 --- a/include/boost/fiber/condition.hpp +++ b/include/boost/fiber/condition.hpp @@ -72,7 +72,7 @@ public: template< typename LockType > void wait( LockType & lt) { - detail::fiber_base * n( detail::scheduler::instance()->active() ); + detail::fiber_base * n( fm_active( detail::scheduler::instance() ) ); try { if ( n) @@ -91,7 +91,7 @@ public: // suspend this fiber // locked spinlock will be released if this fiber // was stored inside schedulers's waiting-queue - detail::scheduler::instance()->wait( lk); + fm_wait( detail::scheduler::instance(), lk); // this fiber was notified and resumed // check if fiber was interrupted @@ -123,7 +123,7 @@ public: // loop until main-notifier gets notified while ( ! n->is_ready() ) // run scheduler - detail::scheduler::instance()->run(); + fm_run( detail::scheduler::instance() ); // lock external again before returning lt.lock(); @@ -144,7 +144,7 @@ public: { cv_status status = cv_status::no_timeout; - detail::fiber_base * n( detail::scheduler::instance()->active() ); + detail::fiber_base * n( fm_active( detail::scheduler::instance() ) ); try { if ( n) @@ -162,7 +162,7 @@ public: // suspend this fiber // locked spinlock will be released if this fiber // was stored inside schedulers's waiting-queue - if ( ! detail::scheduler::instance()->wait_until( timeout_time, lk) ) + if ( ! fm_wait_until( detail::scheduler::instance(), timeout_time, lk) ) { // this fiber was not notified before timeout // lock spinlock again @@ -216,7 +216,7 @@ public: break; } // run scheduler - detail::scheduler::instance()->run(); + fm_run( detail::scheduler::instance() ); } // lock external again before returning diff --git a/include/boost/fiber/fss.hpp b/include/boost/fiber/fss.hpp index c5eac529..c331265e 100644 --- a/include/boost/fiber/fss.hpp +++ b/include/boost/fiber/fss.hpp @@ -62,16 +62,16 @@ public: ~fiber_specific_ptr() { - if ( detail::scheduler::instance()->active() ) - detail::scheduler::instance()->active()->set_fss_data( + if ( fm_active( detail::scheduler::instance() ) ) + fm_active( detail::scheduler::instance() )->set_fss_data( this, cleanup_fn_, 0, true); } T * get() const { - BOOST_ASSERT( detail::scheduler::instance()->active() ); + BOOST_ASSERT( fm_active( detail::scheduler::instance() ) ); - void * vp( detail::scheduler::instance()->active()->get_fss_data( this) ); + void * vp( fm_active( detail::scheduler::instance() )->get_fss_data( this) ); return static_cast< T * >( vp); } @@ -84,7 +84,7 @@ public: T * release() { T * tmp = get(); - detail::scheduler::instance()->active()->set_fss_data( + fm_active( detail::scheduler::instance() )->set_fss_data( this, cleanup_fn_, 0, false); return tmp; } @@ -93,7 +93,7 @@ public: { T * c = get(); if ( c != t) - detail::scheduler::instance()->active()->set_fss_data( + fm_active( detail::scheduler::instance() )->set_fss_data( this, cleanup_fn_, t, true); } }; diff --git a/include/boost/fiber/operations.hpp b/include/boost/fiber/operations.hpp index 6781d22f..3db9ab54 100644 --- a/include/boost/fiber/operations.hpp +++ b/include/boost/fiber/operations.hpp @@ -25,28 +25,28 @@ namespace this_fiber { inline fibers::fiber::id get_id() BOOST_NOEXCEPT { - return 0 != fibers::detail::scheduler::instance()->active() - ? fibers::detail::scheduler::instance()->active()->get_id() + return 0 != fibers::fm_active( fibers::detail::scheduler::instance() ) + ? fibers::fm_active( fibers::detail::scheduler::instance() )->get_id() : fibers::fiber::id(); } inline void yield() { - if ( 0 != fibers::detail::scheduler::instance()->active() ) - fibers::detail::scheduler::instance()->yield(); + if ( 0 != fibers::fm_active( fibers::detail::scheduler::instance() ) ) + fibers::fm_yield( fibers::detail::scheduler::instance() ); else - fibers::detail::scheduler::instance()->run(); + fibers::fm_run( fibers::detail::scheduler::instance() ); } inline void sleep_until( fibers::clock_type::time_point const& sleep_time) { - if ( 0 != fibers::detail::scheduler::instance()->active() ) + if ( 0 != fibers::fm_active( fibers::detail::scheduler::instance() ) ) { fibers::detail::spinlock splk; unique_lock< fibers::detail::spinlock > lk( splk); - fibers::detail::scheduler::instance()->wait_until( sleep_time, lk); + fibers::fm_wait_until( fibers::detail::scheduler::instance(), sleep_time, lk); // check if fiber was interrupted interruption_point(); @@ -54,7 +54,7 @@ void sleep_until( fibers::clock_type::time_point const& sleep_time) else { while ( fibers::clock_type::now() <= sleep_time) - fibers::detail::scheduler::instance()->run(); + fibers::fm_run( fibers::detail::scheduler::instance() ); } } @@ -65,16 +65,16 @@ void sleep_for( chrono::duration< Rep, Period > const& timeout_duration) inline bool thread_affinity() BOOST_NOEXCEPT { - return 0 != fibers::detail::scheduler::instance()->active() - ? fibers::detail::scheduler::instance()->active()->thread_affinity() + return 0 != fibers::fm_active( fibers::detail::scheduler::instance() ) + ? fibers::fm_active( fibers::detail::scheduler::instance() )->thread_affinity() : true; } inline void thread_affinity( bool req) BOOST_NOEXCEPT { - if ( 0 != fibers::detail::scheduler::instance()->active() ) - fibers::detail::scheduler::instance()->active()->thread_affinity( req); + if ( 0 != fibers::fm_active( fibers::detail::scheduler::instance() ) ) + fibers::fm_active( fibers::detail::scheduler::instance() )->thread_affinity( req); } } @@ -87,15 +87,15 @@ void set_scheduling_algorithm( sched_algorithm * al) template< typename Rep, typename Period > void set_wait_interval( chrono::duration< Rep, Period > const& wait_interval) BOOST_NOEXCEPT -{ detail::scheduler::instance()->wait_interval( wait_interval); } +{ fm_wait_interval( fibers::detail::scheduler::instance(), wait_interval); } template< typename Rep, typename Period > chrono::duration< Rep, Period > get_wait_interval() BOOST_NOEXCEPT -{ return detail::scheduler::instance()->wait_interval< Rep, Period >(); } +{ return fm_wait_interval< Rep, Period >( fibers::detail::scheduler::instance() ); } inline void migrate( fiber const& f) -{ fibers::detail::scheduler::instance()->migrate( detail::scheduler::extract( f ) ); } +{ fm_migrate( fibers::detail::scheduler::instance(), detail::scheduler::extract( f ) ); } }} diff --git a/src/detail/scheduler.cpp b/src/detail/scheduler.cpp index ad3b131b..9c505e47 100644 --- a/src/detail/scheduler.cpp +++ b/src/detail/scheduler.cpp @@ -36,7 +36,7 @@ scheduler::replace( sched_algorithm * other) { BOOST_ASSERT( other); - instance()->set_sched_algo( other); + fm_set_sched_algo( instance(), other); } }}} diff --git a/src/detail/spinlock.cpp b/src/detail/spinlock.cpp index a8a7fc67..0e070945 100644 --- a/src/detail/spinlock.cpp +++ b/src/detail/spinlock.cpp @@ -22,7 +22,7 @@ spinlock::spinlock() : void spinlock::lock() { - bool is_fiber = 0 != scheduler::instance()->active(); + bool is_fiber = 0 != fm_active( scheduler::instance() ); for (;;) { // access to CPU's cache @@ -32,8 +32,8 @@ spinlock::lock() { // busy-wait if ( is_fiber) - scheduler::instance()->yield(); - else + fm_yield( scheduler::instance() ); + else this_thread::yield(); } // state_ was released by other @@ -42,18 +42,6 @@ spinlock::lock() if ( UNLOCKED == state_.exchange( LOCKED) ) return; } -#if 0 - state_t expected = UNLOCKED; - while ( ! state_.compare_exchange_strong( expected, LOCKED) ) - { - // busy-wait - if ( is_fiber) - scheduler::instance()->yield(); - else - this_thread::yield(); - expected = UNLOCKED; - } -#endif } void diff --git a/src/fiber.cpp b/src/fiber.cpp index 36649d82..e4006f37 100644 --- a/src/fiber.cpp +++ b/src/fiber.cpp @@ -26,7 +26,7 @@ void fiber::start_fiber_() { impl_->set_ready(); - detail::scheduler::instance()->spawn( impl_); + fm_spawn( detail::scheduler::instance(), impl_); } int @@ -42,7 +42,7 @@ fiber::priority( int prio) BOOST_NOEXCEPT { BOOST_ASSERT( impl_); - detail::scheduler::instance()->priority( impl_, prio); + fm_priority( detail::scheduler::instance(), impl_, prio); } bool @@ -78,7 +78,7 @@ fiber::join() system::errc::invalid_argument, "boost fiber: fiber not joinable") ); } - detail::scheduler::instance()->join( impl_); + fm_join( detail::scheduler::instance(), impl_); detail::worker_fiber * tmp = 0; std::swap( tmp, impl_); diff --git a/src/fiber_manager.cpp b/src/fiber_manager.cpp index 271ea7da..ecba65d9 100644 --- a/src/fiber_manager.cpp +++ b/src/fiber_manager.cpp @@ -45,9 +45,9 @@ bool fetch_ready( detail::worker_fiber * f) fiber_manager::fiber_manager() BOOST_NOEXCEPT : def_algo_( new round_robin() ), sched_algo_( def_algo_.get() ), - fm->wqueue_(), + wqueue_(), wait_interval_( chrono::milliseconds( 10) ), - fm->active_fiber_( 0) + active_fiber_( 0) {} fiber_manager::~fiber_manager() BOOST_NOEXCEPT @@ -96,12 +96,12 @@ clock_type::time_point fm_next_wakeup( fiber_manager * fm) BOOST_ASSERT( fm); if ( fm->wqueue_.empty() ) - return clock_type::now() + wait_interval_; + return clock_type::now() + fm->wait_interval_; else { clock_type::time_point wakeup( fm->wqueue_.top()->time_point() ); if ( (clock_type::time_point::max)() == wakeup) - return clock_type::now() + wait_interval_; + return clock_type::now() + fm->wait_interval_; return wakeup; } } @@ -142,7 +142,7 @@ void fm_run( fiber_manager * fm) { // no fibers ready to run; the thread should sleep // until earliest fiber is scheduled to run - clock_type::time_point fm_wakeup( fm, next_wakeup() ); + clock_type::time_point wakeup( fm_next_wakeup( fm) ); this_thread::sleep_until( wakeup); } return; @@ -154,7 +154,7 @@ void fm_wait( fiber_manager * fm, unique_lock< detail::spinlock > & lk) { BOOST_ASSERT( fm); - wait_until( fm, clock_type::time_point( (clock_type::duration::max)() ), lk); + fm_wait_until( fm, clock_type::time_point( (clock_type::duration::max)() ), lk); } bool fm_wait_until( fiber_manager * fm, diff --git a/src/interruption.cpp b/src/interruption.cpp index c4587706..6ce4b373 100644 --- a/src/interruption.cpp +++ b/src/interruption.cpp @@ -23,40 +23,40 @@ namespace boost { namespace this_fiber { disable_interruption::disable_interruption() BOOST_NOEXCEPT : - set_( ( fibers::detail::scheduler::instance()->active()->interruption_blocked() ) ) + set_( ( fm_active( fibers::detail::scheduler::instance() )->interruption_blocked() ) ) { if ( ! set_) - fibers::detail::scheduler::instance()->active()->interruption_blocked( true); + fm_active( fibers::detail::scheduler::instance() )->interruption_blocked( true); } disable_interruption::~disable_interruption() BOOST_NOEXCEPT { if ( ! set_) - fibers::detail::scheduler::instance()->active()->interruption_blocked( false); + fm_active( fibers::detail::scheduler::instance() )->interruption_blocked( false); } restore_interruption::restore_interruption( disable_interruption & disabler) BOOST_NOEXCEPT : disabler_( disabler) { if ( ! disabler_.set_) - fibers::detail::scheduler::instance()->active()->interruption_blocked( false); + fm_active( fibers::detail::scheduler::instance() )->interruption_blocked( false); } restore_interruption::~restore_interruption() BOOST_NOEXCEPT { if ( ! disabler_.set_) - fibers::detail::scheduler::instance()->active()->interruption_blocked( true); + fm_active( fibers::detail::scheduler::instance() )->interruption_blocked( true); } bool interruption_enabled() BOOST_NOEXCEPT { - fibers::detail::worker_fiber * f = fibers::detail::scheduler::instance()->active(); + fibers::detail::worker_fiber * f = fm_active( fibers::detail::scheduler::instance() ); return 0 != f && ! f->interruption_blocked(); } bool interruption_requested() BOOST_NOEXCEPT { - fibers::detail::worker_fiber * f = fibers::detail::scheduler::instance()->active(); + fibers::detail::worker_fiber * f = fm_active( fibers::detail::scheduler::instance() ); if ( 0 == f) return false; return f->interruption_requested(); } @@ -65,7 +65,7 @@ void interruption_point() { if ( interruption_requested() && interruption_enabled() ) { - fibers::detail::scheduler::instance()->active()->request_interruption( false); + fm_active( fibers::detail::scheduler::instance() )->request_interruption( false); boost::throw_exception( fibers::fiber_interrupted() ); } } diff --git a/src/mutex.cpp b/src/mutex.cpp index e684b154..e4acc2cb 100644 --- a/src/mutex.cpp +++ b/src/mutex.cpp @@ -37,7 +37,7 @@ mutex::~mutex() void mutex::lock() { - detail::fiber_base * n( detail::scheduler::instance()->active() ); + detail::fiber_base * n( fm_active( detail::scheduler::instance() ) ); if ( 0 != n) { for (;;) @@ -57,7 +57,7 @@ mutex::lock() waiting_.push_back( n); // suspend this fiber - detail::scheduler::instance()->wait( lk); + fm_wait( detail::scheduler::instance(), lk); } } else @@ -86,7 +86,7 @@ mutex::lock() // wait until main-fiber gets notified while ( ! n->is_ready() ) // run scheduler - detail::scheduler::instance()->run(); + fm_run( detail::scheduler::instance() ); } } } diff --git a/src/recursive_mutex.cpp b/src/recursive_mutex.cpp index 52999707..b32a9690 100644 --- a/src/recursive_mutex.cpp +++ b/src/recursive_mutex.cpp @@ -39,7 +39,7 @@ recursive_mutex::~recursive_mutex() void recursive_mutex::lock() { - detail::fiber_base * n( detail::scheduler::instance()->active() ); + detail::fiber_base * n( fm_active( detail::scheduler::instance() ) ); if ( 0 != n) { for (;;) @@ -65,7 +65,7 @@ recursive_mutex::lock() waiting_.push_back( n); // suspend this fiber - detail::scheduler::instance()->wait( lk); + fm_wait( detail::scheduler::instance(), lk); } } else @@ -100,7 +100,7 @@ recursive_mutex::lock() // wait until main-fiber gets notified while ( ! n->is_ready() ) // run scheduler - detail::scheduler::instance()->run(); + fm_run( detail::scheduler::instance() ); } } } diff --git a/src/recursive_timed_mutex.cpp b/src/recursive_timed_mutex.cpp index 12346c49..3342b37d 100644 --- a/src/recursive_timed_mutex.cpp +++ b/src/recursive_timed_mutex.cpp @@ -39,7 +39,7 @@ recursive_timed_mutex::~recursive_timed_mutex() void recursive_timed_mutex::lock() { - detail::fiber_base * n( detail::scheduler::instance()->active() ); + detail::fiber_base * n( fm_active( detail::scheduler::instance() ) ); if ( 0 != n) { for (;;) @@ -65,7 +65,7 @@ recursive_timed_mutex::lock() waiting_.push_back( n); // suspend this fiber - detail::scheduler::instance()->wait( lk); + fm_wait( detail::scheduler::instance(), lk); } } else @@ -100,7 +100,7 @@ recursive_timed_mutex::lock() // wait until main-fiber gets notified while ( ! n->is_ready() ) // run scheduler - detail::scheduler::instance()->run(); + fm_run( detail::scheduler::instance() ); } } } @@ -135,7 +135,7 @@ recursive_timed_mutex::try_lock() bool recursive_timed_mutex::try_lock_until( clock_type::time_point const& timeout_time) { - detail::fiber_base * n( detail::scheduler::instance()->active() ); + detail::fiber_base * n( fm_active( detail::scheduler::instance() ) ); if ( n) { for (;;) @@ -164,7 +164,7 @@ recursive_timed_mutex::try_lock_until( clock_type::time_point const& timeout_tim waiting_.push_back( n); // suspend this fiber until notified or timed-out - if ( ! detail::scheduler::instance()->wait_until( timeout_time, lk) ) + if ( ! fm_wait_until( detail::scheduler::instance(), timeout_time, lk) ) { lk.lock(); // remove fiber from waiting-list @@ -220,7 +220,7 @@ recursive_timed_mutex::try_lock_until( clock_type::time_point const& timeout_tim return false; } // run scheduler - detail::scheduler::instance()->run(); + fm_run( detail::scheduler::instance() ); } } } diff --git a/src/timed_mutex.cpp b/src/timed_mutex.cpp index 2239175d..65b0727f 100644 --- a/src/timed_mutex.cpp +++ b/src/timed_mutex.cpp @@ -37,7 +37,7 @@ timed_mutex::~timed_mutex() void timed_mutex::lock() { - detail::fiber_base * n( detail::scheduler::instance()->active() ); + detail::fiber_base * n( fm_active( detail::scheduler::instance() ) ); if ( n) { for (;;) @@ -57,7 +57,7 @@ timed_mutex::lock() waiting_.push_back( n); // suspend this fiber - detail::scheduler::instance()->wait( lk); + fm_wait( detail::scheduler::instance(), lk); } } else @@ -86,7 +86,7 @@ timed_mutex::lock() // wait until main-fiber gets notified while ( ! n->is_ready() ) // run scheduler - detail::scheduler::instance()->run(); + fm_run( detail::scheduler::instance() ); } } } @@ -115,7 +115,7 @@ timed_mutex::try_lock() bool timed_mutex::try_lock_until( clock_type::time_point const& timeout_time) { - detail::fiber_base * n( detail::scheduler::instance()->active() ); + detail::fiber_base * n( fm_active( detail::scheduler::instance() ) ); if ( n) { for (;;) @@ -138,7 +138,7 @@ timed_mutex::try_lock_until( clock_type::time_point const& timeout_time) waiting_.push_back( n); // suspend this fiber until notified or timed-out - if ( ! detail::scheduler::instance()->wait_until( timeout_time, lk) ) + if ( ! fm_wait_until( detail::scheduler::instance(), timeout_time, lk) ) { lk.lock(); // remove fiber from waiting-list @@ -188,7 +188,7 @@ timed_mutex::try_lock_until( clock_type::time_point const& timeout_time) return false; } // run scheduler - detail::scheduler::instance()->run(); + fm_run( detail::scheduler::instance() ); } } }