Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1101)

Unified Diff: patches/tzdetect.patch

Issue 1062503003: Cherry pick an upstream cl for host tz detection (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/icu.git@master
Patch Set: add a patch file Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « README.chromium ('k') | source/i18n/timezone.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: patches/tzdetect.patch
diff --git a/patches/tzdetect.patch b/patches/tzdetect.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e31679562be92620d36587fc080198d0b3ea9f45
--- /dev/null
+++ b/patches/tzdetect.patch
@@ -0,0 +1,200 @@
+diff --git a/source/i18n/timezone.cpp b/source/i18n/timezone.cpp
+index 6ed008d..6b3f8d2 100644
+--- a/source/i18n/timezone.cpp
++++ b/source/i18n/timezone.cpp
+@@ -1,6 +1,6 @@
+ /*
+ *******************************************************************************
+-* Copyright (C) 1997-2014, International Business Machines Corporation and
++* Copyright (C) 1997-2015, International Business Machines Corporation and
+ * others. All Rights Reserved.
+ *******************************************************************************
+ *
+@@ -440,21 +440,9 @@ TimeZone::createTimeZone(const UnicodeString& ID)
+
+ // -------------------------------------
+
+-/**
+- * Initialize DEFAULT_ZONE from the system default time zone.
+- * Upon return, DEFAULT_ZONE will not be NULL, unless operator new()
+- * returns NULL.
+- */
+-static void U_CALLCONV initDefault()
++TimeZone* U_EXPORT2
++TimeZone::detectHostTimeZone()
+ {
+- ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup);
+-
+- // If setDefault() has already been called we can skip getting the
+- // default zone information from the system.
+- if (DEFAULT_ZONE != NULL) {
+- return;
+- }
+-
+ // We access system timezone data through TPlatformUtilities,
+ // including tzset(), timezone, and tzname[].
+ int32_t rawOffset = 0;
+@@ -463,16 +451,6 @@ static void U_CALLCONV initDefault()
+ // First, try to create a system timezone, based
+ // on the string ID in tzname[0].
+
+- // NOTE: this code is safely single threaded, being only
+- // run via umtx_initOnce().
+- //
+- // Some of the locale/timezone OS functions may not be thread safe,
+- //
+- // The operating system might actually use ICU to implement timezones.
+- // So we may have ICU calling ICU here, like on AIX.
+- // There shouldn't be a problem with this; initOnce does not hold a mutex
+- // while the init function is being run.
+-
+ uprv_tzset(); // Initialize tz... system data
+
+ // Get the timezone ID from the host. This function should do
+@@ -484,13 +462,13 @@ static void U_CALLCONV initDefault()
+ // Invert sign because UNIX semantics are backwards
+ rawOffset = uprv_timezone() * -U_MILLIS_PER_SECOND;
+
+- TimeZone* default_zone = NULL;
++ TimeZone* hostZone = NULL;
+
+ /* Make sure that the string is NULL terminated to prevent BoundsChecker/Purify warnings. */
+ UnicodeString hostStrID(hostID, -1, US_INV);
+ hostStrID.append((UChar)0);
+ hostStrID.truncate(hostStrID.length()-1);
+- default_zone = createSystemTimeZone(hostStrID);
++ hostZone = createSystemTimeZone(hostStrID);
+
+ #if U_PLATFORM_USES_ONLY_WIN32_API
+ // hostID points to a heap-allocated location on Windows.
+@@ -498,30 +476,69 @@ static void U_CALLCONV initDefault()
+ #endif
+
+ int32_t hostIDLen = hostStrID.length();
+- if (default_zone != NULL && rawOffset != default_zone->getRawOffset()
++ if (hostZone != NULL && rawOffset != hostZone->getRawOffset()
+ && (3 <= hostIDLen && hostIDLen <= 4))
+ {
+ // Uh oh. This probably wasn't a good id.
+ // It was probably an ambiguous abbreviation
+- delete default_zone;
+- default_zone = NULL;
++ delete hostZone;
++ hostZone = NULL;
+ }
+
+ // Construct a fixed standard zone with the host's ID
+ // and raw offset.
+- if (default_zone == NULL) {
+- default_zone = new SimpleTimeZone(rawOffset, hostStrID);
++ if (hostZone == NULL) {
++ hostZone = new SimpleTimeZone(rawOffset, hostStrID);
+ }
+
+ // If we _still_ don't have a time zone, use GMT.
+- if (default_zone == NULL) {
++ //
++ // Note: This is extremely unlikely situation. If
++ // new SimpleTimeZone(...) above fails, the following
++ // code may also fail.
++ if (hostZone == NULL) {
+ const TimeZone* temptz = TimeZone::getGMT();
+ // If we can't use GMT, get out.
+ if (temptz == NULL) {
+- return;
++ return NULL;
+ }
+- default_zone = temptz->clone();
++ hostZone = temptz->clone();
++ }
++
++ return hostZone;
++}
++
++// -------------------------------------
++
++/**
++ * Initialize DEFAULT_ZONE from the system default time zone.
++ * Upon return, DEFAULT_ZONE will not be NULL, unless operator new()
++ * returns NULL.
++ */
++static void U_CALLCONV initDefault()
++{
++ ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup);
++
++ // If setDefault() has already been called we can skip getting the
++ // default zone information from the system.
++ if (DEFAULT_ZONE != NULL) {
++ return;
+ }
++
++ // NOTE: this code is safely single threaded, being only
++ // run via umtx_initOnce().
++ //
++ // Some of the locale/timezone OS functions may not be thread safe,
++ //
++ // The operating system might actually use ICU to implement timezones.
++ // So we may have ICU calling ICU here, like on AIX.
++ // There shouldn't be a problem with this; initOnce does not hold a mutex
++ // while the init function is being run.
++
++ // The code detecting the host time zone was separated from this
++ // and implemented as TimeZone::detectHostTimeZone()
++
++ TimeZone *default_zone = TimeZone::detectHostTimeZone();
+
+ // The only way for DEFAULT_ZONE to be non-null at this point is if the user
+ // made a thread-unsafe call to setDefault() or adoptDefault() in another
+diff --git a/source/i18n/unicode/timezone.h b/source/i18n/unicode/timezone.h
+index fa4f5bf..c3356c9 100644
+--- a/source/i18n/unicode/timezone.h
++++ b/source/i18n/unicode/timezone.h
+@@ -1,5 +1,5 @@
+ /*************************************************************************
+-* Copyright (c) 1997-2014, International Business Machines Corporation
++* Copyright (c) 1997-2015, International Business Machines Corporation
+ * and others. All Rights Reserved.
+ **************************************************************************
+ *
+@@ -273,6 +273,23 @@ public:
+ static const UnicodeString U_EXPORT2 getEquivalentID(const UnicodeString& id,
+ int32_t index);
+
++#ifndef U_HIDE_DRAFT_API
++ /**
++ * Creates an instance of TimeZone detected from the current host
++ * system configuration. Note that ICU4C does not change the default
++ * time zone unless TimeZone::adoptDefault(TimeZone*) or
++ * TimeZone::setDefault(const TimeZone&) is explicitly called by a
++ * user. This method does not update the current ICU's default,
++ * and may return a different TimeZone from the one returned by
++ * TimeZone::createDefault().
++ *
++ * @return A new instance of TimeZone detected from the current host system
++ * configuration.
++ * @draft ICU 55
++ */
++ static TimeZone* U_EXPORT2 detectHostTimeZone();
++#endif
++
+ /**
+ * Creates a new copy of the default TimeZone for this host. Unless the default time
+ * zone has already been set using adoptDefault() or setDefault(), the default is
+diff --git a/source/test/intltest/tztest.cpp b/source/test/intltest/tztest.cpp
+index 4111e51..76304e9 100644
+--- a/source/test/intltest/tztest.cpp
++++ b/source/test/intltest/tztest.cpp
+@@ -135,6 +135,13 @@ TimeZoneTest::TestGenericAPI()
+ infoln("WARNING: t_timezone may be incorrect. It is not a multiple of 15min.", tzoffset);
+ }
+
++ TimeZone* hostZone = TimeZone::detectHostTimeZone();
++ /* Host time zone's offset should match the offset returned by uprv_timezone() */
++ if (hostZone->getRawOffset() != tzoffset * (-1000)) {
++ errln("FAIL: detectHostTimeZone()'s raw offset != host timezone's offset");
++ }
++ delete hostZone;
++
+ UErrorCode status = U_ZERO_ERROR;
+ const char* tzver = TimeZone::getTZDataVersion(status);
+ if (U_FAILURE(status)) {
« no previous file with comments | « README.chromium ('k') | source/i18n/timezone.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698