peer update

git-svn-id: svn://db.shs.com.ru/pip@28 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
2015-03-16 14:49:23 +00:00
parent e50bedc5ef
commit 6498313fdd
6 changed files with 79 additions and 33 deletions

View File

@@ -356,9 +356,9 @@ void PIScreen::key_event(PIKbdListener::KeyEvent key) {
bool PIScreen::nextFocus(PIScreenTile * rt, PIKbdListener::KeyEvent key) { bool PIScreen::nextFocus(PIScreenTile * rt, PIKbdListener::KeyEvent key) {
PIVector<PIScreenTile*> tl = rt->children(), ftl; PIVector<PIScreenTile*> vtl = rt->children(true), ftl;
piForeach (PIScreenTile * t, tl) { piForeach (PIScreenTile * t, vtl) {
if (t->focus_flags[CanHasFocus] && t->visible) if (t->focus_flags[CanHasFocus])
ftl << t; ftl << t;
} }
int ind = -1; int ind = -1;
@@ -385,14 +385,17 @@ bool PIScreen::nextFocus(PIScreenTile * rt, PIKbdListener::KeyEvent key) {
} }
} }
//piCout << ftl.size() << ind << next; //piCout << ftl.size() << ind << next;
if (next != 0 && !ftl.isEmpty()) { if (next != 0) {
PIVector<PIScreenTile*> tl = rt->children();
piForeach (PIScreenTile * t, tl) piForeach (PIScreenTile * t, tl)
t->has_focus = false; t->has_focus = false;
ind += next; if (!ftl.isEmpty()) {
if (ind >= ftl.size_s()) ind = 0; ind += next;
if (ind < 0) ind = ftl.size_s() - 1; if (ind >= ftl.size_s()) ind = 0;
tile_focus = ftl[ind]; if (ind < 0) ind = ftl.size_s() - 1;
tile_focus->has_focus = true; tile_focus = ftl[ind];
tile_focus->has_focus = true;
}
return true; return true;
} }
} }

View File

@@ -101,10 +101,11 @@ void PIScreenTile::removeTile(PIScreenTile * t) {
} }
PIVector<PIScreenTile * > PIScreenTile::children() { PIVector<PIScreenTile * > PIScreenTile::children(bool only_visible) {
PIVector<PIScreenTile * > ret; PIVector<PIScreenTile * > ret;
piForeach (PIScreenTile * t, tiles) piForeach (PIScreenTile * t, tiles)
ret << t << t->children(); if (t->visible || !only_visible)
ret << t << t->children(only_visible);
return ret; return ret;
} }

View File

@@ -38,7 +38,7 @@ public:
void takeTile(PIScreenTile * t); void takeTile(PIScreenTile * t);
void removeTile(PIScreenTile * t); void removeTile(PIScreenTile * t);
PIScreenTile * parentTile() const {return parent;} PIScreenTile * parentTile() const {return parent;}
PIVector<PIScreenTile * > children(); PIVector<PIScreenTile * > children(bool only_visible = false);
void show() {visible = true;} void show() {visible = true;}
void hide() {visible = false;} void hide() {visible = false;}
void setFocus(); void setFocus();

View File

