diff options
Diffstat (limited to 'intl/icu-patches/bug-1172609-timezone-recreateDefault.diff')
-rw-r--r-- | intl/icu-patches/bug-1172609-timezone-recreateDefault.diff | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/intl/icu-patches/bug-1172609-timezone-recreateDefault.diff b/intl/icu-patches/bug-1172609-timezone-recreateDefault.diff new file mode 100644 index 000000000..132b14ff6 --- /dev/null +++ b/intl/icu-patches/bug-1172609-timezone-recreateDefault.diff @@ -0,0 +1,85 @@ +# Adds threadsafe recreateDefault() method to ICU::Timezone. + +diff --git a/intl/icu/source/i18n/timezone.cpp b/intl/icu/source/i18n/timezone.cpp +--- a/intl/icu/source/i18n/timezone.cpp ++++ b/intl/icu/source/i18n/timezone.cpp +@@ -108,16 +108,19 @@ static const UChar WORLD[] = {0x + static const UChar GMT_ID[] = {0x47, 0x4D, 0x54, 0x00}; /* "GMT" */ + static const UChar UNKNOWN_ZONE_ID[] = {0x45, 0x74, 0x63, 0x2F, 0x55, 0x6E, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x00}; /* "Etc/Unknown" */ + static const int32_t GMT_ID_LENGTH = 3; + static const int32_t UNKNOWN_ZONE_ID_LENGTH = 11; + + static icu::TimeZone* DEFAULT_ZONE = NULL; + static icu::UInitOnce gDefaultZoneInitOnce = U_INITONCE_INITIALIZER; + ++// Prevents DEFAULT_ZONE from being deleted while another thread is cloning it. ++static UMutex gDefaultZoneMutex = U_MUTEX_INITIALIZER; ++ + static icu::TimeZone* _GMT = NULL; + static icu::TimeZone* _UNKNOWN_ZONE = NULL; + static icu::UInitOnce gStaticZonesInitOnce = U_INITONCE_INITIALIZER; + + static char TZDATA_VERSION[16]; + static icu::UInitOnce gTZDataVersionInitOnce = U_INITONCE_INITIALIZER; + + static int32_t* MAP_SYSTEM_ZONES = NULL; +@@ -554,26 +557,36 @@ static void U_CALLCONV initDefault() + } + + // ------------------------------------- + + TimeZone* U_EXPORT2 + TimeZone::createDefault() + { + umtx_initOnce(gDefaultZoneInitOnce, initDefault); ++ ++ Mutex mutex_lock(&gDefaultZoneMutex); + return (DEFAULT_ZONE != NULL) ? DEFAULT_ZONE->clone() : NULL; + } + ++void ++TimeZone::recreateDefault() ++{ ++ TimeZone *default_zone = TimeZone::detectHostTimeZone(); ++ adoptDefault(default_zone); ++} ++ + // ------------------------------------- + + void U_EXPORT2 + TimeZone::adoptDefault(TimeZone* zone) + { + if (zone != NULL) + { ++ Mutex mutex_lock(&gDefaultZoneMutex); + TimeZone *old = DEFAULT_ZONE; + DEFAULT_ZONE = zone; + delete old; + ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup); + } + } + // ------------------------------------- + +diff --git a/intl/icu/source/i18n/unicode/timezone.h b/intl/icu/source/i18n/unicode/timezone.h +--- a/intl/icu/source/i18n/unicode/timezone.h ++++ b/intl/icu/source/i18n/unicode/timezone.h +@@ -299,16 +299,19 @@ public: + * and made the default. + * + * @return A default TimeZone. Clients are responsible for deleting the time zone + * object returned. + * @stable ICU 2.0 + */ + static TimeZone* U_EXPORT2 createDefault(void); + ++#define ICU_TZ_HAS_RECREATE_DEFAULT ++ static void U_EXPORT2 recreateDefault(); ++ + /** + * Sets the default time zone (i.e., what's returned by createDefault()) to be the + * specified time zone. If NULL is specified for the time zone, the default time + * zone is set to the default host time zone. This call adopts the TimeZone object + * passed in; the client is no longer responsible for deleting it. + * + * <p>This function is not thread safe. It is an error for multiple threads + * to concurrently attempt to set the default time zone, or for any thread |