On 03/23/2011 05:48 PM, Eric Blake wrote:
Sometimes, an asynchronous helper is started (such as a compressor
or iohelper program), but a later error means that we want to
abort that child. Make this easier.
Note that since daemons and virCommandRunAsync can't mix, the only
time virCommandFree can reap a process is if someone did
virCommandRunAsync for a non-daemon and didn't stash the pid.
* src/util/command.h (virCommandAbort): New prototype.
* src/util/command.c (_virCommand): Add new field.
(virCommandRunAsync, virCommandWait): Track whether pid was used.
(virCommandFree): Reap child if caller did not request pid.
(virCommandAbort): New function.
* src/libvirt_private.syms (command.h): Export it.
* tests/commandtest.c (test19): New test.
---
v2: no change, but by adding patch 2, it should make it clear
that this patch is doing the right thing about not reaping
a long-running daemon.
Actually, I'm going to squash this in, and make v2 different than v1 by
enhancing the tests for daemons:
diff --git i/tests/commandtest.c w/tests/commandtest.c
index 527b95a..c313a2c 100644
--- i/tests/commandtest.c
+++ w/tests/commandtest.c
@@ -696,6 +696,14 @@ static int test18(const void *unused ATTRIBUTE_UNUSED)
printf("cannot read pidfile\n");
goto cleanup;
}
+
+ virCommandFree(cmd);
+ cmd = NULL;
+ if (kill(pid, 0) != 0) {
+ printf("daemon should still be running\n");
+ goto cleanup;
+ }
+
while (kill(pid, SIGINT) != -1)
usleep(100*1000);
Hmm, should we have a virCommandRunDaemon(cmd, pid_t*) helper function
that runs a command as a daemon and returns its pid by reading a
temporary pidfile?
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org