int tevent_common_loop_wait(struct tevent_context *ev,
const char *location)
{
- static time_t t=0;
- time_t new_t;
/*
* loop as long as we have events pending
ret, strerror(errno));
return ret;
}
- if (getpid() == ctdbd_pid) {
- new_t=time(NULL);
- if (t != 0) {
- if (t > new_t) {
- tevent_debug(ev, TEVENT_DEBUG_FATAL, __location__ " ERROR Time skipped backward by %d seconds\n", (int)(t-new_t));
- }
- /* We assume here that we get at least one event every 3 seconds */
- if (new_t > (t+3)) {
- tevent_debug(ev, TEVENT_DEBUG_FATAL, __location__ " ERROR Time jumped forward by %d seconds\n", (int)(new_t-t));
- }
- }
- t=new_t;
- }
}
tevent_debug(ev, TEVENT_DEBUG_WARNING,
return 0;
}
+ tevent_before_wait(epoll_ev->ev);
ret = epoll_wait(epoll_ev->epoll_fd, events, MAXEVENTS, timeout);
+ tevent_after_wait(epoll_ev->ev);
if (ret == -1 && errno == EINTR && epoll_ev->ev->signal_events) {
if (tevent_common_check_signal(epoll_ev->ev)) {
return 0;
}
+ tevent_before_wait(select_ev->ev);
selrtn = select(select_ev->maxfd+1, &r_fds, &w_fds, NULL, tvalp);
+ tevent_after_wait(select_ev->ev);
if (selrtn == -1 && errno == EINTR &&
select_ev->ev->signal_events) {
return 0;
}
+ tevent_before_wait(std_ev->ev);
ret = epoll_wait(std_ev->epoll_fd, events, MAXEVENTS, timeout);
+ tevent_after_wait(std_ev->ev);
if (ret == -1 && errno == EINTR && std_ev->ev->signal_events) {
if (tevent_common_check_signal(std_ev->ev)) {
return fcntl( fd, F_SETFL, val);
#undef FLAG_TO_SET
}
+
+static struct timeval tevent_before_wait_ts;
+static struct timeval tevent_after_wait_ts;
+
+/*
+ * measure the time difference between multiple arrivals
+ * to the point where we wait for new events to come in
+ *
+ * allows to measure how long it takes to work on a
+ * event
+ */
+void tevent_before_wait(struct event_context *ev) {
+
+ struct timeval diff;
+ struct timeval now = tevent_timeval_current();
+
+ if (!tevent_timeval_is_zero(&tevent_after_wait_ts)) {
+ diff = tevent_timeval_until(&tevent_after_wait_ts, &now);
+ if (diff.tv_sec > 3) {
+ tevent_debug(ev, TEVENT_DEBUG_FATAL, __location__
+ " Handling event took %d seconds!",
+ (int) diff.tv_sec);
+ }
+ }
+
+ tevent_before_wait_ts = tevent_timeval_current();
+
+}
+
+/*
+ * measure how long the select()/epoll() call took
+ *
+ * allows to measure how long we are waiting for new events
+ */
+void tevent_after_wait(struct event_context *ev) {
+
+ struct timeval diff;
+ struct timeval now = tevent_timeval_current();
+
+ if (!tevent_timeval_is_zero(&tevent_before_wait_ts)) {
+ diff = tevent_timeval_until(&tevent_before_wait_ts, &now);
+ if (diff.tv_sec > 3) {
+ tevent_debug(ev, TEVENT_DEBUG_FATAL, __location__
+ " No event for %d seconds!",
+ (int) diff.tv_sec);
+ }
+ }
+
+ tevent_after_wait_ts = tevent_timeval_current();
+
+}
int ev_set_blocking(int fd, bool set);
size_t ev_str_list_length(const char **list);
+void tevent_before_wait(struct event_context *ev);
+void tevent_after_wait(struct event_context *ev);
+
+
/* Defined here so we can build against older talloc versions that don't
* have this define yet. */
#ifndef TALLOC_FREE