OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/os.h" | 5 #include "vm/os.h" |
6 | 6 |
7 #include <time.h> | 7 #include <time.h> |
8 | 8 |
9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
10 | 10 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 tm->tm_wday = -1; | 47 tm->tm_wday = -1; |
48 time_t seconds = mktime(tm); | 48 time_t seconds = mktime(tm); |
49 if ((seconds == -1) && (tm->tm_wday == -1)) { | 49 if ((seconds == -1) && (tm->tm_wday == -1)) { |
50 return false; | 50 return false; |
51 } | 51 } |
52 *seconds_result = seconds; | 52 *seconds_result = seconds; |
53 return true; | 53 return true; |
54 } | 54 } |
55 | 55 |
56 | 56 |
| 57 // Calls _tzset if necessary. |
| 58 static void TzSet() { |
| 59 static bool tz_is_initialized = false; |
| 60 if (!tz_is_initialized) { |
| 61 _tzset(); |
| 62 tz_is_initialized = true; |
| 63 } |
| 64 } |
| 65 |
| 66 |
| 67 int GetDaylightSavingOffsetInSeconds() { |
| 68 TzSet(); |
| 69 TIME_ZONE_INFORMATION zone_information; |
| 70 memset(&zone_information, 0, sizeof(zone_information)); |
| 71 if (GetTimeZoneInformation(&zone_information) == TIME_ZONE_ID_INVALID) { |
| 72 // By default the daylight saving offset is an hour. |
| 73 return -60 * 60; |
| 74 } else { |
| 75 return static_cast<int>(zone_information.DaylightBias * 60); |
| 76 } |
| 77 } |
| 78 |
| 79 bool OS::GetTimeZoneName(int64_t seconds_since_epoch, |
| 80 const char** name_result) { |
| 81 tm decomposed; |
| 82 bool succeeded = LocalTime(seconds_since_epoch, &decomposed); |
| 83 if (!succeeded) return false; |
| 84 int inDaylightSavingsTime = decomposed.tm_isdst; |
| 85 if (inDaylightSavingsTime != 0 && inDaylightSavingsTime != 1) { |
| 86 return false; |
| 87 } |
| 88 *name_result = _tzname[inDaylightSavingsTime]; |
| 89 return true; |
| 90 } |
| 91 |
| 92 |
| 93 bool OS::GetTimeZoneOffsetInSeconds(int64_t seconds_since_epoch, |
| 94 int* offset_result) { |
| 95 tm decomposed; |
| 96 bool succeeded = LocalTime(seconds_since_epoch, &decomposed); |
| 97 if (!succeeded) return false; |
| 98 int inDaylightSavingsTime = decomposed.tm_isdst; |
| 99 if (inDaylightSavingsTime != 0 && inDaylightSavingsTime != 1) return false; |
| 100 TzSet(); |
| 101 // Dart and Windows disagree on the sign of the bias. |
| 102 *offset_result = static_cast<int>(-_timezone); |
| 103 if (inDaylightSavingsTime == 1) { |
| 104 static int daylight_offset = GetDaylightSavingOffsetInSeconds() |
| 105 // Subtract because windows and Dart disagree on the sign. |
| 106 *offset_result -= daylight_offset; |
| 107 } |
| 108 return true; |
| 109 } |
| 110 |
| 111 |
57 int64_t OS::GetCurrentTimeMillis() { | 112 int64_t OS::GetCurrentTimeMillis() { |
58 return GetCurrentTimeMicros() / 1000; | 113 return GetCurrentTimeMicros() / 1000; |
59 } | 114 } |
60 | 115 |
61 | 116 |
62 int64_t OS::GetCurrentTimeMicros() { | 117 int64_t OS::GetCurrentTimeMicros() { |
63 static const int64_t kTimeEpoc = 116444736000000000LL; | 118 static const int64_t kTimeEpoc = 116444736000000000LL; |
64 static const int64_t kTimeScaler = 10; // 100 ns to us. | 119 static const int64_t kTimeScaler = 10; // 100 ns to us. |
65 | 120 |
66 // Although win32 uses 64-bit integers for representing timestamps, | 121 // Although win32 uses 64-bit integers for representing timestamps, |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 void OS::Abort() { | 251 void OS::Abort() { |
197 abort(); | 252 abort(); |
198 } | 253 } |
199 | 254 |
200 | 255 |
201 void OS::Exit(int code) { | 256 void OS::Exit(int code) { |
202 exit(code); | 257 exit(code); |
203 } | 258 } |
204 | 259 |
205 } // namespace dart | 260 } // namespace dart |
OLD | NEW |