#
#
# patch "ChangeLog"
# from [de77ee9f03152c6ca506d9a479b137efc9db3842]
# to [ded05d45d4a81d422c2bf583586469cc2850bc20]
#
# patch "netsync.cc"
# from [976872ee6fdd486c92367f0f9328abf442cb747d]
# to [838ea8e645fbc5694a6ac0e81ee0e5c8dde36ede]
#
============================================================
--- ChangeLog de77ee9f03152c6ca506d9a479b137efc9db3842
+++ ChangeLog ded05d45d4a81d422c2bf583586469cc2850bc20
@@ -1,3 +1,9 @@
+2006-04-26 Timothy Brownawell
+
+ * netsync.cc (serve_connections): Cycle through all results before
+ recalculating the probe. Netxx does not make this as simple as it
+ should be.
+
2006-04-25 Derek Scherger
* restrictions.{cc,hh} (find_missing, find_unknown_and_ignored): move to...
============================================================
--- netsync.cc 976872ee6fdd486c92367f0f9328abf442cb747d
+++ netsync.cc 838ea8e645fbc5694a6ac0e81ee0e5c8dde36ede
@@ -2657,59 +2657,71 @@
arm_sessions_and_calculate_probe(probe, sessions, armed_sessions);
L(FL("i/o probe with %d armed\n") % armed_sessions.size());
- Netxx::Probe::result_type res = probe.ready(sessions.empty() ? forever
- : (armed_sessions.empty() ? timeout
- : instant));
- Netxx::Probe::ready_type event = res.second;
- Netxx::socket_type fd = res.first;
+ Netxx::socket_type fd;
+ Netxx::Timeout how_long;
+ if (sessions.empty())
+ how_long = forever;
+ else if (armed_sessions.empty())
+ how_long = timeout;
+ else
+ how_long = instant;
+ do
+ {
+ Netxx::Probe::result_type res = probe.ready(how_long);
+ how_long = instant;
+ Netxx::Probe::ready_type event = res.second;
+ fd = res.first;
- if (!guard)
- guard = shared_ptr(new transaction_guard(app.db));
+ if (!guard)
+ guard = shared_ptr(new transaction_guard(app.db));
- I(guard);
-
- if (fd == -1)
- {
- if (armed_sessions.empty())
- L(FL("timed out waiting for I/O (listening on %s : %s)\n")
- % addr.get_name() % lexical_cast(addr.get_port()));
- }
-
- // we either got a new connection
- else if (fd == server)
- handle_new_connection(addr, server, timeout, role,
- include_pattern, exclude_pattern,
- sessions, app);
-
- // or an existing session woke up
- else
- {
- map >::iterator i;
- i = sessions.find(fd);
- if (i == sessions.end())
+ I(guard);
+
+ if (fd == -1)
{
- L(FL("got woken up for action on unknown fd %d\n") % fd);
+ if (armed_sessions.empty())
+ L(FL("timed out waiting for I/O (listening on %s : %s)\n")
+ % addr.get_name() % lexical_cast(addr.get_port()));
}
+
+ // we either got a new connection
+ else if (fd == server)
+ handle_new_connection(addr, server, timeout, role,
+ include_pattern, exclude_pattern,
+ sessions, app);
+
+ // or an existing session woke up
else
{
- shared_ptr sess = i->second;
- bool live_p = true;
-
- if (event & Netxx::Probe::ready_read)
- handle_read_available(fd, sess, sessions,
- armed_sessions, live_p);
-
- if (live_p && (event & Netxx::Probe::ready_write))
- handle_write_available(fd, sess, sessions, live_p);
-
- if (live_p && (event & Netxx::Probe::ready_oobd))
+ map >::iterator i;
+ i = sessions.find(fd);
+ if (i == sessions.end())
{
- P(F("got OOB from peer %s, disconnecting\n")
- % sess->peer_id);
- sessions.erase(i);
+ L(FL("got woken up for action on unknown fd %d\n") % fd);
}
+ else
+ {
+ probe.remove(i->second->str);
+ shared_ptr sess = i->second;
+ bool live_p = true;
+
+ if (event & Netxx::Probe::ready_read)
+ handle_read_available(fd, sess, sessions,
+ armed_sessions, live_p);
+
+ if (live_p && (event & Netxx::Probe::ready_write))
+ handle_write_available(fd, sess, sessions, live_p);
+
+ if (live_p && (event & Netxx::Probe::ready_oobd))
+ {
+ P(F("got OOB from peer %s, disconnecting\n")
+ % sess->peer_id);
+ sessions.erase(i);
+ }
+ }
}
}
+ while (fd != -1);
process_armed_sessions(sessions, armed_sessions, *guard);
reap_dead_sessions(sessions, timeout_seconds);