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) {
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;
}
}

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;
piForeach (PIScreenTile * t, tiles)
ret << t << t->children();
if (t->visible || !only_visible)
ret << t << t->children(only_visible);
return ret;
}

View File

@@ -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();

View File

@@ -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;

View File

@@ -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);

View File

@@ -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) +