initial implementation
This commit is contained in:
commit
532d48529f
29 changed files with 2329 additions and 0 deletions
88
src/reactor/PollingReactor.cpp
Normal file
88
src/reactor/PollingReactor.cpp
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
/* @file PollingReactor.cpp */
|
||||
|
||||
#include "PollingReactor.hpp"
|
||||
|
||||
namespace xo {
|
||||
using ref::brw;
|
||||
using std::size_t;
|
||||
using std::uint64_t;
|
||||
using std::int64_t;
|
||||
|
||||
namespace reactor {
|
||||
bool
|
||||
PollingReactor::add_source(brw<ReactorSource> src)
|
||||
{
|
||||
/* make sure src does not already appear in .source_v[] */
|
||||
for(ReactorSourcePtr const & x : this->source_v_) {
|
||||
if(x.get() == src.get()) {
|
||||
throw std::runtime_error("PollingReactor::add_source; source already present");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
src->notify_reactor_add(this);
|
||||
|
||||
this->source_v_.push_back(src.get());
|
||||
|
||||
return true;
|
||||
} /*add_source*/
|
||||
|
||||
bool
|
||||
PollingReactor::remove_source(brw<ReactorSource> src)
|
||||
{
|
||||
auto ix = std::find(this->source_v_.begin(),
|
||||
this->source_v_.end(),
|
||||
src);
|
||||
|
||||
if(ix != this->source_v_.end()) {
|
||||
src->notify_reactor_remove(this);
|
||||
|
||||
this->source_v_.erase(ix);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
} /*remove_source*/
|
||||
|
||||
int64_t
|
||||
PollingReactor::find_nonempty_source(size_t start_ix)
|
||||
{
|
||||
size_t z = this->source_v_.size();
|
||||
|
||||
/* search sources [ix .. z) */
|
||||
for(size_t ix = start_ix; ix < z; ++ix) {
|
||||
brw<ReactorSource> src = this->source_v_[ix];
|
||||
|
||||
if(src->is_nonempty())
|
||||
return ix;
|
||||
}
|
||||
|
||||
/* search source [0 .. ix) */
|
||||
for(size_t ix = 0, n = std::min(start_ix, z); ix < n; ++ix) {
|
||||
brw<ReactorSource> src = this->source_v_[ix];
|
||||
|
||||
if(src->is_nonempty())
|
||||
return ix;
|
||||
}
|
||||
|
||||
return -1;
|
||||
} /*find_nonempty_source*/
|
||||
|
||||
uint64_t
|
||||
PollingReactor::run_one()
|
||||
{
|
||||
int64_t ix = this->find_nonempty_source(this->next_ix_);
|
||||
|
||||
if(ix >= 0) {
|
||||
brw<ReactorSource> src = this->source_v_[ix];
|
||||
|
||||
return src->deliver_one();
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} /*run_one*/
|
||||
} /*namespace reactor*/
|
||||
} /*namespace xo*/
|
||||
|
||||
/* end PollingReactor.cpp */
|
||||
Loading…
Add table
Add a link
Reference in a new issue