|
Revision 20010, 2.7 kB
(checked in by aronb, 1 year ago)
|
Change clustering to be single threaded. This uses a Reactor to do a select on
all sockets.
|
- Property svn:eol-style set to
native
|
| Line | |
|---|
| 1 |
|
|---|
| 2 |
|
|---|
| 3 |
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 |
|
|---|
| 7 |
|
|---|
| 8 |
|
|---|
| 9 |
|
|---|
| 10 |
|
|---|
| 11 |
|
|---|
| 12 |
|
|---|
| 13 |
|
|---|
| 14 |
|
|---|
| 15 |
|
|---|
| 16 |
|
|---|
| 17 |
|
|---|
| 18 |
|
|---|
| 19 |
|
|---|
| 20 |
|
|---|
| 21 |
|
|---|
| 22 |
|
|---|
| 23 |
|
|---|
| 24 |
|
|---|
| 25 |
|
|---|
| 26 |
|
|---|
| 27 |
|
|---|
| 28 |
|
|---|
| 29 |
|
|---|
| 30 |
|
|---|
| 31 |
|
|---|
| 32 |
|
|---|
| 33 |
#include <gadget/gadgetConfig.h> |
|---|
| 34 |
|
|---|
| 35 |
#include <gadget/Node.h> |
|---|
| 36 |
#include <gadget/Reactor.h> |
|---|
| 37 |
|
|---|
| 38 |
|
|---|
| 39 |
namespace gadget |
|---|
| 40 |
{ |
|---|
| 41 |
|
|---|
| 42 |
void Reactor::addNode(gadget::Node* node) |
|---|
| 43 |
{ |
|---|
| 44 |
vpr::IOSys::Handle handle = node->getSockStream()->getHandle(); |
|---|
| 45 |
|
|---|
| 46 |
if ( mDemuxTable.find(handle) == mDemuxTable.end() ) |
|---|
| 47 |
{ |
|---|
| 48 |
mDemuxTable[handle] = node; |
|---|
| 49 |
mSelector.addHandle(handle); |
|---|
| 50 |
mSelector.setIn(handle, vpr::Selector::Read); |
|---|
| 51 |
} |
|---|
| 52 |
} |
|---|
| 53 |
|
|---|
| 54 |
void Reactor::removeNode(gadget::Node* node) |
|---|
| 55 |
{ |
|---|
| 56 |
vpr::IOSys::Handle handle = node->getSockStream()->getHandle(); |
|---|
| 57 |
|
|---|
| 58 |
typedef std::map<vpr::IOSys::Handle, gadget::Node*>::iterator iter_t; |
|---|
| 59 |
iter_t i = mDemuxTable.find(handle); |
|---|
| 60 |
|
|---|
| 61 |
if ( i != mDemuxTable.end() ) |
|---|
| 62 |
{ |
|---|
| 63 |
mDemuxTable.erase(i); |
|---|
| 64 |
mSelector.removeHandle(handle); |
|---|
| 65 |
} |
|---|
| 66 |
} |
|---|
| 67 |
|
|---|
| 68 |
std::vector<gadget::Node*> Reactor::getReadyNodes(const vpr::Interval& timeout) |
|---|
| 69 |
{ |
|---|
| 70 |
vpr::Uint16 num_events(0); |
|---|
| 71 |
mSelector.select(num_events, timeout); |
|---|
| 72 |
|
|---|
| 73 |
std::vector<gadget::Node*> ready_nodes; |
|---|
| 74 |
|
|---|
| 75 |
if ( num_events > 0 ) |
|---|
| 76 |
{ |
|---|
| 77 |
ready_nodes.reserve(num_events); |
|---|
| 78 |
|
|---|
| 79 |
for ( vpr::Uint16 i = 0; i < mSelector.getNumHandles(); ++i ) |
|---|
| 80 |
{ |
|---|
| 81 |
vpr::IOSys::Handle h = mSelector.getHandle(i); |
|---|
| 82 |
const vpr::Uint16 event_mask = mSelector.getOut(h); |
|---|
| 83 |
|
|---|
| 84 |
if ( 0 != event_mask ) |
|---|
| 85 |
{ |
|---|
| 86 |
ready_nodes.push_back(mDemuxTable[h]); |
|---|
| 87 |
} |
|---|
| 88 |
} |
|---|
| 89 |
} |
|---|
| 90 |
|
|---|
| 91 |
return ready_nodes; |
|---|
| 92 |
} |
|---|
| 93 |
|
|---|
| 94 |
} |
|---|