Warn if requesting update to non-existent timer/handle watch

The event code is a no-op if requested to update a non-existent
timer/handle watch. This makes it hard to detect bugs in the
caller who have passed bogus data. Add a VIR_WARN output in
such cases, since the API does not allow for return errors.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2012-11-22 16:42:30 +00:00
parent 81d6c4defe
commit 39064f0ff9

View File

@ -141,6 +141,7 @@ int virEventPollAddHandle(int fd, int events,
void virEventPollUpdateHandle(int watch, int events) { void virEventPollUpdateHandle(int watch, int events) {
int i; int i;
bool found = false;
PROBE(EVENT_POLL_UPDATE_HANDLE, PROBE(EVENT_POLL_UPDATE_HANDLE,
"watch=%d events=%d", "watch=%d events=%d",
watch, events); watch, events);
@ -156,10 +157,14 @@ void virEventPollUpdateHandle(int watch, int events) {
eventLoop.handles[i].events = eventLoop.handles[i].events =
virEventPollToNativeEvents(events); virEventPollToNativeEvents(events);
virEventPollInterruptLocked(); virEventPollInterruptLocked();
found = true;
break; break;
} }
} }
virMutexUnlock(&eventLoop.lock); virMutexUnlock(&eventLoop.lock);
if (!found)
VIR_WARN("Got update for non-existent handle watch %d", watch);
} }
/* /*
@ -249,6 +254,7 @@ void virEventPollUpdateTimeout(int timer, int frequency)
{ {
unsigned long long now; unsigned long long now;
int i; int i;
bool found = false;
PROBE(EVENT_POLL_UPDATE_TIMEOUT, PROBE(EVENT_POLL_UPDATE_TIMEOUT,
"timer=%d frequency=%d", "timer=%d frequency=%d",
timer, frequency); timer, frequency);
@ -268,11 +274,17 @@ void virEventPollUpdateTimeout(int timer, int frequency)
eventLoop.timeouts[i].frequency = frequency; eventLoop.timeouts[i].frequency = frequency;
eventLoop.timeouts[i].expiresAt = eventLoop.timeouts[i].expiresAt =
frequency >= 0 ? frequency + now : 0; frequency >= 0 ? frequency + now : 0;
VIR_DEBUG("Set timer freq=%d expires=%llu", frequency,
eventLoop.timeouts[i].expiresAt);
virEventPollInterruptLocked(); virEventPollInterruptLocked();
found = true;
break; break;
} }
} }
virMutexUnlock(&eventLoop.lock); virMutexUnlock(&eventLoop.lock);
if (!found)
VIR_WARN("Got update for non-existent timer %d", timer);
} }
/* /*
@ -336,6 +348,7 @@ static int virEventPollCalculateTimeout(int *timeout) {
if (virTimeMillisNow(&now) < 0) if (virTimeMillisNow(&now) < 0)
return -1; return -1;
EVENT_DEBUG("Schedule timeout then=%llu now=%llu", then, now);
*timeout = then - now; *timeout = then - now;
if (*timeout < 0) if (*timeout < 0)
*timeout = 0; *timeout = 0;