[libvirt] [PATCH 1/5] Add a metadata parameter to virLog{, V}Message

Daniel P. Berrange berrange at redhat.com
Wed Nov 14 15:28:34 UTC 2012


On Wed, Oct 17, 2012 at 08:17:14PM +0200, Miloslav Trmač wrote:
> ... and update all users.  No change in functionality, the parameter
> will be used later.
> 
> The metadata representation is as minimal as possible, but requires
> the caller to allocate an array on stack explicitly.
> 
> The alternative of using varargs in the virLogMessage() callers:
> * Would not allow the caller to optionally omit some metadata elements,
>   except by having two calls to virLogMessage.
> * Would not be as type-safe (e.g. using int vs. size_t), and the compiler
>   wouldn't be able to do type checking
> * Depending on parameter order:
>   a) virLogMessage(..., message format, message params...,
>                    metadata..., NULL)
>      can not be portably implemented (parse_printf_format() is a glibc
>      function)
>   b) virLogMessage(..., metadata..., NULL,
>                    message format, message params...)
>      would prevent usage of ATTRIBUTE_FMT_PRINTF and the associated
>      compiler checking.
> 
> Signed-off-by: Miloslav Trmač <mitr at redhat.com>
> ---
>  src/util/logging.c   |  6 +++++-
>  src/util/logging.h   | 24 ++++++++++++++++++------
>  src/util/viraudit.c  |  4 ++--
>  src/util/virterror.c |  2 +-
>  4 files changed, 26 insertions(+), 10 deletions(-)
> 
> diff --git a/src/util/logging.c b/src/util/logging.c
> index 9a8bba1..71fb6bd 100644
> --- a/src/util/logging.c
> +++ b/src/util/logging.c
> @@ -729,6 +729,7 @@ virLogVersionString(const char **rawmsg,
>   * @filename: file where the message was emitted
>   * @linenr: line where the message was emitted
>   * @funcname: the function emitting the (debug) message
> + * @metadata: NULL or metadata array, terminated by an item with NULL key
>   * @fmt: the string format
>   * @...: the arguments
>   *
> @@ -741,13 +742,14 @@ virLogMessage(virLogSource source,
>                const char *filename,
>                int linenr,
>                const char *funcname,
> +              virLogMetadataPtr metadata,
>                const char *fmt, ...)
>  {
>      va_list ap;
>      va_start(ap, fmt);
>      virLogVMessage(source, priority,
>                     filename, linenr, funcname,
> -                   fmt, ap);
> +                   metadata, fmt, ap);
>      va_end(ap);
>  }
>  
> @@ -759,6 +761,7 @@ virLogMessage(virLogSource source,
>   * @filename: file where the message was emitted
>   * @linenr: line where the message was emitted
>   * @funcname: the function emitting the (debug) message
> + * @metadata: NULL or metadata array, terminated by an item with NULL key
>   * @fmt: the string format
>   * @vargs: format args
>   *
> @@ -771,6 +774,7 @@ virLogVMessage(virLogSource source,
>                 const char *filename,
>                 int linenr,
>                 const char *funcname,
> +               virLogMetadataPtr metadata ATTRIBUTE_UNUSED,
>                 const char *fmt,
>                 va_list vargs)
>  {
> diff --git a/src/util/logging.h b/src/util/logging.h
> index c67377f..024814f 100644
> --- a/src/util/logging.h
> +++ b/src/util/logging.h
> @@ -61,7 +61,7 @@ typedef enum {
>   */
>  # ifdef ENABLE_DEBUG
>  #  define VIR_DEBUG_INT(src, filename, linenr, funcname, ...)           \
> -    virLogMessage(src, VIR_LOG_DEBUG, filename, linenr, funcname, __VA_ARGS__)
> +    virLogMessage(src, VIR_LOG_DEBUG, filename, linenr, funcname, NULL, __VA_ARGS__)
>  # else
>  /**
>   * virLogEatParams:
> @@ -78,11 +78,11 @@ static inline void virLogEatParams(virLogSource unused, ...)
>  # endif /* !ENABLE_DEBUG */
>  
>  # define VIR_INFO_INT(src, filename, linenr, funcname, ...)             \
> -    virLogMessage(src, VIR_LOG_INFO, filename, linenr, funcname, __VA_ARGS__)
> +    virLogMessage(src, VIR_LOG_INFO, filename, linenr, funcname, NULL, __VA_ARGS__)
>  # define VIR_WARN_INT(src, filename, linenr, funcname, ...)             \
> -    virLogMessage(src, VIR_LOG_WARN, filename, linenr, funcname, __VA_ARGS__)
> +    virLogMessage(src, VIR_LOG_WARN, filename, linenr, funcname, NULL, __VA_ARGS__)
>  # define VIR_ERROR_INT(src, filename, linenr, funcname, ...)            \
> -    virLogMessage(src, VIR_LOG_ERROR, filename, linenr, funcname, __VA_ARGS__)
> +    virLogMessage(src, VIR_LOG_ERROR, filename, linenr, funcname, NULL, __VA_ARGS__)
>  
>  # define VIR_DEBUG(...)                                                 \
>      VIR_DEBUG_INT(VIR_LOG_FROM_FILE, __FILE__, __LINE__, __func__, __VA_ARGS__)
> @@ -93,6 +93,16 @@ static inline void virLogEatParams(virLogSource unused, ...)
>  # define VIR_ERROR(...)                                                 \
>      VIR_ERROR_INT(VIR_LOG_FROM_FILE, __FILE__, __LINE__, __func__, __VA_ARGS__)
>  
> +
> +struct _virLogMetadata {
> +    const char *key;
> +    const char *s;              /* String value, or NULL to use "i" */
> +    int i;
> +};
> +
> +typedef struct _virLogMetadata virLogMetadata;
> +typedef struct _virLogMetadata *virLogMetadataPtr;
> +
>  /**
>   * virLogOutputFunc:
>   * @src: the src for the message
> @@ -164,14 +174,16 @@ extern void virLogMessage(virLogSource src,
>                            const char *filename,
>                            int linenr,
>                            const char *funcname,
> -                          const char *fmt, ...) ATTRIBUTE_FMT_PRINTF(6, 7);
> +                          virLogMetadataPtr metadata,
> +                          const char *fmt, ...) ATTRIBUTE_FMT_PRINTF(7, 8);
>  extern void virLogVMessage(virLogSource src,
>                             virLogPriority priority,
>                             const char *filename,
>                             int linenr,
>                             const char *funcname,
> +                           virLogMetadataPtr metadata,
>                             const char *fmt,
> -                           va_list vargs) ATTRIBUTE_FMT_PRINTF(6, 0);
> +                           va_list vargs) ATTRIBUTE_FMT_PRINTF(7, 0);
>  extern int virLogSetBufferSize(int size);
>  extern void virLogEmergencyDumpAll(int signum);
>  #endif
> diff --git a/src/util/viraudit.c b/src/util/viraudit.c
> index 61f09eb..9bdc5ed 100644
> --- a/src/util/viraudit.c
> +++ b/src/util/viraudit.c
> @@ -106,11 +106,11 @@ void virAuditSend(const char *filename,
>          if (success)
>              virLogMessage(VIR_LOG_FROM_AUDIT, VIR_LOG_INFO,
>                            filename, linenr, funcname,
> -                          "success=yes %s", str);
> +                          NULL, "success=yes %s", str);
>          else
>              virLogMessage(VIR_LOG_FROM_AUDIT, VIR_LOG_WARN,
>                            filename, linenr, funcname,
> -                          "success=no %s", str);
> +                          NULL, "success=no %s", str);
>      }
>  
>  #if HAVE_AUDIT
> diff --git a/src/util/virterror.c b/src/util/virterror.c
> index 9572116..df8b6fd 100644
> --- a/src/util/virterror.c
> +++ b/src/util/virterror.c
> @@ -679,7 +679,7 @@ virRaiseErrorFull(const char *filename ATTRIBUTE_UNUSED,
>      virLogMessage(virErrorLogPriorityFilter ? VIR_LOG_FROM_FILE : VIR_LOG_FROM_ERROR,
>                    priority,
>                    filename, linenr, funcname,
> -                  "%s", str);
> +                  NULL, "%s", str);
>  
>      errno = save_errno;
>  }

ACK

Daniel
-- 
|: 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 :|




More information about the libvir-list mailing list