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) {
|
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;
|
||||||
|
if (!ftl.isEmpty()) {
|
||||||
ind += next;
|
ind += next;
|
||||||
if (ind >= ftl.size_s()) ind = 0;
|
if (ind >= ftl.size_s()) ind = 0;
|
||||||
if (ind < 0) ind = ftl.size_s() - 1;
|
if (ind < 0) ind = ftl.size_s() - 1;
|
||||||
tile_focus = ftl[ind];
|
tile_focus = ftl[ind];
|
||||||
tile_focus->has_focus = true;
|
tile_focus->has_focus = true;
|
||||||
|
}
|
||||||
return 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;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) +
|
||||||
|
|||||||
Reference in New Issue
Block a user