mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
Fix interrupting of main event thread & protect against accidental uniniitalized variables
This commit is contained in:
parent
72dc6d60ab
commit
0a31be6ba2
@ -1,3 +1,9 @@
|
|||||||
|
Tue May 12 17:42:22 BST 2009 Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
|
||||||
|
* qemud/event.c: Start watch/timer IDs from 1 to avoid problem
|
||||||
|
with accidental uninitialized variables at 0. Fix interrupting
|
||||||
|
of main thread when updating/deleting watches/timers.
|
||||||
|
|
||||||
Tue May 12 16:38:22 BST 2009 Daniel P. Berrange <berrange@redhat.com>
|
Tue May 12 16:38:22 BST 2009 Daniel P. Berrange <berrange@redhat.com>
|
||||||
|
|
||||||
* qemud/qemud.c, qemud/qemud.h, qemud/event.c: Remove use
|
* qemud/qemud.c, qemud/qemud.h, qemud/event.c: Remove use
|
||||||
|
@ -84,10 +84,10 @@ struct virEventLoop {
|
|||||||
static struct virEventLoop eventLoop;
|
static struct virEventLoop eventLoop;
|
||||||
|
|
||||||
/* Unique ID for the next FD watch to be registered */
|
/* Unique ID for the next FD watch to be registered */
|
||||||
static int nextWatch = 0;
|
static int nextWatch = 1;
|
||||||
|
|
||||||
/* Unique ID for the next timer to be registered */
|
/* Unique ID for the next timer to be registered */
|
||||||
static int nextTimer = 0;
|
static int nextTimer = 1;
|
||||||
|
|
||||||
static void virEventLock(void)
|
static void virEventLock(void)
|
||||||
{
|
{
|
||||||
@ -143,15 +143,22 @@ int virEventAddHandleImpl(int fd, int events,
|
|||||||
|
|
||||||
void virEventUpdateHandleImpl(int watch, int events) {
|
void virEventUpdateHandleImpl(int watch, int events) {
|
||||||
int i;
|
int i;
|
||||||
|
EVENT_DEBUG("Update handle w=%d e=%d", watch, events);
|
||||||
|
|
||||||
|
if (watch <= 0) {
|
||||||
|
VIR_WARN("Ignoring invalid update watch %d", watch);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
virEventLock();
|
virEventLock();
|
||||||
for (i = 0 ; i < eventLoop.handlesCount ; i++) {
|
for (i = 0 ; i < eventLoop.handlesCount ; i++) {
|
||||||
if (eventLoop.handles[i].watch == watch) {
|
if (eventLoop.handles[i].watch == watch) {
|
||||||
eventLoop.handles[i].events =
|
eventLoop.handles[i].events =
|
||||||
virEventHandleTypeToPollEvent(events);
|
virEventHandleTypeToPollEvent(events);
|
||||||
|
virEventInterruptLocked();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virEventInterruptLocked();
|
|
||||||
virEventUnlock();
|
virEventUnlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,6 +171,12 @@ void virEventUpdateHandleImpl(int watch, int events) {
|
|||||||
int virEventRemoveHandleImpl(int watch) {
|
int virEventRemoveHandleImpl(int watch) {
|
||||||
int i;
|
int i;
|
||||||
EVENT_DEBUG("Remove handle %d", watch);
|
EVENT_DEBUG("Remove handle %d", watch);
|
||||||
|
|
||||||
|
if (watch <= 0) {
|
||||||
|
VIR_WARN("Ignoring invalid remove watch %d", watch);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
virEventLock();
|
virEventLock();
|
||||||
for (i = 0 ; i < eventLoop.handlesCount ; i++) {
|
for (i = 0 ; i < eventLoop.handlesCount ; i++) {
|
||||||
if (eventLoop.handles[i].deleted)
|
if (eventLoop.handles[i].deleted)
|
||||||
@ -172,11 +185,11 @@ int virEventRemoveHandleImpl(int watch) {
|
|||||||
if (eventLoop.handles[i].watch == watch) {
|
if (eventLoop.handles[i].watch == watch) {
|
||||||
EVENT_DEBUG("mark delete %d %d", i, eventLoop.handles[i].fd);
|
EVENT_DEBUG("mark delete %d %d", i, eventLoop.handles[i].fd);
|
||||||
eventLoop.handles[i].deleted = 1;
|
eventLoop.handles[i].deleted = 1;
|
||||||
|
virEventInterruptLocked();
|
||||||
virEventUnlock();
|
virEventUnlock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virEventInterruptLocked();
|
|
||||||
virEventUnlock();
|
virEventUnlock();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -232,6 +245,12 @@ void virEventUpdateTimeoutImpl(int timer, int frequency) {
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
int i;
|
int i;
|
||||||
EVENT_DEBUG("Updating timer %d timeout with %d ms freq", timer, frequency);
|
EVENT_DEBUG("Updating timer %d timeout with %d ms freq", timer, frequency);
|
||||||
|
|
||||||
|
if (timer <= 0) {
|
||||||
|
VIR_WARN("Ignoring invalid update timer %d", timer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (gettimeofday(&tv, NULL) < 0) {
|
if (gettimeofday(&tv, NULL) < 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -244,10 +263,10 @@ void virEventUpdateTimeoutImpl(int timer, int frequency) {
|
|||||||
frequency >= 0 ? frequency +
|
frequency >= 0 ? frequency +
|
||||||
(((unsigned long long)tv.tv_sec)*1000) +
|
(((unsigned long long)tv.tv_sec)*1000) +
|
||||||
(((unsigned long long)tv.tv_usec)/1000) : 0;
|
(((unsigned long long)tv.tv_usec)/1000) : 0;
|
||||||
|
virEventInterruptLocked();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virEventInterruptLocked();
|
|
||||||
virEventUnlock();
|
virEventUnlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,6 +279,12 @@ void virEventUpdateTimeoutImpl(int timer, int frequency) {
|
|||||||
int virEventRemoveTimeoutImpl(int timer) {
|
int virEventRemoveTimeoutImpl(int timer) {
|
||||||
int i;
|
int i;
|
||||||
EVENT_DEBUG("Remove timer %d", timer);
|
EVENT_DEBUG("Remove timer %d", timer);
|
||||||
|
|
||||||
|
if (timer <= 0) {
|
||||||
|
VIR_WARN("Ignoring invalid remove timer %d", timer);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
virEventLock();
|
virEventLock();
|
||||||
for (i = 0 ; i < eventLoop.timeoutsCount ; i++) {
|
for (i = 0 ; i < eventLoop.timeoutsCount ; i++) {
|
||||||
if (eventLoop.timeouts[i].deleted)
|
if (eventLoop.timeouts[i].deleted)
|
||||||
@ -267,11 +292,11 @@ int virEventRemoveTimeoutImpl(int timer) {
|
|||||||
|
|
||||||
if (eventLoop.timeouts[i].timer == timer) {
|
if (eventLoop.timeouts[i].timer == timer) {
|
||||||
eventLoop.timeouts[i].deleted = 1;
|
eventLoop.timeouts[i].deleted = 1;
|
||||||
|
virEventInterruptLocked();
|
||||||
virEventUnlock();
|
virEventUnlock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virEventInterruptLocked();
|
|
||||||
virEventUnlock();
|
virEventUnlock();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -617,9 +642,12 @@ static int virEventInterruptLocked(void)
|
|||||||
char c = '\0';
|
char c = '\0';
|
||||||
|
|
||||||
if (!eventLoop.running ||
|
if (!eventLoop.running ||
|
||||||
pthread_self() == eventLoop.leader)
|
pthread_self() == eventLoop.leader) {
|
||||||
|
VIR_DEBUG("Skip interrupt, %d %d", eventLoop.running, (int)eventLoop.leader);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
VIR_DEBUG0("Interrupting");
|
||||||
if (safewrite(eventLoop.wakeupfd[1], &c, sizeof(c)) != sizeof(c))
|
if (safewrite(eventLoop.wakeupfd[1], &c, sizeof(c)) != sizeof(c))
|
||||||
return -1;
|
return -1;
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user