On Fri, Jun 17, 2011 at 10:52:03AM +0800, Wen Congyang wrote:
At 06/16/2011 01:06 AM, Daniel P. Berrange Write:
> +
> +
> static int
> qemuProcessHandleShutdown(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
> virDomainObjPtr vm)
> {
> + qemuDomainObjPrivatePtr priv = vm->privateData;
I think we should get vm->privateData after we lock vm.
Yep, good point.
> + VIR_DEBUG("vm=%p", vm);
> +
> virDomainObjLock(vm);
> - ((qemuDomainObjPrivatePtr) vm->privateData)->gotShutdown = true;
> + priv->gotShutdown = true;
> + if (priv->fakeReboot) {
> + virDomainObjRef(vm);
> + virThread th;
> + if (virThreadCreate(&th,
> + false,
> + qemuProcessFakeReboot,
> + vm) < 0) {
> + VIR_ERROR("Failed to create reboot thread, killing domain");
> + qemuProcessKill(vm);
We should hold an extra reference the vm here. If the vm is not persistent
and we destroy the vm before the thread runs, libvirtd may crash(I think, not test
it).
I'm already taking an extra reference just before starting the
thread. I need to release that actually in virThreadCreate fails
to run.
> + }
> + } else {
> + qemuProcessKill(vm);
> + }
> virDomainObjUnlock(vm);
>
> return 0;
Daiel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|