Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r57658 - in sandbox/fiber: boost/fiber boost/fiber/detail libs/fiber/src libs/fiber/test
From: oliver.kowalke_at_[hidden]
Date: 2009-11-14 14:10:36


Author: olli
Date: 2009-11-14 14:10:35 EST (Sat, 14 Nov 2009)
New Revision: 57658
URL: http://svn.boost.org/trac/boost/changeset/57658

Log:
- priority()/priority( int) added + unit test

Added:
   sandbox/fiber/libs/fiber/test/test_priority.cpp (contents, props changed)
Text files modified:
   sandbox/fiber/boost/fiber/attributes.hpp | 6 +++---
   sandbox/fiber/boost/fiber/detail/scheduler_impl.hpp | 8 +++++++-
   sandbox/fiber/boost/fiber/fiber.hpp | 4 ++++
   sandbox/fiber/boost/fiber/scheduler.hpp | 10 ++++++++++
   sandbox/fiber/boost/fiber/utility.hpp | 8 ++++++++
   sandbox/fiber/libs/fiber/src/attributes.cpp | 4 ++--
   sandbox/fiber/libs/fiber/src/fiber.cpp | 18 ++++++++++++++++--
   sandbox/fiber/libs/fiber/src/scheduler.cpp | 24 ++++++++++++++++++++++++
   sandbox/fiber/libs/fiber/src/scheduler_impl.cpp | 40 +++++++++++++++++++++++++++++++++++++++-
   sandbox/fiber/libs/fiber/test/Jamfile.v2 | 1 +
   10 files changed, 114 insertions(+), 9 deletions(-)

Modified: sandbox/fiber/boost/fiber/attributes.hpp
==============================================================================
--- sandbox/fiber/boost/fiber/attributes.hpp (original)
+++ sandbox/fiber/boost/fiber/attributes.hpp 2009-11-14 14:10:35 EST (Sat, 14 Nov 2009)
@@ -20,7 +20,7 @@
 {
 private:
         std::size_t stacksize_;
- std::size_t priority_;
+ int priority_;
 
 public:
         attributes();
@@ -29,9 +29,9 @@
 
         std::size_t stack_size() const;
 
- void priority( std::size_t);
+ void priority( int);
 
- std::size_t priority() const;
+ int priority() const;
 };
 
 }}

Modified: sandbox/fiber/boost/fiber/detail/scheduler_impl.hpp
==============================================================================
--- sandbox/fiber/boost/fiber/detail/scheduler_impl.hpp (original)
+++ sandbox/fiber/boost/fiber/detail/scheduler_impl.hpp 2009-11-14 14:10:35 EST (Sat, 14 Nov 2009)
@@ -41,7 +41,7 @@
 
         void add_fiber( fiber);
 
- fiber::id active_fiber();
+ fiber::id active_fiber() const;
 
         void yield_active_fiber();
 
@@ -55,6 +55,12 @@
 
         void resume_fiber( fiber::id const&);
 
+ int priority( fiber::id const&);
+
+ void priority( fiber::id const&, int);
+
+ void re_schedule( fiber::id const&);
+
         bool run();
 
         bool empty();

Modified: sandbox/fiber/boost/fiber/fiber.hpp
==============================================================================
--- sandbox/fiber/boost/fiber/fiber.hpp (original)
+++ sandbox/fiber/boost/fiber/fiber.hpp 2009-11-14 14:10:35 EST (Sat, 14 Nov 2009)
@@ -188,6 +188,10 @@
 
         bool is_alive() const;
 
+ int priority() const;
+
+ void priority( int);
+
         void cancel();
 
         void suspend();

Modified: sandbox/fiber/boost/fiber/scheduler.hpp
==============================================================================
--- sandbox/fiber/boost/fiber/scheduler.hpp (original)
+++ sandbox/fiber/boost/fiber/scheduler.hpp 2009-11-14 14:10:35 EST (Sat, 14 Nov 2009)
@@ -30,6 +30,8 @@
 void yield();
 void cancel();
 void suspend();
+int priority();
+void priority( int);
 
 }
 
