[evolution-data-server/gnome-3-2] Pre-load all built-in timezones in libical on calendar factory start
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/gnome-3-2] Pre-load all built-in timezones in libical on calendar factory start
- Date: Wed, 23 Nov 2011 08:31:14 +0000 (UTC)
commit af5d404e57f43e58cac037ad3370e31004347c6e
Author: Milan Crha <mcrha redhat com>
Date: Wed Nov 23 09:31:01 2011 +0100
Pre-load all built-in timezones in libical on calendar factory start
This is the same fix as was done in evolution within bug #628139
calendar/libedata-cal/e-data-cal-factory.c | 27 +++++++++++++++++++++++++--
1 files changed, 25 insertions(+), 2 deletions(-)
---
diff --git a/calendar/libedata-cal/e-data-cal-factory.c b/calendar/libedata-cal/e-data-cal-factory.c
index 4413341..df3e136 100644
--- a/calendar/libedata-cal/e-data-cal-factory.c
+++ b/calendar/libedata-cal/e-data-cal-factory.c
@@ -52,9 +52,7 @@
#include "e-gdbus-cal-factory.h"
-#ifdef HAVE_ICAL_UNKNOWN_TOKEN_HANDLING
#include <libical/ical.h>
-#endif
#ifdef G_OS_WIN32
#include <windows.h>
@@ -1007,6 +1005,8 @@ main (gint argc,
EDataCalFactory *factory;
guint owner_id;
GError *error = NULL;
+ icalarray *builtin_timezones;
+ gint ii;
#ifdef G_OS_WIN32
/* Reduce risks */
@@ -1057,6 +1057,29 @@ main (gint argc,
ical_set_unknown_token_handling_setting (ICAL_DISCARD_TOKEN);
#endif
+ /* XXX Pre-load all built-in timezones in libical.
+ *
+ * Built-in time zones in libical 0.43 are loaded on demand,
+ * but not in a thread-safe manner, resulting in a race when
+ * multiple threads call icaltimezone_load_builtin_timezone()
+ * on the same time zone. Until built-in time zone loading
+ * in libical is made thread-safe, work around the issue by
+ * loading all built-in time zones now, so libical's internal
+ * time zone array will be fully populated before any threads
+ * are spawned.
+ */
+ builtin_timezones = icaltimezone_get_builtin_timezones ();
+ for (ii = 0; ii < builtin_timezones->num_elements; ii++) {
+ icaltimezone *zone;
+
+ zone = icalarray_element_at (builtin_timezones, ii);
+
+ /* We don't care about the component right now,
+ * we just need some function that will trigger
+ * icaltimezone_load_builtin_timezone(). */
+ icaltimezone_get_component (zone);
+ }
+
factory = g_object_new (E_TYPE_DATA_CAL_FACTORY, NULL);
loop = g_main_loop_new (NULL, FALSE);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]