diff options
author | Philip Withnall <philip@tecnocode.co.uk> | 2023-08-21 10:28:16 +0000 |
---|---|---|
committer | Philip Withnall <philip@tecnocode.co.uk> | 2023-08-21 10:28:16 +0000 |
commit | 0c1e719bdbcffde21258545867418db7717d9f53 (patch) | |
tree | 27c7aa5763175b2c9ae4f5b8cf152ba565db5eca | |
parent | 5ffc23605c0708759054ee4ef7e7178cf51ce229 (diff) | |
parent | 84c9d887eeb5efb2f8297f73ef71d0f36efaef6a (diff) | |
download | glib-0c1e719bdbcffde21258545867418db7717d9f53.tar.gz |
Merge branch 'th/use-localtime-r' into 'main'
[th/use-localtime-r] use localtime_r() in g_log_writer_format_fields()
See merge request GNOME/glib!3543
-rw-r--r-- | glib/gdate.c | 69 | ||||
-rw-r--r-- | glib/gmessages.c | 16 | ||||
-rw-r--r-- | glib/gutilsprivate.h | 4 |
3 files changed, 57 insertions, 32 deletions
diff --git a/glib/gdate.c b/glib/gdate.c index 85892ec9b..f60ec0cbf 100644 --- a/glib/gdate.c +++ b/glib/gdate.c @@ -53,6 +53,7 @@ #include "gtestutils.h" #include "gthread.h" #include "gunicode.h" +#include "gutilsprivate.h" #ifdef G_OS_WIN32 #include "garray.h" @@ -1403,6 +1404,33 @@ g_date_set_parse (GDate *d, G_UNLOCK (g_date_global); } +gboolean +_g_localtime (time_t timet, struct tm *out_tm) +{ + gboolean success = TRUE; + +#ifdef HAVE_LOCALTIME_R + if (!localtime_r (&timet, out_tm)) + success = FALSE; +#else + { + struct tm *ptm = localtime (&timet); + + if (ptm == NULL) + { + /* Happens at least in Microsoft's C library if you pass a + * negative time_t. + */ + success = FALSE; + } + else + memcpy (out_tm, ptm, sizeof (struct tm)); + } +#endif + + return success; +} + /** * g_date_set_time_t: * @date: a #GDate @@ -1427,33 +1455,21 @@ g_date_set_time_t (GDate *date, time_t timet) { struct tm tm; - + gboolean success; + g_return_if_fail (date != NULL); - -#ifdef HAVE_LOCALTIME_R - localtime_r (&timet, &tm); -#else - { - struct tm *ptm = localtime (&timet); - if (ptm == NULL) - { - /* Happens at least in Microsoft's C library if you pass a - * negative time_t. Use 2000-01-01 as default date. - */ -#ifndef G_DISABLE_CHECKS - g_return_if_fail_warning (G_LOG_DOMAIN, "g_date_set_time", "ptm != NULL"); -#endif + success = _g_localtime (timet, &tm); + if (!success) + { + /* Still set a default date, 2000-01-01. + * + * We may assert out below. */ + tm.tm_mon = 0; + tm.tm_mday = 1; + tm.tm_year = 100; + } - tm.tm_mon = 0; - tm.tm_mday = 1; - tm.tm_year = 100; - } - else - memcpy ((void *) &tm, (void *) ptm, sizeof(struct tm)); - } -#endif - date->julian = FALSE; date->month = tm.tm_mon + 1; @@ -1463,6 +1479,11 @@ g_date_set_time_t (GDate *date, g_return_if_fail (g_date_valid_dmy (date->day, date->month, date->year)); date->dmy = TRUE; + +#ifndef G_DISABLE_CHECKS + if (!success) + g_return_if_fail_warning (G_LOG_DOMAIN, "g_date_set_time", "localtime() == NULL"); +#endif } diff --git a/glib/gmessages.c b/glib/gmessages.c index 45906a754..5460dcf4b 100644 --- a/glib/gmessages.c +++ b/glib/gmessages.c @@ -186,22 +186,23 @@ #include <sys/uio.h> #endif -#include "glib-init.h" #include "galloca.h" #include "gbacktrace.h" #include "gcharset.h" #include "gconvert.h" #include "genviron.h" +#include "glib-init.h" #include "glib-private.h" #include "gmain.h" #include "gmem.h" +#include "gpattern.h" #include "gprintfint.h" -#include "gtestutils.h" -#include "gthread.h" #include "gstrfuncs.h" #include "gstring.h" -#include "gpattern.h" +#include "gtestutils.h" +#include "gthread.h" #include "gthreadprivate.h" +#include "gutilsprivate.h" #if defined(__linux__) && !defined(__BIONIC__) #include "gjournal-private.h" @@ -2260,7 +2261,7 @@ g_log_writer_format_fields (GLogLevelFlags log_level, GString *gstring; gint64 now; time_t now_secs; - struct tm *now_tm; + struct tm now_tm; gchar time_buf[128]; /* Extract some common fields. */ @@ -2313,9 +2314,8 @@ g_log_writer_format_fields (GLogLevelFlags log_level, /* Timestamp */ now = g_get_real_time (); now_secs = (time_t) (now / 1000000); - now_tm = localtime (&now_secs); - if (G_LIKELY (now_tm != NULL)) - strftime (time_buf, sizeof (time_buf), "%H:%M:%S", now_tm); + if (_g_localtime (now_secs, &now_tm)) + strftime (time_buf, sizeof (time_buf), "%H:%M:%S", &now_tm); else strcpy (time_buf, "(error)"); diff --git a/glib/gutilsprivate.h b/glib/gutilsprivate.h index 24c199305..b4f1b984a 100644 --- a/glib/gutilsprivate.h +++ b/glib/gutilsprivate.h @@ -26,6 +26,8 @@ #include "gtypes.h" #include "gtestutils.h" +#include <time.h> + G_BEGIN_DECLS void g_set_user_dirs (const gchar *first_dir_type, @@ -55,6 +57,8 @@ g_nearest_pow (gsize num) void _g_unset_cached_tmp_dir (void); +gboolean _g_localtime (time_t timet, struct tm *tm); + G_END_DECLS #endif /* __G_UTILS_PRIVATE_H__ */ |