[libvirt] [PATCH RFC 1/2] viralloc: Report OOM error on failure
Stefan Berger
stefanb at linux.vnet.ibm.com
Fri Mar 22 17:27:46 UTC 2013
On 03/22/2013 07:44 AM, Michal Privoznik wrote:
> In nearly all cases of calling VIR_ALLOC*, VIR_REALLOC_N,
> VIR_EXPAND_N, VIR_RESIZE_N, VIR_*_ELEMENT etc. we want to
> report OOM error, so our source code base is full of:
>
> if (VIR_ALLOC(somePtr) < 0) {
> virReportOOMError();
> goto cleanup;
> }
>
> or similar. Moreover, for those few cases where we don't want to
> report OOM error (e.g. virReportOOMError() itself) a new
> VIR_ALLOC_NOOOM macro is being introduced.
> ---
[...]
> diff --git a/src/util/viralloc.h b/src/util/viralloc.h
> index 7be7f82..30ffe15 100644
> --- a/src/util/viralloc.h
> +++ b/src/util/viralloc.h
> @@ -46,7 +46,7 @@
>
>
> /* Don't call these directly - use the macros below */
> -int virAlloc(void *ptrptr, size_t size) ATTRIBUTE_RETURN_CHECK
> +int virAlloc(void *ptrptr, size_t size, bool report) ATTRIBUTE_RETURN_CHECK
> ATTRIBUTE_NONNULL(1);
> int virAllocN(void *ptrptr, size_t size, size_t count) ATTRIBUTE_RETURN_CHECK
> ATTRIBUTE_NONNULL(1);
> @@ -76,13 +76,16 @@ void virFree(void *ptrptr) ATTRIBUTE_NONNULL(1);
> * VIR_ALLOC:
> * @ptr: pointer to hold address of allocated memory
> *
> - * Allocate sizeof(*ptr) bytes of memory and store
> - * the address of allocated memory in 'ptr'. Fill the
> - * newly allocated memory with zeros.
> + * Allocate sizeof(*ptr) bytes of memory and store the
> + * address of allocated memory in 'ptr'. Fill the newly
> + * allocated memory with zeros. If there's a failure,
> + * OOM error is reported. The VIR_ALLOC_NOOOM macro
> + * behaves the same except the OOM error reporting.
> *
> * Returns -1 on failure, 0 on success
> */
> -# define VIR_ALLOC(ptr) virAlloc(&(ptr), sizeof(*(ptr)))
> +# define VIR_ALLOC(ptr) virAlloc(&(ptr), sizeof(*(ptr)), true)
> +# define VIR_ALLOC_NOOOM(ptr) virAlloc(&(ptr), sizeof(*(ptr)), true)
should be false in the 2nd case...
>
> /**
> * VIR_ALLOC_N:
> diff --git a/src/util/virerror.c b/src/util/virerror.c
> index c30642a..c033129 100644
> --- a/src/util/virerror.c
> +++ b/src/util/virerror.c
> @@ -204,7 +204,7 @@ virLastErrorObject(void)
> virErrorPtr err;
> err = virThreadLocalGet(&virLastErr);
> if (!err) {
> - if (VIR_ALLOC(err) < 0)
> + if (VIR_ALLOC_NOOOM(err) < 0)
> return NULL;
> if (virThreadLocalSet(&virLastErr, err) < 0)
> VIR_FREE(err);
ACK with nit fixed.
More information about the libvir-list
mailing list