@@ -43,6 +45,8 @@
         friend void this_fiber::yield();
         friend void this_fiber::cancel();
         friend void this_fiber::suspend();
+ friend int this_fiber::priority();
+ friend void this_fiber::priority( int);
         friend class fiber;
 
         typedef thread_specific_ptr< detail::scheduler_impl > tss_impl_t;
@@ -65,6 +69,12 @@
 
         static void resume_fiber( fiber::id const&);
 
+ static int priority( fiber::id const&);
+
+ static void priority( fiber::id const&, int);
+
+ static void re_schedule( fiber::id const&);
+
         detail::scheduler_impl * access_();
 
 public:

Modified: sandbox/fiber/boost/fiber/utility.hpp
==============================================================================
--- sandbox/fiber/boost/fiber/utility.hpp (original)
+++ sandbox/fiber/boost/fiber/utility.hpp 2009-11-14 14:10:35 EST (Sat, 14 Nov 2009)
@@ -39,6 +39,14 @@
 void suspend()
 { fibers::scheduler::suspend_active_fiber(); }
 
+inline
+int priority()
+{ return fibers::scheduler::priority( get_id() ); }
+
+inline
+void priority( int prio)
+{ fibers::scheduler::priority( get_id(), prio); }
+
 }}
 
 #include <boost/config/abi_suffix.hpp>

Modified: sandbox/fiber/libs/fiber/src/attributes.cpp
==============================================================================
--- sandbox/fiber/libs/fiber/src/attributes.cpp (original)
+++ sandbox/fiber/libs/fiber/src/attributes.cpp 2009-11-14 14:10:35 EST (Sat, 14 Nov 2009)
@@ -31,10 +31,10 @@
 { return stacksize_; }
 
 void
-attributes::priority( std::size_t value)
+attributes::priority( int value)
 { priority_ = value; }
 
-std::size_t
+int
 attributes::priority() const
 { return priority_; }
 

Modified: sandbox/fiber/libs/fiber/src/fiber.cpp
==============================================================================
--- sandbox/fiber/libs/fiber/src/fiber.cpp (original)
+++ sandbox/fiber/libs/fiber/src/fiber.cpp 2009-11-14 14:10:35 EST (Sat, 14 Nov 2009)
@@ -104,11 +104,25 @@
 bool
 fiber::is_alive() const
 {
- if ( ! info_)
- throw fiber_moved();
+ if ( ! info_) throw fiber_moved();
         return ( info_->state & IS_ALIVE_BIT_MASK) != 0;
 }
 
+int
+fiber::priority() const
+{
+ if ( ! info_) throw fiber_moved();
+ return info_->attrs.priority();
+}
+
+void
+fiber::priority( int prio)
+{
+ if ( ! info_) throw fiber_moved();
+ info_->attrs.priority( prio);
+ if ( is_alive() ) scheduler::re_schedule( get_id() );
+}
+
 void
 fiber::cancel()
 { scheduler::cancel_fiber( get_id() ); }

Modified: sandbox/fiber/libs/fiber/src/scheduler.cpp
==============================================================================
--- sandbox/fiber/libs/fiber/src/scheduler.cpp (original)
+++ sandbox/fiber/libs/fiber/src/scheduler.cpp 2009-11-14 14:10:35 EST (Sat, 14 Nov 2009)
@@ -77,6 +77,30 @@
         impl->resume_fiber( f_id);
 }
 
+int
+scheduler::priority( fiber::id const& f_id)
+{
+ detail::scheduler_impl * impl( impl_.get() );
+ if ( ! impl) throw fiber_error("not a fiber");
+ return impl->priority( f_id);
+}
+
+void
+scheduler::priority( fiber::id const& f_id, int prio)
+{
+ detail::scheduler_impl * impl( impl_.get() );
+ if ( ! impl) throw fiber_error("not a fiber");
+ impl->priority( f_id, prio);
+ re_schedule( f_id);
+}
+
+void
+scheduler::re_schedule( fiber::id const& f_id)
+{
+ detail::scheduler_impl * impl( impl_.get() );
+ impl->re_schedule( f_id);
+}
+
 detail::scheduler_impl *
 scheduler::access_()
 {

Modified: sandbox/fiber/libs/fiber/src/scheduler_impl.cpp
==============================================================================
--- sandbox/fiber/libs/fiber/src/scheduler_impl.cpp (original)
+++ sandbox/fiber/libs/fiber/src/scheduler_impl.cpp 2009-11-14 14:10:35 EST (Sat, 14 Nov 2009)
@@ -67,7 +67,7 @@
 }
 
 fiber::id
