[libvirt] [PATCH 2/3] Make logging async signal safe wrt time stamp generation

Daniel Veillard veillard at redhat.com
Wed Nov 30 08:02:56 UTC 2011


On Tue, Nov 29, 2011 at 04:21:46PM +0000, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
> 
> Use the new virTimeStringNowRaw() API for generating log timestamps
> in an async signal safe manner
> 
> * src/util/logging.c: Use virTimeStringNowRaw
> ---
>  src/util/logging.c |   28 ++++------------------------
>  1 files changed, 4 insertions(+), 24 deletions(-)
> 
> diff --git a/src/util/logging.c b/src/util/logging.c
> index 17c7e84..f550503 100644
> --- a/src/util/logging.c
> +++ b/src/util/logging.c
> @@ -43,6 +43,7 @@
>  #include "buf.h"
>  #include "threads.h"
>  #include "virfile.h"
> +#include "virtime.h"
>  
>  #define VIR_FROM_THIS VIR_FROM_NONE
>  
> @@ -618,26 +619,6 @@ cleanup:
>      return ret;
>  }
>  
> -static char *
> -virLogFormatTimestamp(void)
> -{
> -    struct timeval cur_time;
> -    struct tm time_info;
> -    char *str = NULL;
> -
> -    gettimeofday(&cur_time, NULL);
> -    localtime_r(&cur_time.tv_sec, &time_info);
> -    time_info.tm_year += 1900;
> -    time_info.tm_mon += 1;
> -
> -    if (virAsprintf(&str, "%4d-%02d-%02d %02d:%02d:%02d.%03d",
> -                    time_info.tm_year, time_info.tm_mon, time_info.tm_mday,
> -                    time_info.tm_hour, time_info.tm_min, time_info.tm_sec,
> -                    (int) (cur_time.tv_usec / 1000)) < 0)
> -        return NULL;
> -
> -    return str;
> -}
>  
>  static int
>  virLogFormatString(char **msg,
> @@ -705,7 +686,7 @@ void virLogMessage(const char *category, int priority, const char *funcname,
>      static bool logVersionStderr = true;
>      char *str = NULL;
>      char *msg = NULL;
> -    char *timestamp = NULL;
> +    char timestamp[VIR_TIME_STRING_BUFLEN];

  Okay, I had to go back to the definition to make sure it includes the
terminating 0, maybe fix the comment in [1/3] of VIR_TIME_STRING_BUFLEN
to use NUL and not NULL as the later would be the size of a pointer ;-)

>      int fprio, i, ret;
>      int saved_errno = errno;
>      int emit = 1;
> @@ -746,8 +727,8 @@ void virLogMessage(const char *category, int priority, const char *funcname,
>      if (ret < 0)
>          goto cleanup;
>  
> -    if (!(timestamp = virLogFormatTimestamp()))
> -        goto cleanup;
> +    if (virTimeStringNowRaw(timestamp) < 0)
> +        timestamp[0] = '\0';
>  
>      /*
>       * Log based on defaults, first store in the history buffer,
> @@ -799,7 +780,6 @@ void virLogMessage(const char *category, int priority, const char *funcname,
>  
>  cleanup:
>      VIR_FREE(msg);
> -    VIR_FREE(timestamp);
>      errno = saved_errno;
>  }
>  

  ACK

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list