API for changes in VM state (malc)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1614 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
946fc94733
commit
0bd4885002
45
vl.c
45
vl.c
@ -2935,9 +2935,47 @@ void gui_update(void *opaque)
|
|||||||
qemu_mod_timer(gui_timer, GUI_REFRESH_INTERVAL + qemu_get_clock(rt_clock));
|
qemu_mod_timer(gui_timer, GUI_REFRESH_INTERVAL + qemu_get_clock(rt_clock));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct vm_change_state_entry {
|
||||||
|
VMChangeStateHandler *cb;
|
||||||
|
void *opaque;
|
||||||
|
LIST_ENTRY (vm_change_state_entry) entries;
|
||||||
|
};
|
||||||
|
|
||||||
|
static LIST_HEAD(vm_change_state_head, vm_change_state_entry) vm_change_state_head;
|
||||||
|
|
||||||
|
VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
VMChangeStateEntry *e;
|
||||||
|
|
||||||
|
e = qemu_mallocz(sizeof (*e));
|
||||||
|
if (!e)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
e->cb = cb;
|
||||||
|
e->opaque = opaque;
|
||||||
|
LIST_INSERT_HEAD(&vm_change_state_head, e, entries);
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
void qemu_del_vm_change_state_handler(VMChangeStateEntry *e)
|
||||||
|
{
|
||||||
|
LIST_REMOVE (e, entries);
|
||||||
|
qemu_free (e);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void vm_state_notify(int running)
|
||||||
|
{
|
||||||
|
VMChangeStateEntry *e;
|
||||||
|
|
||||||
|
for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
|
||||||
|
e->cb(e->opaque, running);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* XXX: support several handlers */
|
/* XXX: support several handlers */
|
||||||
VMStopHandler *vm_stop_cb;
|
static VMStopHandler *vm_stop_cb;
|
||||||
VMStopHandler *vm_stop_opaque;
|
static void *vm_stop_opaque;
|
||||||
|
|
||||||
int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
|
int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque)
|
||||||
{
|
{
|
||||||
@ -2956,6 +2994,7 @@ void vm_start(void)
|
|||||||
if (!vm_running) {
|
if (!vm_running) {
|
||||||
cpu_enable_ticks();
|
cpu_enable_ticks();
|
||||||
vm_running = 1;
|
vm_running = 1;
|
||||||
|
vm_state_notify(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2969,6 +3008,7 @@ void vm_stop(int reason)
|
|||||||
vm_stop_cb(vm_stop_opaque, reason);
|
vm_stop_cb(vm_stop_opaque, reason);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
vm_state_notify(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3589,6 +3629,7 @@ int main(int argc, char **argv)
|
|||||||
char usb_devices[MAX_VM_USB_PORTS][128];
|
char usb_devices[MAX_VM_USB_PORTS][128];
|
||||||
int usb_devices_index;
|
int usb_devices_index;
|
||||||
|
|
||||||
|
LIST_INIT (&vm_change_state_head);
|
||||||
#if !defined(CONFIG_SOFTMMU)
|
#if !defined(CONFIG_SOFTMMU)
|
||||||
/* we never want that malloc() uses mmap() */
|
/* we never want that malloc() uses mmap() */
|
||||||
mallopt(M_MMAP_THRESHOLD, 4096 * 1024);
|
mallopt(M_MMAP_THRESHOLD, 4096 * 1024);
|
||||||
|
6
vl.h
6
vl.h
@ -97,8 +97,14 @@ int strstart(const char *str, const char *val, const char **ptr);
|
|||||||
|
|
||||||
extern int vm_running;
|
extern int vm_running;
|
||||||
|
|
||||||
|
typedef struct vm_change_state_entry VMChangeStateEntry;
|
||||||
|
typedef void VMChangeStateHandler(void *opaque, int running);
|
||||||
typedef void VMStopHandler(void *opaque, int reason);
|
typedef void VMStopHandler(void *opaque, int reason);
|
||||||
|
|
||||||
|
VMChangeStateEntry *qemu_add_vm_change_state_handler(VMChangeStateHandler *cb,
|
||||||
|
void *opaque);
|
||||||
|
void qemu_del_vm_change_state_handler(VMChangeStateEntry *e);
|
||||||
|
|
||||||
int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque);
|
int qemu_add_vm_stop_handler(VMStopHandler *cb, void *opaque);
|
||||||
void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque);
|
void qemu_del_vm_stop_handler(VMStopHandler *cb, void *opaque);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user