-scheduler_impl::active_fiber()
+scheduler_impl::active_fiber() const
 { return f_id_; }
 
 void
@@ -196,6 +196,44 @@
         }
 }
 
+int
+scheduler_impl::priority( fiber::id const& f_id)
+{
+ container::iterator i = fibers_.find( f_id);
+ if ( i == fibers_.end() ) throw scheduler_error("fiber not found");
+ fiber f( i->second);
+ BOOST_ASSERT( f);
+ BOOST_ASSERT( ! HAS_STATE_MASTER( f.info_->state) );
+
+ return f.info_->attrs.priority();
+}
+
+void
+scheduler_impl::priority( fiber::id const& f_id, int prio)
+{
+ container::iterator i = fibers_.find( f_id);
+ if ( i == fibers_.end() ) throw scheduler_error("fiber not found");
+ fiber f( i->second);
+ BOOST_ASSERT( f);
+ BOOST_ASSERT( ! HAS_STATE_MASTER( f.info_->state) );
+
+ f.info_->attrs.priority( prio);
+ re_schedule( f_id);
+}
+
+void
+scheduler_impl::re_schedule( fiber::id const& f_id)
+{
+ container::iterator i = fibers_.find( f_id);
+ if ( i == fibers_.end() ) return;
+ fiber f( i->second);
+ BOOST_ASSERT( f);
+ BOOST_ASSERT( ! HAS_STATE_MASTER( f.info_->state) );
+
+ // TODO: re-schedule fiber == remove from
+ // runnable_fibers + re-insert
+}
+
 bool
 scheduler_impl::run()
 {

Modified: sandbox/fiber/libs/fiber/test/Jamfile.v2
==============================================================================
--- sandbox/fiber/libs/fiber/test/Jamfile.v2 (original)
+++ sandbox/fiber/libs/fiber/test/Jamfile.v2 2009-11-14 14:10:35 EST (Sat, 14 Nov 2009)
@@ -30,6 +30,7 @@
     [ fiber-test test_utility ]
     [ fiber-test test_cancel ]
     [ fiber-test test_suspended ]
+ [ fiber-test test_priority ]
     [ fiber-test test_mutex ]
     [ fiber-test test_auto_reset_event ]
     [ fiber-test test_manual_reset_event ]

Added: sandbox/fiber/libs/fiber/test/test_priority.cpp
==============================================================================
--- (empty file)
+++ sandbox/fiber/libs/fiber/test/test_priority.cpp 2009-11-14 14:10:35 EST (Sat, 14 Nov 2009)
@@ -0,0 +1,39 @@
+
+// Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#include <sstream>
+#include <string>
+
+#include <boost/test/unit_test.hpp>
+#include <boost/utility.hpp>
+
+#include <boost/fiber.hpp>
+
+
+void zero_args_fn()
+{}
+
+void test_case_1()
+{
+ boost::fiber f( zero_args_fn);
+ BOOST_CHECK_EQUAL( 0, f.priority() );
+
+ f.priority( 5);
+ BOOST_CHECK_EQUAL( 5, f.priority() );
+
+ f.priority( -5);
+ BOOST_CHECK_EQUAL( -5, f.priority() );
+}
+
+boost::unit_test::test_suite * init_unit_test_suite( int, char* [])
+{
+ boost::unit_test::test_suite * test =
+ BOOST_TEST_SUITE("Boost.Fiber: priority test suite");
+
+ test->add( BOOST_TEST_CASE( & test_case_1) );
+
+ return test;
+}


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk