On 11/23/2010 04:45 AM, Stefan Berger wrote:
On 11/22/2010 02:34 PM, Eric Blake wrote:
> * daemon/libvirtd.c (qemudRunLoop): Pass allocation size, not
> current count, to VIR_SHRINK_N.
> ---
>
> Found the cause of the crash; when the first loop completed, it was
> freeing the array but not reflecting that in the allocation count;
> the second time then saw the non-zero allocation count and didn't
> think it had to allocate anything.
>
> daemon/libvirtd.c | 2 +-
> 1 files changed, 1 insertions(+), 1 deletions(-)
>
> diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
> index e544c48..7f75096 100644
> --- a/daemon/libvirtd.c
> +++ b/daemon/libvirtd.c
> @@ -2362,2 +2362,2 @@ static void *qemudRunLoop(void *opaque) {
> server->clients + i + 1,
> sizeof (*server->clients) *
> (server->nclients - i));
>
> - VIR_SHRINK_N(server->clients, server->nclients, 0);
> + VIR_SHRINK_N(server->clients, server->nclients_max, 1);
> goto reprocess;
> }
> }
Solves the problem for me.
ACK.
Thanks. On reflection, I'm actually going to squash this in before
pushing, since it is a more accurate description of what is going on.
diff --git i/daemon/libvirtd.c w/daemon/libvirtd.c
index aa2f6ec..66f1388 100644
--- i/daemon/libvirtd.c
+++ w/daemon/libvirtd.c
@@ -2362,7 +2362,8 @@ static void *qemudRunLoop(void *opaque) {
server->clients + i + 1,
sizeof (*server->clients) *
(server->nclients - i));
- VIR_SHRINK_N(server->clients, server->nclients_max, 1);
+ VIR_SHRINK_N(server->clients, server->nclients_max,
+ server->nclients_max - server->nclients);
goto reprocess;
}
}
diff --git i/docs/hacking.html.in w/docs/hacking.html.in
index 890692f..ac16f41 100644
--- i/docs/hacking.html.in
+++ w/docs/hacking.html.in
@@ -426,14 +426,15 @@
</pre>
</li>
- <li><p>To trim an array of domains to have one less element:</p>
+ <li><p>To trim an array of domains from its allocated size down
+ to the actual used size:</p>
<pre>
virDomainPtr domains;
size_t ndomains = x;
size_t ndomains_max = y;
- VIR_SHRINK_N(domains, ndomains_max, 1);
+ VIR_SHRINK_N(domains, ndomains_max, ndomains_max - ndomains);
</pre></li>
<li><p>To free an array of domains:</p>
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org