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

Side by Side Diff: source/i18n/timezone.cpp

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, 8 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 unified diff | Download patch
« no previous file with comments | « patches/tzdetect.patch ('k') | source/i18n/unicode/timezone.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 ******************************************************************************* 2 *******************************************************************************
3 * Copyright (C) 1997-2014, International Business Machines Corporation and 3 * Copyright (C) 1997-2015, International Business Machines Corporation and
4 * others. All Rights Reserved. 4 * others. All Rights Reserved.
5 ******************************************************************************* 5 *******************************************************************************
6 * 6 *
7 * File TIMEZONE.CPP 7 * File TIMEZONE.CPP
8 * 8 *
9 * Modification History: 9 * Modification History:
10 * 10 *
11 * Date Name Description 11 * Date Name Description
12 * 12/05/96 clhuang Creation. 12 * 12/05/96 clhuang Creation.
13 * 04/21/97 aliu General clean-up and bug fixing. 13 * 04/21/97 aliu General clean-up and bug fixing.
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 } 433 }
434 if (result == 0) { 434 if (result == 0) {
435 U_DEBUG_TZ_MSG(("failed to load time zone with id - falling to Etc/Unkno wn(GMT)")); 435 U_DEBUG_TZ_MSG(("failed to load time zone with id - falling to Etc/Unkno wn(GMT)"));
436 result = getUnknown().clone(); 436 result = getUnknown().clone();
437 } 437 }
438 return result; 438 return result;
439 } 439 }
440 440
441 // ------------------------------------- 441 // -------------------------------------
442 442
443 /** 443 TimeZone* U_EXPORT2
444 * Initialize DEFAULT_ZONE from the system default time zone. 444 TimeZone::detectHostTimeZone()
445 * Upon return, DEFAULT_ZONE will not be NULL, unless operator new()
446 * returns NULL.
447 */
448 static void U_CALLCONV initDefault()
449 { 445 {
450 ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup);
451
452 // If setDefault() has already been called we can skip getting the
453 // default zone information from the system.
454 if (DEFAULT_ZONE != NULL) {
455 return;
456 }
457
458 // We access system timezone data through TPlatformUtilities, 446 // We access system timezone data through TPlatformUtilities,
459 // including tzset(), timezone, and tzname[]. 447 // including tzset(), timezone, and tzname[].
460 int32_t rawOffset = 0; 448 int32_t rawOffset = 0;
461 const char *hostID; 449 const char *hostID;
462 450
463 // First, try to create a system timezone, based 451 // First, try to create a system timezone, based
464 // on the string ID in tzname[0]. 452 // on the string ID in tzname[0].
465 453
466 // NOTE: this code is safely single threaded, being only
467 // run via umtx_initOnce().
468 //
469 // Some of the locale/timezone OS functions may not be thread safe,
470 //
471 // The operating system might actually use ICU to implement timezones.
472 // So we may have ICU calling ICU here, like on AIX.
473 // There shouldn't be a problem with this; initOnce does not hold a mutex
474 // while the init function is being run.
475
476 uprv_tzset(); // Initialize tz... system data 454 uprv_tzset(); // Initialize tz... system data
477 455
478 // Get the timezone ID from the host. This function should do 456 // Get the timezone ID from the host. This function should do
479 // any required host-specific remapping; e.g., on Windows this 457 // any required host-specific remapping; e.g., on Windows this
480 // function maps the Date and Time control panel setting to an 458 // function maps the Date and Time control panel setting to an
481 // ICU timezone ID. 459 // ICU timezone ID.
482 hostID = uprv_tzname(0); 460 hostID = uprv_tzname(0);
483 461
484 // Invert sign because UNIX semantics are backwards 462 // Invert sign because UNIX semantics are backwards
485 rawOffset = uprv_timezone() * -U_MILLIS_PER_SECOND; 463 rawOffset = uprv_timezone() * -U_MILLIS_PER_SECOND;
486 464
487 TimeZone* default_zone = NULL; 465 TimeZone* hostZone = NULL;
488 466
489 /* Make sure that the string is NULL terminated to prevent BoundsChecker/Pur ify warnings. */ 467 /* Make sure that the string is NULL terminated to prevent BoundsChecker/Pur ify warnings. */
490 UnicodeString hostStrID(hostID, -1, US_INV); 468 UnicodeString hostStrID(hostID, -1, US_INV);
491 hostStrID.append((UChar)0); 469 hostStrID.append((UChar)0);
492 hostStrID.truncate(hostStrID.length()-1); 470 hostStrID.truncate(hostStrID.length()-1);
493 default_zone = createSystemTimeZone(hostStrID); 471 hostZone = createSystemTimeZone(hostStrID);
494 472
495 #if U_PLATFORM_USES_ONLY_WIN32_API 473 #if U_PLATFORM_USES_ONLY_WIN32_API
496 // hostID points to a heap-allocated location on Windows. 474 // hostID points to a heap-allocated location on Windows.
497 uprv_free(const_cast<char *>(hostID)); 475 uprv_free(const_cast<char *>(hostID));
498 #endif 476 #endif
499 477
500 int32_t hostIDLen = hostStrID.length(); 478 int32_t hostIDLen = hostStrID.length();
501 if (default_zone != NULL && rawOffset != default_zone->getRawOffset() 479 if (hostZone != NULL && rawOffset != hostZone->getRawOffset()
502 && (3 <= hostIDLen && hostIDLen <= 4)) 480 && (3 <= hostIDLen && hostIDLen <= 4))
503 { 481 {
504 // Uh oh. This probably wasn't a good id. 482 // Uh oh. This probably wasn't a good id.
505 // It was probably an ambiguous abbreviation 483 // It was probably an ambiguous abbreviation
506 delete default_zone; 484 delete hostZone;
507 default_zone = NULL; 485 hostZone = NULL;
508 } 486 }
509 487
510 // Construct a fixed standard zone with the host's ID 488 // Construct a fixed standard zone with the host's ID
511 // and raw offset. 489 // and raw offset.
512 if (default_zone == NULL) { 490 if (hostZone == NULL) {
513 default_zone = new SimpleTimeZone(rawOffset, hostStrID); 491 hostZone = new SimpleTimeZone(rawOffset, hostStrID);
514 } 492 }
515 493
516 // If we _still_ don't have a time zone, use GMT. 494 // If we _still_ don't have a time zone, use GMT.
517 if (default_zone == NULL) { 495 //
496 // Note: This is extremely unlikely situation. If
497 // new SimpleTimeZone(...) above fails, the following
498 // code may also fail.
499 if (hostZone == NULL) {
518 const TimeZone* temptz = TimeZone::getGMT(); 500 const TimeZone* temptz = TimeZone::getGMT();
519 // If we can't use GMT, get out. 501 // If we can't use GMT, get out.
520 if (temptz == NULL) { 502 if (temptz == NULL) {
521 return; 503 return NULL;
522 } 504 }
523 default_zone = temptz->clone(); 505 hostZone = temptz->clone();
524 } 506 }
525 507
508 return hostZone;
509 }
510
511 // -------------------------------------
512
513 /**
514 * Initialize DEFAULT_ZONE from the system default time zone.
515 * Upon return, DEFAULT_ZONE will not be NULL, unless operator new()
516 * returns NULL.
517 */
518 static void U_CALLCONV initDefault()
519 {
520 ucln_i18n_registerCleanup(UCLN_I18N_TIMEZONE, timeZone_cleanup);
521
522 // If setDefault() has already been called we can skip getting the
523 // default zone information from the system.
524 if (DEFAULT_ZONE != NULL) {
525 return;
526 }
527
528 // NOTE: this code is safely single threaded, being only
529 // run via umtx_initOnce().
530 //
531 // Some of the locale/timezone OS functions may not be thread safe,
532 //
533 // The operating system might actually use ICU to implement timezones.
534 // So we may have ICU calling ICU here, like on AIX.
535 // There shouldn't be a problem with this; initOnce does not hold a mutex
536 // while the init function is being run.
537
538 // The code detecting the host time zone was separated from this
539 // and implemented as TimeZone::detectHostTimeZone()
540
541 TimeZone *default_zone = TimeZone::detectHostTimeZone();
542
526 // The only way for DEFAULT_ZONE to be non-null at this point is if the user 543 // The only way for DEFAULT_ZONE to be non-null at this point is if the user
527 // made a thread-unsafe call to setDefault() or adoptDefault() in another 544 // made a thread-unsafe call to setDefault() or adoptDefault() in another
528 // thread while this thread was doing something that required getting the de fault. 545 // thread while this thread was doing something that required getting the de fault.
529 U_ASSERT(DEFAULT_ZONE == NULL); 546 U_ASSERT(DEFAULT_ZONE == NULL);
530 547
531 DEFAULT_ZONE = default_zone; 548 DEFAULT_ZONE = default_zone;
532 } 549 }
533 550
534 // ------------------------------------- 551 // -------------------------------------
535 552
(...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after
1667 return id; 1684 return id;
1668 } 1685 }
1669 #endif /* U_HIDE_DRAFT_API */ 1686 #endif /* U_HIDE_DRAFT_API */
1670 1687
1671 1688
1672 U_NAMESPACE_END 1689 U_NAMESPACE_END
1673 1690
1674 #endif /* #if !UCONFIG_NO_FORMATTING */ 1691 #endif /* #if !UCONFIG_NO_FORMATTING */
1675 1692
1676 //eof 1693 //eof
OLDNEW
« no previous file with comments | « patches/tzdetect.patch ('k') | source/i18n/unicode/timezone.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698