Add patch for chromium-efl. 84/54484/1 accepted/tizen/common/20160321.150452 accepted/tizen/ivi/20160218.024808 accepted/tizen/mobile/20151217.021245 accepted/tizen/mobile/20160321.113405 accepted/tizen/tv/20151217.021241 accepted/tizen/tv/20160321.113424 accepted/tizen/wearable/20151217.021258 accepted/tizen/wearable/20160321.113443 submit/tizen/20151216.070024 submit/tizen/20160321.014821 submit/tizen_common/20151229.142028 submit/tizen_common/20151229.144031 submit/tizen_common/20151229.154718 submit/tizen_ivi/20160217.000000 submit/tizen_ivi/20160217.000005
authorMyungki Lee <mk5004.lee@samsung.com>
Tue, 15 Dec 2015 11:34:08 +0000 (20:34 +0900)
committerMyungki Lee <mk5004.lee@samsung.com>
Tue, 15 Dec 2015 11:34:08 +0000 (20:34 +0900)
1. Add new api what detectHostTimeZone.
2. Reset the global tzname cache.

Change-Id: Iaf9389fd62ca0f475a82877ec07d533fe4a37d47
Signed-off-by: Myungki Lee <mk5004.lee@samsung.com>
source/common/putil.cpp
source/common/putilimp.h
source/i18n/timezone.cpp
source/i18n/unicode/timezone.h
source/test/intltest/tztest.cpp

index 599dad9..0f5090c 100644 (file)
@@ -970,6 +970,15 @@ static char* searchForTZFile(const char* path, DefaultTZInfo* tzInfo) {
     return result;
 }
 #endif
+
+U_CAPI void U_EXPORT2
+uprv_tzname_clear_cache()
+{
+#if defined(CHECK_LOCALTIME_LINK) && !defined(DEBUG_SKIP_LOCALTIME_LINK)
+    gTimeZoneBufferPtr = NULL;
+#endif
+}
+
 U_CAPI const char* U_EXPORT2
 uprv_tzname(int n)
 {
index d2c1c66..e3da340 100644 (file)
@@ -483,6 +483,12 @@ U_INTERNAL int32_t  U_EXPORT2 uprv_timezone(void);
 U_INTERNAL const char* U_EXPORT2 uprv_tzname(int n);
 
 /**
+ * Reset the global tzname cache.
+ * @internal
+ */
+U_INTERNAL void uprv_tzname_clear_cache();
+
+/**
  * Get UTC (GMT) time measured in milliseconds since 0:00 on 1/1/1970.
  * This function is affected by 'faketime' and should be the bottleneck for all user-visible ICU time functions.
  * @return the UTC time measured in milliseconds
index 6ed008d..e45a7f5 100644 (file)
@@ -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,18 +451,10 @@ 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
 
+    uprv_tzname_clear_cache();
+
     // Get the timezone ID from the host.  This function should do
     // any required host-specific remapping; e.g., on Windows this
     // function maps the Date and Time control panel setting to an
@@ -484,13 +464,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,31 +478,70 @@ 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
     // thread while this thread was doing something that required getting the default.
index fa4f5bf..c3356c9 100644 (file)
@@ -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
index 4111e51..76304e9 100644 (file)
@@ -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)) {