@@ -213,8 +213,8 @@ void PIPeer::destroyMBcasts() {
PIPeer::PeerInfo * PIPeer::quickestPeer(const PIString & to) { PIPeer::PeerInfo * PIPeer::quickestPeer(const PIString & to) {
if (!peers_map.contains(to)) return 0; if (!peers_map.contains(to)) return 0;
//piCout << "*** search quickest peer" << to; //piCout << "*** search quickest peer" << to;
PIVector<PeerInfo * > tp = addresses_map[to]; PIVector<PeerInfo * > tp = addresses_map.value(to);
PeerInfo * dp = 0; /*PeerInfo * dp = 0;
int mping = 0x7FFFFFFF; int mping = 0x7FFFFFFF;
for (int i = 0; i < tp.size_s(); ++i) { for (int i = 0; i < tp.size_s(); ++i) {
int p = tp[i]->ping(); 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"); //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); pi.addNeighbour(self_info.name);
self_info.addNeighbour(pi.name); self_info.addNeighbour(pi.name);
} }
pi.resetPing();
peers << pi; peers << pi;
buildMap(); buildMap();
//piCoutObj << "new peer \"" << pi.name << "\"" << " dist " << pi.dist; //piCoutObj << "new peer \"" << pi.name << "\"" << " dist " << pi.dist;
@@ -459,6 +462,7 @@ bool PIPeer::mbcastRead(uchar * data, int size) {
} }
if (exist || isRemoved(rpeer)) continue; if (exist || isRemoved(rpeer)) continue;
rpeer.dist++; rpeer.dist++;
rpeer.resetPing();
peers << rpeer; peers << rpeer;
ch = true; ch = true;
peerConnected(rpeer.name); peerConnected(rpeer.name);
@@ -548,6 +552,7 @@ void PIPeer::pingNeighbours() {
if (a.wait_ping) { if (a.wait_ping) {
if ((PISystemTime::current(true) - a.last_ping).abs().toSeconds() <= 5.) if ((PISystemTime::current(true) - a.last_ping).abs().toSeconds() <= 5.)
continue; continue;
a.ping = -1.;
} }
a.wait_ping = true; a.wait_ping = true;
sba = ba; sba = ba;
@@ -604,20 +609,59 @@ void PIPeer::buildMap() {
//piCout << "[PIPeer \"" + name_ + "\"] buildMap"; //piCout << "[PIPeer \"" + name_ + "\"] buildMap";
peers_map.clear(); peers_map.clear();
addresses_map.clear(); addresses_map.clear();
piForeach (PeerInfo & i, peers) piForeach (PeerInfo & i, peers) {
i.trace = -1;
peers_map[i.name] = &i; peers_map[i.name] = &i;
return; }
int max_dist = -1; PIVector<PeerInfo * > cwave, nwave;
PIMap<PIString, PeerInfo * > peers_; 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.resize(self_info.neighbours.size());
self_info._nuses.fill(0); self_info._nuses.fill(0);
self_info._first = &self_info; self_info._first = &self_info;
peers_[self_info.name] = &self_info; peers_map[self_info.name] = &self_info;
piForeach (PeerInfo & i, peers) { piForeach (PeerInfo & i, peers) {
i._nuses.resize(i.neighbours.size()); i._nuses.resize(i.neighbours.size());
i._nuses.fill(0); i._nuses.fill(0);
i._first = 0; i._first = 0;
peers_[i.name] = &i; peers_map[i.name] = &i;
if (max_dist < i.dist) if (max_dist < i.dist)
max_dist = i.dist; max_dist = i.dist;
if (i.dist > 0) continue; if (i.dist > 0) continue;
@@ -662,7 +706,7 @@ void PIPeer::buildMap() {
for (int n = 0; n < ns; ++n) { for (int n = 0; n < ns; ++n) {
if (p->_nuses[n] >= ns) continue; if (p->_nuses[n] >= ns) continue;
p->_nuses[n]++; p->_nuses[n]++;
npeer = peers_[p->neighbours[n]]; npeer = peers_map[p->neighbours[n]];
if (npeer == 0) continue; if (npeer == 0) continue;
if (d == 0) npeer->_first = npeer; if (d == 0) npeer->_first = npeer;
else { else {
@@ -684,7 +728,7 @@ void PIPeer::buildMap() {
if (!pl.contains(cwave[i]->_first)) if (!pl.contains(cwave[i]->_first))
pl << cwave[i]->_first; pl << cwave[i]->_first;
} }
} }*/
/*piCout << " ** addresses map **"; /*piCout << " ** addresses map **";
piForeachC (napair & i, addresses_map) piForeachC (napair & i, addresses_map)
piCout << i.first << i.second; piCout << i.first << i.second;

View File

@@ -51,7 +51,7 @@ public:
friend PIByteArray & operator <<(PIByteArray & s, const PIPeer::PeerInfo & v); friend PIByteArray & operator <<(PIByteArray & s, const PIPeer::PeerInfo & v);
friend PIByteArray & operator >>(PIByteArray & s, PIPeer::PeerInfo & v); friend PIByteArray & operator >>(PIByteArray & s, PIPeer::PeerInfo & v);
public: 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 { struct Address {
Address(const PIString & a = PIString(), const PIString & m = "255.255.255.0"); 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 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 addNeighbours(const PIStringList & l) {piForeachC (PIString & n, l) if (!neighbours.contains(n)) neighbours << n;}
void removeNeighbour(const PIString & n) {neighbours.removeAll(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; PIString nearest_address;
PIStringList neighbours; PIStringList neighbours;
int sync, cnt; int sync, cnt, trace;
bool was_update; bool was_update;
PISystemTime time; PISystemTime time;
PIString _naddress;
PIEthernet * _neth;
PIVector<uchar> _nuses;
PeerInfo * _first;
PeerData _data; PeerData _data;
}; };
@@ -119,8 +117,8 @@ public:
const PeerInfo & selfInfo() const {return self_info;} const PeerInfo & selfInfo() const {return self_info;}
const PIMap<PIString, PIVector<PeerInfo * > > & _peerMap() const {return addresses_map;} const PIMap<PIString, PIVector<PeerInfo * > > & _peerMap() const {return addresses_map;}
void lock() {mc_mutex.lock(); eth_mutex.lock(); peers_mutex.lock();} void lock() {mc_mutex.lock(); peers_mutex.lock();}
void unlock() {mc_mutex.unlock(); eth_mutex.unlock(); peers_mutex.unlock();} void unlock() {mc_mutex.unlock(); peers_mutex.unlock();}
EVENT2(dataReceivedEvent, const PIString &, from, const PIByteArray &, data); EVENT2(dataReceivedEvent, const PIString &, from, const PIByteArray &, data);
EVENT1(peerConnectedEvent, const PIString &, name); EVENT1(peerConnectedEvent, const PIString &, name);

View File

@@ -128,8 +128,8 @@ public:
addrs_tl->content.clear(); addrs_tl->content.clear();
peerinfo_tl->content.clear(); peerinfo_tl->content.clear();
peermap_tl->content.clear(); peermap_tl->content.clear();
peers_tl->content << TileList::Row("this | 0 | 0 |" + PIString::fromNumber(daemon_.allPeers().size_s()) + peers_tl->content << TileList::Row("this | 0 | 0 | " + PIString::fromNumber(daemon_.allPeers().size_s()) +
"," + PIString::fromNumber(cur_peer) ", " + PIString::fromNumber(cur_peer)
, CellFormat()); , CellFormat());
piForeachC(PIPeer::PeerInfo &p , daemon_.allPeers()) piForeachC(PIPeer::PeerInfo &p , daemon_.allPeers())
peers_tl->content << TileList::Row(p.name + " | " + PIString::fromNumber(p.dist) + peers_tl->content << TileList::Row(p.name + " | " + PIString::fromNumber(p.dist) +