peer update
git-svn-id: svn://db.shs.com.ru/pip@28 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -356,9 +356,9 @@ void PIScreen::key_event(PIKbdListener::KeyEvent key) {
|
||||
|
||||
|
||||
bool PIScreen::nextFocus(PIScreenTile * rt, PIKbdListener::KeyEvent key) {
|
||||
PIVector<PIScreenTile*> tl = rt->children(), ftl;
|
||||
piForeach (PIScreenTile * t, tl) {
|
||||
if (t->focus_flags[CanHasFocus] && t->visible)
|
||||
PIVector<PIScreenTile*> vtl = rt->children(true), ftl;
|
||||
piForeach (PIScreenTile * t, vtl) {
|
||||
if (t->focus_flags[CanHasFocus])
|
||||
ftl << t;
|
||||
}
|
||||
int ind = -1;
|
||||
@@ -385,14 +385,17 @@ bool PIScreen::nextFocus(PIScreenTile * rt, PIKbdListener::KeyEvent key) {
|
||||
}
|
||||
}
|
||||
//piCout << ftl.size() << ind << next;
|
||||
if (next != 0 && !ftl.isEmpty()) {
|
||||
if (next != 0) {
|
||||
PIVector<PIScreenTile*> tl = rt->children();
|
||||
piForeach (PIScreenTile * t, tl)
|
||||
t->has_focus = false;
|
||||
ind += next;
|
||||
if (ind >= ftl.size_s()) ind = 0;
|
||||
if (ind < 0) ind = ftl.size_s() - 1;
|
||||
tile_focus = ftl[ind];
|
||||
tile_focus->has_focus = true;
|
||||
if (!ftl.isEmpty()) {
|
||||
ind += next;
|
||||
if (ind >= ftl.size_s()) ind = 0;
|
||||
if (ind < 0) ind = ftl.size_s() - 1;
|
||||
tile_focus = ftl[ind];
|
||||
tile_focus->has_focus = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,10 +101,11 @@ void PIScreenTile::removeTile(PIScreenTile * t) {
|
||||
}
|
||||
|
||||
|
||||
PIVector<PIScreenTile * > PIScreenTile::children() {
|
||||
PIVector<PIScreenTile * > PIScreenTile::children(bool only_visible) {
|
||||
PIVector<PIScreenTile * > ret;
|
||||
piForeach (PIScreenTile * t, tiles)
|
||||
ret << t << t->children();
|
||||
if (t->visible || !only_visible)
|
||||
ret << t << t->children(only_visible);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ public:
|
||||
void takeTile(PIScreenTile * t);
|
||||
void removeTile(PIScreenTile * t);
|
||||
PIScreenTile * parentTile() const {return parent;}
|
||||
PIVector<PIScreenTile * > children();
|
||||
PIVector<PIScreenTile * > children(bool only_visible = false);
|
||||
void show() {visible = true;}
|
||||
void hide() {visible = false;}
|
||||
void setFocus();
|
||||
|
||||
@@ -213,8 +213,8 @@ void PIPeer::destroyMBcasts() {
|
||||
PIPeer::PeerInfo * PIPeer::quickestPeer(const PIString & to) {
|
||||
if (!peers_map.contains(to)) return 0;
|
||||
//piCout << "*** search quickest peer" << to;
|
||||
PIVector<PeerInfo * > tp = addresses_map[to];
|
||||
PeerInfo * dp = 0;
|
||||
PIVector<PeerInfo * > tp = addresses_map.value(to);
|
||||
/*PeerInfo * dp = 0;
|
||||
int mping = 0x7FFFFFFF;
|
||||
for (int i = 0; i < tp.size_s(); ++i) {
|
||||
int p = tp[i]->ping();
|
||||
@@ -224,7 +224,9 @@ PIPeer::PeerInfo * PIPeer::quickestPeer(const PIString & to) {
|
||||
}
|
||||
}
|
||||
//piCout << "*** search quickest peer: found" << (dp ? dp->name : "0");
|
||||
return dp;
|
||||
return dp;*/
|
||||
if (tp.isEmpty()) return 0;
|
||||
return tp.back();
|
||||
}
|
||||
|
||||
|
||||
@@ -388,6 +390,7 @@ bool PIPeer::mbcastRead(uchar * data, int size) {
|
||||
pi.addNeighbour(self_info.name);
|
||||
self_info.addNeighbour(pi.name);
|
||||
}
|
||||
pi.resetPing();
|
||||
peers << pi;
|
||||
buildMap();
|
||||
//piCoutObj << "new peer \"" << pi.name << "\"" << " dist " << pi.dist;
|
||||
@@ -459,6 +462,7 @@ bool PIPeer::mbcastRead(uchar * data, int size) {
|
||||
}
|
||||
if (exist || isRemoved(rpeer)) continue;
|
||||
rpeer.dist++;
|
||||
rpeer.resetPing();
|
||||
peers << rpeer;
|
||||
ch = true;
|
||||
peerConnected(rpeer.name);
|
||||
@@ -548,6 +552,7 @@ void PIPeer::pingNeighbours() {
|
||||
if (a.wait_ping) {
|
||||
if ((PISystemTime::current(true) - a.last_ping).abs().toSeconds() <= 5.)
|
||||
continue;
|
||||
a.ping = -1.;
|
||||
}
|
||||
a.wait_ping = true;
|
||||
sba = ba;
|
||||
@@ -604,20 +609,59 @@ void PIPeer::buildMap() {
|
||||
//piCout << "[PIPeer \"" + name_ + "\"] buildMap";
|
||||
peers_map.clear();
|
||||
addresses_map.clear();
|
||||
piForeach (PeerInfo & i, peers)
|
||||
piForeach (PeerInfo & i, peers) {
|
||||
i.trace = -1;
|
||||
peers_map[i.name] = &i;
|
||||
return;
|
||||
int max_dist = -1;
|
||||
PIMap<PIString, PeerInfo * > peers_;
|
||||
}
|
||||
PIVector<PeerInfo * > cwave, nwave;
|
||||
int cwi = 0;
|
||||
self_info.trace = 0;
|
||||
cwave << &self_info;
|
||||
while (!cwave.isEmpty()) {
|
||||
nwave.clear();
|
||||
++cwi;
|
||||
piForeachC (PeerInfo * p, cwave) {
|
||||
piForeachC (PIString & nn, p->neighbours) {
|
||||
PeerInfo * np = peers_map.value(nn);
|
||||
if (!np) continue;
|
||||
if (np->trace >= 0) continue;
|
||||
np->trace = cwi;
|
||||
nwave << np;
|
||||
}
|
||||
}
|
||||
cwave = nwave;
|
||||
}
|
||||
PIVector<PeerInfo * > cpath;
|
||||
piForeach (PeerInfo & c, peers) {
|
||||
cpath.clear();
|
||||
cpath << &c;
|
||||
cwave << &c;
|
||||
for (int w = c.trace - 1; w >= 0; --w) {
|
||||
nwave.clear();
|
||||
piForeachC (PeerInfo * p, cwave) {
|
||||
piForeachC (PIString & nn, p->neighbours) {
|
||||
PeerInfo * np = peers_map.value(nn);
|
||||
if (!np) continue;
|
||||
if (np->trace != w) continue;
|
||||
cpath << np;
|
||||
nwave << np;
|
||||
}
|
||||
}
|
||||
cwave = nwave;
|
||||
}
|
||||
addresses_map[c.name] = cpath;
|
||||
//piCout << "map" << c.name << "=" << cpath;
|
||||
}
|
||||
/*int max_dist = -1;
|
||||
self_info._nuses.resize(self_info.neighbours.size());
|
||||
self_info._nuses.fill(0);
|
||||
self_info._first = &self_info;
|
||||
peers_[self_info.name] = &self_info;
|
||||
peers_map[self_info.name] = &self_info;
|
||||
piForeach (PeerInfo & i, peers) {
|
||||
i._nuses.resize(i.neighbours.size());
|
||||
i._nuses.fill(0);
|
||||
i._first = 0;
|
||||
peers_[i.name] = &i;
|
||||
peers_map[i.name] = &i;
|
||||
if (max_dist < i.dist)
|
||||
max_dist = i.dist;
|
||||
if (i.dist > 0) continue;
|
||||
@@ -662,7 +706,7 @@ void PIPeer::buildMap() {
|
||||
for (int n = 0; n < ns; ++n) {
|
||||
if (p->_nuses[n] >= ns) continue;
|
||||
p->_nuses[n]++;
|
||||
npeer = peers_[p->neighbours[n]];
|
||||
npeer = peers_map[p->neighbours[n]];
|
||||
if (npeer == 0) continue;
|
||||
if (d == 0) npeer->_first = npeer;
|
||||
else {
|
||||
@@ -684,7 +728,7 @@ void PIPeer::buildMap() {
|
||||
if (!pl.contains(cwave[i]->_first))
|
||||
pl << cwave[i]->_first;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
/*piCout << " ** addresses map **";
|
||||
piForeachC (napair & i, addresses_map)
|
||||
piCout << i.first << i.second;
|
||||
|
||||
@@ -51,7 +51,7 @@ public:
|
||||
friend PIByteArray & operator <<(PIByteArray & s, const PIPeer::PeerInfo & v);
|
||||
friend PIByteArray & operator >>(PIByteArray & s, PIPeer::PeerInfo & v);
|
||||
public:
|
||||
PeerInfo() {dist = sync = cnt = 0; _neth = 0; _first = 0; was_update = false;}
|
||||
PeerInfo() {dist = sync = cnt = 0; trace = -1; was_update = false;}
|
||||
|
||||
struct Address {
|
||||
Address(const PIString & a = PIString(), const PIString & m = "255.255.255.0");
|
||||
@@ -76,16 +76,14 @@ public:
|
||||
void addNeighbour(const PIString & n) {if (!neighbours.contains(n)) neighbours << n;}
|
||||
void addNeighbours(const PIStringList & l) {piForeachC (PIString & n, l) if (!neighbours.contains(n)) neighbours << n;}
|
||||
void removeNeighbour(const PIString & n) {neighbours.removeAll(n);}
|
||||
void resetPing() {for (int i = 0; i < addresses.size_s(); ++i) addresses[i].ping = -1;}
|
||||
|
||||
|
||||
PIString nearest_address;
|
||||
PIStringList neighbours;
|
||||
int sync, cnt;
|
||||
int sync, cnt, trace;
|
||||
bool was_update;
|
||||
PISystemTime time;
|
||||
PIString _naddress;
|
||||
PIEthernet * _neth;
|
||||
PIVector<uchar> _nuses;
|
||||
PeerInfo * _first;
|
||||
PeerData _data;
|
||||
|
||||
};
|
||||
@@ -119,8 +117,8 @@ public:
|
||||
const PeerInfo & selfInfo() const {return self_info;}
|
||||
const PIMap<PIString, PIVector<PeerInfo * > > & _peerMap() const {return addresses_map;}
|
||||
|
||||
void lock() {mc_mutex.lock(); eth_mutex.lock(); peers_mutex.lock();}
|
||||
void unlock() {mc_mutex.unlock(); eth_mutex.unlock(); peers_mutex.unlock();}
|
||||
void lock() {mc_mutex.lock(); peers_mutex.lock();}
|
||||
void unlock() {mc_mutex.unlock(); peers_mutex.unlock();}
|
||||
|
||||
EVENT2(dataReceivedEvent, const PIString &, from, const PIByteArray &, data);
|
||||
EVENT1(peerConnectedEvent, const PIString &, name);
|
||||
|
||||
@@ -128,8 +128,8 @@ public:
|
||||
addrs_tl->content.clear();
|
||||
peerinfo_tl->content.clear();
|
||||
peermap_tl->content.clear();
|
||||
peers_tl->content << TileList::Row("this | 0 | 0 |" + PIString::fromNumber(daemon_.allPeers().size_s()) +
|
||||
"," + PIString::fromNumber(cur_peer)
|
||||
peers_tl->content << TileList::Row("this | 0 | 0 | " + PIString::fromNumber(daemon_.allPeers().size_s()) +
|
||||
", " + PIString::fromNumber(cur_peer)
|
||||
, CellFormat());
|
||||
piForeachC(PIPeer::PeerInfo &p , daemon_.allPeers())
|
||||
peers_tl->content << TileList::Row(p.name + " | " + PIString::fromNumber(p.dist) +
|
||||
|
||||
Reference in New Issue
Block a user