mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
main-loop: create main-loop.c
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
44a9b356ad
commit
d3b12f5dec
11 changed files with 523 additions and 454 deletions
123
os-win32.c
123
os-win32.c
|
@ -48,129 +48,6 @@ int setenv(const char *name, const char *value, int overwrite)
|
|||
return result;
|
||||
}
|
||||
|
||||
/***********************************************************/
|
||||
/* Polling handling */
|
||||
|
||||
typedef struct PollingEntry {
|
||||
PollingFunc *func;
|
||||
void *opaque;
|
||||
struct PollingEntry *next;
|
||||
} PollingEntry;
|
||||
|
||||
static PollingEntry *first_polling_entry;
|
||||
|
||||
int qemu_add_polling_cb(PollingFunc *func, void *opaque)
|
||||
{
|
||||
PollingEntry **ppe, *pe;
|
||||
pe = g_malloc0(sizeof(PollingEntry));
|
||||
pe->func = func;
|
||||
pe->opaque = opaque;
|
||||
for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next);
|
||||
*ppe = pe;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void qemu_del_polling_cb(PollingFunc *func, void *opaque)
|
||||
{
|
||||
PollingEntry **ppe, *pe;
|
||||
for(ppe = &first_polling_entry; *ppe != NULL; ppe = &(*ppe)->next) {
|
||||
pe = *ppe;
|
||||
if (pe->func == func && pe->opaque == opaque) {
|
||||
*ppe = pe->next;
|
||||
g_free(pe);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/***********************************************************/
|
||||
/* Wait objects support */
|
||||
typedef struct WaitObjects {
|
||||
int num;
|
||||
HANDLE events[MAXIMUM_WAIT_OBJECTS + 1];
|
||||
WaitObjectFunc *func[MAXIMUM_WAIT_OBJECTS + 1];
|
||||
void *opaque[MAXIMUM_WAIT_OBJECTS + 1];
|
||||
} WaitObjects;
|
||||
|
||||
static WaitObjects wait_objects = {0};
|
||||
|
||||
int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
|
||||
{
|
||||
WaitObjects *w = &wait_objects;
|
||||
|
||||
if (w->num >= MAXIMUM_WAIT_OBJECTS)
|
||||
return -1;
|
||||
w->events[w->num] = handle;
|
||||
w->func[w->num] = func;
|
||||
w->opaque[w->num] = opaque;
|
||||
w->num++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque)
|
||||
{
|
||||
int i, found;
|
||||
WaitObjects *w = &wait_objects;
|
||||
|
||||
found = 0;
|
||||
for (i = 0; i < w->num; i++) {
|
||||
if (w->events[i] == handle)
|
||||
found = 1;
|
||||
if (found) {
|
||||
w->events[i] = w->events[i + 1];
|
||||
w->func[i] = w->func[i + 1];
|
||||
w->opaque[i] = w->opaque[i + 1];
|
||||
}
|
||||
}
|
||||
if (found)
|
||||
w->num--;
|
||||
}
|
||||
|
||||
void os_host_main_loop_wait(int *timeout)
|
||||
{
|
||||
int ret, ret2, i;
|
||||
PollingEntry *pe;
|
||||
|
||||
/* XXX: need to suppress polling by better using win32 events */
|
||||
ret = 0;
|
||||
for(pe = first_polling_entry; pe != NULL; pe = pe->next) {
|
||||
ret |= pe->func(pe->opaque);
|
||||
}
|
||||
if (ret == 0) {
|
||||
int err;
|
||||
WaitObjects *w = &wait_objects;
|
||||
|
||||
qemu_mutex_unlock_iothread();
|
||||
ret = WaitForMultipleObjects(w->num, w->events, FALSE, *timeout);
|
||||
qemu_mutex_lock_iothread();
|
||||
if (WAIT_OBJECT_0 + 0 <= ret && ret <= WAIT_OBJECT_0 + w->num - 1) {
|
||||
if (w->func[ret - WAIT_OBJECT_0])
|
||||
w->func[ret - WAIT_OBJECT_0](w->opaque[ret - WAIT_OBJECT_0]);
|
||||
|
||||
/* Check for additional signaled events */
|
||||
for(i = (ret - WAIT_OBJECT_0 + 1); i < w->num; i++) {
|
||||
|
||||
/* Check if event is signaled */
|
||||
ret2 = WaitForSingleObject(w->events[i], 0);
|
||||
if(ret2 == WAIT_OBJECT_0) {
|
||||
if (w->func[i])
|
||||
w->func[i](w->opaque[i]);
|
||||
} else if (ret2 == WAIT_TIMEOUT) {
|
||||
} else {
|
||||
err = GetLastError();
|
||||
fprintf(stderr, "WaitForSingleObject error %d %d\n", i, err);
|
||||
}
|
||||
}
|
||||
} else if (ret == WAIT_TIMEOUT) {
|
||||
} else {
|
||||
err = GetLastError();
|
||||
fprintf(stderr, "WaitForMultipleObjects error %d %d\n", ret, err);
|
||||
}
|
||||
}
|
||||
|
||||
*timeout = 0;
|
||||
}
|
||||
|
||||
static BOOL WINAPI qemu_ctrl_handler(DWORD type)
|
||||
{
|
||||
exit(STATUS_CONTROL_C_EXIT);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue