2
0
mirror of https://github.com/boostorg/fiber.git synced 2026-02-19 02:12:24 +00:00

update asio integration example

This commit is contained in:
Oliver Kowalke
2016-01-31 16:48:04 +01:00
parent 284bdf6f78
commit 3ac9dde4d0
2 changed files with 21 additions and 36 deletions

View File

@@ -118,14 +118,13 @@ int main( int argc, char* argv[]) {
std::cout << "fiber " << id << " : shutdown" << std::endl;
// stop io_service
io_svc.stop();
// interrupt acceptor fiber
// interrupt
f.interrupt();
f.detach();
std::cout << "fiber " << id << " terminates" << std::endl;
}).detach();
// run io_service
//io_svc.run();
boost::fibers::asio::run( io_svc);
f.join();
io_svc.run();
std::cout << "fiber " << id << " (main-fiber) terminates" << std::endl;
std::cout << "done." << std::endl;
return EXIT_SUCCESS;

View File

@@ -43,7 +43,6 @@ public:
struct service : public boost::asio::io_service::service {
static boost::asio::io_service::id id;
round_robin * rr{ nullptr };
std::unique_ptr< boost::asio::io_service::work > work_{};
service( boost::asio::io_service & io_svc) :
@@ -54,21 +53,8 @@ public:
service( service const&) = delete;
service & operator=( service const&) = delete;
bool has_ready_fibers() const noexcept {
return rr->has_ready_fibers();
}
void poll() {
// block this fiber till all pending (ready) fibers are processed
// == round_robin::suspend_until() has been called
std::unique_lock< boost::fibers::mutex > lk( rr->mtx_);
rr->cnd_.wait( lk);
}
void shutdown_service() override final {
work_.reset();
std::unique_lock< boost::fibers::mutex > lk( rr->mtx_);
rr->cnd_.notify_all();
}
};
@@ -76,7 +62,24 @@ public:
io_svc_( io_svc),
suspend_timer_( io_svc_) {
boost::asio::add_service< service >( io_svc_, new service( io_svc_) );
boost::asio::use_service< service >( io_svc_).rr = this;
io_svc_.post([this]() mutable {
while ( ! io_svc_.stopped() ) {
if ( has_ready_fibers() ) {
// run all pending handlers in round_robin
while ( io_svc_.poll() );
// block this fiber till all pending (ready) fibers are processed
// == round_robin::suspend_until() has been called
std::unique_lock< boost::fibers::mutex > lk( mtx_);
cnd_.wait( lk);
} else {
// run one handler inside io_service
// if no handler available, block this thread
if ( ! io_svc_.run_one() ) {
break;
}
}
}
});
}
void awakened( boost::fibers::context * ctx) noexcept {
@@ -123,23 +126,6 @@ public:
boost::asio::io_service::id round_robin::service::id;
void run( boost::asio::io_service & io_svc) {
BOOST_ASSERT( boost::asio::has_service< round_robin::service >( io_svc) );
while ( ! io_svc.stopped() ) {
if ( boost::asio::use_service< round_robin::service >( io_svc).has_ready_fibers() ) {
// run all pending handlers in round_robin
while ( io_svc.poll() );
boost::asio::use_service< round_robin::service >( io_svc).poll();
} else {
// run one handler inside io_service
// if no handler available, block this thread
if ( ! io_svc.run_one() ) {
break;
}
}
}
}
}}}
#ifdef BOOST_HAS_ABI_HEADERS