summaryrefslogtreecommitdiff
blob: b7cf9d614c602ace32ca0f6053b8f630e7091a68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
From af5d404e57f43e58cac037ad3370e31004347c6e Mon Sep 17 00:00:00 2001
From: Milan Crha <mcrha@redhat.com>
Date: Wed, 23 Nov 2011 09:31:01 +0100
Subject: [PATCH] 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);
-- 
1.7.8.1