You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "iom.h"
// for IOM_SIG
#if IOM_SIG
-# include <signal.h>
+# include <csignal>
# include <fcntl.h>
#endif
# endif
# if IOM_TIME
- set_now ();
+ {
+ // update time, try to compensate for gross non-monotonic time changes
+ tstamp diff = NOW;
+ set_now ();
+ diff = NOW - diff;
+
+ if (diff < 0)
+ for (io_manager_vec<time_watcher>::const_iterator i = tw.end (); i-- > tw.begin (); )
+ if (*i)
+ (*i)->at += diff;
+ }
# endif
if (fds > 0)
iow.erase_unordered (i);
else
{
- short revents = iow[i]->events;
+ io_watcher &w = *iow[i];
+ short revents = w.events;
- if (!FD_ISSET (iow[i]->fd, &rfd)) revents &= ~EVENT_READ;
- if (!FD_ISSET (iow[i]->fd, &wfd)) revents &= ~EVENT_WRITE;
+ if (!FD_ISSET (w.fd, &rfd)) revents &= ~EVENT_READ;
+ if (!FD_ISSET (w.fd, &wfd)) revents &= ~EVENT_WRITE;
if (revents)
- iow[i]->call (*iow[i], revents);
+ w.call (w, revents);
}
#endif
}