105ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5e014e5bf9ccd6a759add3b35ba610f3a0c752a90machenbach@chromium.org// Platform-specific code for Win32. 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 72f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org// Secure API functions are not available using MinGW with msvcrt.dll 82f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org// on Windows XP. Make sure MINGW_HAS_SECURE_API is not defined to 92f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org// disable definition of secure API functions in standard headers that 102f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org// would conflict with our own implementation. 112f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#ifdef __MINGW32__ 122f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#include <_mingw.h> 132f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#ifdef MINGW_HAS_SECURE_API 142f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#undef MINGW_HAS_SECURE_API 152f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#endif // MINGW_HAS_SECURE_API 162f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#endif // __MINGW32__ 172f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 185de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#ifdef _MSC_VER 195de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include <limits> 205de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#endif 215de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org 221e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#include "src/base/win32-headers.h" 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2421d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org#include "src/base/bits.h" 25c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org#include "src/base/lazy-instance.h" 265de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/macros.h" 275de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h" 285de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/time.h" 295de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/utils/random-number-generator.h" 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 31245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#ifdef _MSC_VER 3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Case-insensitive bounded string comparisons. Use stricmp() on Win32. Usually 3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// defined in strings.h. 3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint strncasecmp(const char* s1, const char* s2, int n) { 36b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return _strnicmp(s1, s2, n); 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 39245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#endif // _MSC_VER 40245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 41245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 42245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// Extra functions for MinGW. Most of these are the _s functions which are in 43245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// the Microsoft Visual Studio C++ CRT. 44245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#ifdef __MINGW32__ 45245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 46fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org 47fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#ifndef __MINGW64_VERSION_MAJOR 48fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org 49fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#define _TRUNCATE 0 50fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#define STRUNCATE 80 51fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org 52fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orginline void MemoryBarrier() { 53fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org int barrier = 0; 54fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org __asm__ __volatile__("xchgl %%eax,%0 ":"=r" (barrier)); 55fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org} 56fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org 57fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org#endif // __MINGW64_VERSION_MAJOR 58fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org 59fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.org 60245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgint localtime_s(tm* out_tm, const time_t* time) { 61245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org tm* posix_local_time_struct = localtime(time); 62245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org if (posix_local_time_struct == NULL) return 1; 63245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org *out_tm = *posix_local_time_struct; 64245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org return 0; 65245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org} 66245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 67245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 68245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgint fopen_s(FILE** pFile, const char* filename, const char* mode) { 69245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org *pFile = fopen(filename, mode); 70245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org return *pFile != NULL ? 0 : 1; 71245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org} 72245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 73245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgint _vsnprintf_s(char* buffer, size_t sizeOfBuffer, size_t count, 74245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org const char* format, va_list argptr) { 75e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(count == _TRUNCATE); 76245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org return _vsnprintf(buffer, sizeOfBuffer, format, argptr); 77245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org} 78245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 79245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 806db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.orgint strncpy_s(char* dest, size_t dest_size, const char* source, size_t count) { 816db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org CHECK(source != NULL); 826db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org CHECK(dest != NULL); 836db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org CHECK_GT(dest_size, 0); 846db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org 856db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org if (count == _TRUNCATE) { 866db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org while (dest_size > 0 && *source != 0) { 876db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org *(dest++) = *(source++); 886db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org --dest_size; 896db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 906db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org if (dest_size == 0) { 916db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org *(dest - 1) = 0; 926db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org return STRUNCATE; 936db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 946db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } else { 956db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org while (dest_size > 0 && count > 0 && *source != 0) { 966db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org *(dest++) = *(source++); 976db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org --dest_size; 986db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org --count; 996db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 1006db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org } 1016db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org CHECK_GT(dest_size, 0); 1026db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org *dest = 0; 103245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org return 0; 104245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org} 105245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 106245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#endif // __MINGW32__ 107245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 10871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 1095de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgnamespace base { 11043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 111248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgnamespace { 112248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 113248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgbool g_hard_abort = false; 114248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 115248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org} // namespace 116248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 1176b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgclass TimezoneCache { 1186b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org public: 1196b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org TimezoneCache() : initialized_(false) { } 1206b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 1216b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org void Clear() { 1226b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org initialized_ = false; 1236b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 1246b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 1256b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // Initialize timezone information. The timezone information is obtained from 1266b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // windows. If we cannot get the timezone information we fall back to CET. 1276b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org void InitializeIfNeeded() { 1286b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // Just return if timezone information has already been initialized. 1296b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org if (initialized_) return; 1306b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 1316b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // Initialize POSIX time zone data. 1326b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org _tzset(); 1336b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // Obtain timezone information from operating system. 1346b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org memset(&tzinfo_, 0, sizeof(tzinfo_)); 1356b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org if (GetTimeZoneInformation(&tzinfo_) == TIME_ZONE_ID_INVALID) { 1366b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // If we cannot get timezone information we fall back to CET. 1376b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org tzinfo_.Bias = -60; 1386b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org tzinfo_.StandardDate.wMonth = 10; 1396b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org tzinfo_.StandardDate.wDay = 5; 1406b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org tzinfo_.StandardDate.wHour = 3; 1416b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org tzinfo_.StandardBias = 0; 1426b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org tzinfo_.DaylightDate.wMonth = 3; 1436b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org tzinfo_.DaylightDate.wDay = 5; 1446b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org tzinfo_.DaylightDate.wHour = 2; 1456b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org tzinfo_.DaylightBias = -60; 1466b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 1476b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 1486b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // Make standard and DST timezone names. 1496b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org WideCharToMultiByte(CP_UTF8, 0, tzinfo_.StandardName, -1, 1506b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org std_tz_name_, kTzNameSize, NULL, NULL); 1516b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org std_tz_name_[kTzNameSize - 1] = '\0'; 1526b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org WideCharToMultiByte(CP_UTF8, 0, tzinfo_.DaylightName, -1, 1536b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org dst_tz_name_, kTzNameSize, NULL, NULL); 1546b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org dst_tz_name_[kTzNameSize - 1] = '\0'; 1556b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 1566b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // If OS returned empty string or resource id (like "@tzres.dll,-211") 1576b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // simply guess the name from the UTC bias of the timezone. 1586b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // To properly resolve the resource identifier requires a library load, 1596b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // which is not possible in a sandbox. 1606b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org if (std_tz_name_[0] == '\0' || std_tz_name_[0] == '@') { 16170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org OS::SNPrintF(std_tz_name_, kTzNameSize - 1, 1626b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org "%s Standard Time", 1636b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org GuessTimezoneNameFromBias(tzinfo_.Bias)); 1646b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 1656b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org if (dst_tz_name_[0] == '\0' || dst_tz_name_[0] == '@') { 16670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org OS::SNPrintF(dst_tz_name_, kTzNameSize - 1, 1676b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org "%s Daylight Time", 1686b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org GuessTimezoneNameFromBias(tzinfo_.Bias)); 1696b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 1706b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // Timezone information initialized. 1716b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org initialized_ = true; 1726b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 1736b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 1746b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // Guess the name of the timezone from the bias. 1756b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org // The guess is very biased towards the northern hemisphere. 1766b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org const char* GuessTimezoneNameFromBias(int bias) { 1776b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org static const int kHour = 60; 1786b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org switch (-bias) { 1796b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case -9*kHour: return "Alaska"; 1806b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case -8*kHour: return "Pacific"; 1816b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case -7*kHour: return "Mountain"; 1826b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case -6*kHour: return "Central"; 1836b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case -5*kHour: return "Eastern"; 1846b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case -4*kHour: return "Atlantic"; 1856b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case 0*kHour: return "GMT"; 1866b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case +1*kHour: return "Central Europe"; 1876b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case +2*kHour: return "Eastern Europe"; 1886b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case +3*kHour: return "Russia"; 1896b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case +5*kHour + 30: return "India"; 1906b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case +8*kHour: return "China"; 1916b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case +9*kHour: return "Japan"; 1926b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org case +12*kHour: return "New Zealand"; 1936b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org default: return "Local"; 1946b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 1956b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org } 1966b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 1976b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 1986b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org private: 1996b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org static const int kTzNameSize = 128; 2006b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org bool initialized_; 2016b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org char std_tz_name_[kTzNameSize]; 2026b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org char dst_tz_name_[kTzNameSize]; 2036b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org TIME_ZONE_INFORMATION tzinfo_; 2046b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org friend class Win32Time; 2056b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org}; 2066b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 2076b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ---------------------------------------------------------------------------- 20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The Time class represents time on win32. A timestamp is represented as 2102efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org// a 64-bit integer in 100 nanoseconds since January 1, 1601 (UTC). JavaScript 21143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// timestamps are represented as a doubles in milliseconds since 00:00:00 UTC, 21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// January 1, 1970. 21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 214dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.orgclass Win32Time { 21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Constructors. 2178e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org Win32Time(); 218dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org explicit Win32Time(double jstime); 219dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org Win32Time(int year, int mon, int day, int hour, int min, int sec); 22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Convert timestamp to JavaScript representation. 22243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen double ToJSTime(); 22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2248e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // Set timestamp to current time. 2258e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org void SetToCurrentTime(); 2268e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 22743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the local timezone offset in milliseconds east of UTC. This is 22843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // the number of milliseconds you must add to UTC to get local time, i.e. 22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // LocalOffset(CET) = 3600000 and LocalOffset(PST) = -28800000. This 23043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // routine also takes into account whether daylight saving is effect 23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // at the time. 2326b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org int64_t LocalOffset(TimezoneCache* cache); 23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the daylight savings time offset for the time in milliseconds. 2356b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org int64_t DaylightSavingsOffset(TimezoneCache* cache); 23643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns a string identifying the current timezone for the 23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // timestamp taking into account daylight saving. 2396b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org char* LocalTimezone(TimezoneCache* cache); 240486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org 24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Constants for time conversion. 243245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org static const int64_t kTimeEpoc = 116444736000000000LL; 24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int64_t kTimeScaler = 10000; 24543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const int64_t kMsPerMinute = 60000; 24643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 24743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Constants for timezone information. 24843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static const bool kShortTzNames = false; 24943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Return whether or not daylight savings time is in effect at this time. 2516b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org bool InDST(TimezoneCache* cache); 25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Accessor for FILETIME representation. 25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen FILETIME& ft() { return time_.ft_; } 25543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Accessor for integer representation. 25743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int64_t& t() { return time_.t_; } 25843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Although win32 uses 64-bit integers for representing timestamps, 26043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // these are packed into a FILETIME structure. The FILETIME structure 26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // is just a struct representing a 64-bit integer. The TimeStamp union 26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // allows access to both a FILETIME and an integer representation of 26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // the timestamp. 26443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen union TimeStamp { 26543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen FILETIME ft_; 26643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int64_t t_; 26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 26843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TimeStamp time_; 27043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 27143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 272e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2738e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org// Initialize timestamp to start of epoc. 2748e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.orgWin32Time::Win32Time() { 2758e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org t() = 0; 2768e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org} 2778e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 2788e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 27943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Initialize timestamp from a JavaScript timestamp. 280dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.orgWin32Time::Win32Time(double jstime) { 28141826e77311db718135ef6517b846933dfd275f3ager@chromium.org t() = static_cast<int64_t>(jstime) * kTimeScaler + kTimeEpoc; 28243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Initialize timestamp from date/time components. 286dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.orgWin32Time::Win32Time(int year, int mon, int day, int hour, int min, int sec) { 28743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SYSTEMTIME st; 28843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen st.wYear = year; 28943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen st.wMonth = mon; 29043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen st.wDay = day; 29143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen st.wHour = hour; 29243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen st.wMinute = min; 29343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen st.wSecond = sec; 29443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen st.wMilliseconds = 0; 29543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SystemTimeToFileTime(&st, &ft()); 29643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 29743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 29843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 29943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Convert timestamp to JavaScript timestamp. 300dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.orgdouble Win32Time::ToJSTime() { 30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return static_cast<double>((t() - kTimeEpoc) / kTimeScaler); 30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 30443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3058e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org// Set timestamp to current time. 3068e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.orgvoid Win32Time::SetToCurrentTime() { 3078e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // The default GetSystemTimeAsFileTime has a ~15.5ms resolution. 3088e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // Because we're fast, we like fast timers which have at least a 3098e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // 1ms resolution. 3108e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // 3118e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // timeGetTime() provides 1ms granularity when combined with 3128e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // timeBeginPeriod(). If the host application for v8 wants fast 3138e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // timers, it can use timeBeginPeriod to increase the resolution. 3148e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // 3158e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // Using timeGetTime() has a drawback because it is a 32bit value 3168e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // and hence rolls-over every ~49days. 3178e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // 3188e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // To use the clock, we use GetSystemTimeAsFileTime as our base; 3198e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // and then use timeGetTime to extrapolate current time from the 3208e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // start time. To deal with rollovers, we resync the clock 3218e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // any time when more than kMaxClockElapsedTime has passed or 3228e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // whenever timeGetTime creates a rollover. 3238e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 3248e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org static bool initialized = false; 3258e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org static TimeStamp init_time; 3268e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org static DWORD init_ticks; 3278e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org static const int64_t kHundredNanosecondsPerSecond = 10000000; 3288e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org static const int64_t kMaxClockElapsedTime = 3298e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 60*kHundredNanosecondsPerSecond; // 1 minute 3308e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 3318e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // If we are uninitialized, we need to resync the clock. 3328e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org bool needs_resync = !initialized; 3338e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 3348e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // Get the current time. 3358e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org TimeStamp time_now; 3368e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org GetSystemTimeAsFileTime(&time_now.ft_); 3378e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org DWORD ticks_now = timeGetTime(); 3388e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 3398e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // Check if we need to resync due to clock rollover. 3408e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org needs_resync |= ticks_now < init_ticks; 3418e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 3428e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // Check if we need to resync due to elapsed time. 3438e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org needs_resync |= (time_now.t_ - init_time.t_) > kMaxClockElapsedTime; 3448e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 3458e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // Check if we need to resync due to backwards time change. 3468e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org needs_resync |= time_now.t_ < init_time.t_; 3478e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 3488e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // Resync the clock if necessary. 3498e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org if (needs_resync) { 3508e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org GetSystemTimeAsFileTime(&init_time.ft_); 3518e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org init_ticks = ticks_now = timeGetTime(); 3528e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org initialized = true; 3538e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org } 3548e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 3558e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org // Finally, compute the actual time. Why is this so hard. 3568e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org DWORD elapsed = ticks_now - init_ticks; 3578e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org this->time_.t_ = init_time.t_ + (static_cast<int64_t>(elapsed) * 10000); 3588e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org} 3598e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 3608e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org 36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Return the local timezone offset in milliseconds east of UTC. This 36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// takes into account whether daylight saving is in effect at the time. 363a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Only times in the 32-bit Unix range may be passed to this function. 364a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Also, adding the time-zone offset to the input must not overflow. 3655d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org// The function EquivalentTime() in date.js guarantees this. 3666b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgint64_t Win32Time::LocalOffset(TimezoneCache* cache) { 3676b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org cache->InitializeIfNeeded(); 36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 369dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org Win32Time rounded_to_second(*this); 370a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org rounded_to_second.t() = rounded_to_second.t() / 1000 / kTimeScaler * 371a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1000 * kTimeScaler; 372a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Convert to local time using POSIX localtime function. 373a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Windows XP Service Pack 3 made SystemTimeToTzSpecificLocalTime() 374a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // very slow. Other browsers use localtime(). 375a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 376a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Convert from JavaScript milliseconds past 1/1/1970 0:00:00 to 377a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // POSIX seconds past 1/1/1970 0:00:00. 378a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org double unchecked_posix_time = rounded_to_second.ToJSTime() / 1000; 379a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (unchecked_posix_time > INT_MAX || unchecked_posix_time < 0) { 380a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return 0; 381a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 382a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Because _USE_32BIT_TIME_T is defined, time_t is a 32-bit int. 383a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org time_t posix_time = static_cast<time_t>(unchecked_posix_time); 38443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 385a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Convert to local time, as struct with fields for day, hour, year, etc. 386a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org tm posix_local_time_struct; 387a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (localtime_s(&posix_local_time_struct, &posix_time)) return 0; 38843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3891456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org if (posix_local_time_struct.tm_isdst > 0) { 3906b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return (cache->tzinfo_.Bias + cache->tzinfo_.DaylightBias) * -kMsPerMinute; 3911456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } else if (posix_local_time_struct.tm_isdst == 0) { 3926b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return (cache->tzinfo_.Bias + cache->tzinfo_.StandardBias) * -kMsPerMinute; 3931456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } else { 3946b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return cache->tzinfo_.Bias * -kMsPerMinute; 3951456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 39643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 39743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Return whether or not daylight savings time is in effect at this time. 4006b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgbool Win32Time::InDST(TimezoneCache* cache) { 4016b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org cache->InitializeIfNeeded(); 40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Determine if DST is in effect at the specified time. 40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool in_dst = false; 4056b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org if (cache->tzinfo_.StandardDate.wMonth != 0 || 4066b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org cache->tzinfo_.DaylightDate.wMonth != 0) { 40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get the local timezone offset for the timestamp in milliseconds. 4086b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org int64_t offset = LocalOffset(cache); 40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 41043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Compute the offset for DST. The bias parameters in the timezone info 41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // are specified in minutes. These must be converted to milliseconds. 4126b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org int64_t dstofs = 4136b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org -(cache->tzinfo_.Bias + cache->tzinfo_.DaylightBias) * kMsPerMinute; 41443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // If the local time offset equals the timezone bias plus the daylight 41643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // bias then DST is in effect. 41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen in_dst = offset == dstofs; 41843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return in_dst; 42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4243291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// Return the daylight savings time offset for this time. 4256b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgint64_t Win32Time::DaylightSavingsOffset(TimezoneCache* cache) { 4266b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return InDST(cache) ? 60 * kMsPerMinute : 0; 42743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns a string identifying the current timezone for the 43143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// timestamp taking into account daylight saving. 4326b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgchar* Win32Time::LocalTimezone(TimezoneCache* cache) { 43343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Return the standard or DST time zone name based on whether daylight 43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // saving is in effect at the given time. 4356b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return InDST(cache) ? cache->dst_tz_name_ : cache->std_tz_name_; 43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns the accumulated user time for thread. 44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint OS::GetUserTime(uint32_t* secs, uint32_t* usecs) { 44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen FILETIME dummy; 44243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen uint64_t usertime; 44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Get the amount of time that the thread has executed in user mode. 44543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!GetThreadTimes(GetCurrentThread(), &dummy, &dummy, &dummy, 44643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reinterpret_cast<FILETIME*>(&usertime))) return -1; 44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Adjust the resolution to micro-seconds. 44943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen usertime /= 10; 45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Convert to seconds and microseconds 45243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *secs = static_cast<uint32_t>(usertime / 1000000); 45343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *usecs = static_cast<uint32_t>(usertime % 1000000); 45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 0; 45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns current time as the number of milliseconds since 45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 00:00:00 UTC, January 1, 1970. 46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansendouble OS::TimeCurrentMillis() { 461d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org return Time::Now().ToJsTime(); 46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 46343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4656b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgTimezoneCache* OS::CreateTimezoneCache() { 4666b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return new TimezoneCache(); 4676b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org} 4686b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 4696b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 4706b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgvoid OS::DisposeTimezoneCache(TimezoneCache* cache) { 4716b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org delete cache; 4726b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org} 4736b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 4746b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 4756b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgvoid OS::ClearTimezoneCache(TimezoneCache* cache) { 4766b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org cache->Clear(); 4776b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org} 4786b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 4796b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org 48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns a string identifying the current timezone taking into 48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// account daylight saving. 4826b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgconst char* OS::LocalTimezone(double time, TimezoneCache* cache) { 4836b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return Win32Time(time).LocalTimezone(cache); 48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4877276f14ca716596e0a0d17539516370c1f453847kasper.lund// Returns the local time offset in milliseconds east of UTC without 4887276f14ca716596e0a0d17539516370c1f453847kasper.lund// taking daylight savings time into account. 4896b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgdouble OS::LocalTimeOffset(TimezoneCache* cache) { 4907276f14ca716596e0a0d17539516370c1f453847kasper.lund // Use current time, rounded to the millisecond. 491dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org Win32Time t(TimeCurrentMillis()); 4927276f14ca716596e0a0d17539516370c1f453847kasper.lund // Time::LocalOffset inlcudes any daylight savings offset, so subtract it. 4936b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org return static_cast<double>(t.LocalOffset(cache) - 4946b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org t.DaylightSavingsOffset(cache)); 49543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 49643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 49843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Returns the daylight savings offset in milliseconds for the given 49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// time. 5006b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.orgdouble OS::DaylightSavingsOffset(double time, TimezoneCache* cache) { 5016b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org int64_t offset = Win32Time(time).DaylightSavingsOffset(cache); 50243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return static_cast<double>(offset); 50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 50443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 506ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.orgint OS::GetLastError() { 507ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org return ::GetLastError(); 508ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org} 509ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 510ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org 511657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.orgint OS::GetCurrentProcessId() { 512657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org return static_cast<int>(::GetCurrentProcessId()); 513657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org} 514657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org 515657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org 516d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.orgint OS::GetCurrentThreadId() { 517d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org return static_cast<int>(::GetCurrentThreadId()); 518d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org} 519d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 520d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org 52143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ---------------------------------------------------------------------------- 52243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Win32 console output. 52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// If a Win32 application is linked as a console application it has a normal 52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// standard output and standard error. In this case normal printf works fine 52643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// for output. However, if the application is linked as a GUI application, 52743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the process doesn't have a console, and therefore (debugging) output is lost. 52843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// This is the case if we are embedded in a windows program (like a browser). 52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// In order to be able to get debug output in this case the the debugging 53043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// facility using OutputDebugString. This output goes to the active debugger 53143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// for the process (if any). Else the output can be monitored using DBMON.EXE. 53243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 53343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenenum OutputMode { 53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UNKNOWN, // Output method has not yet been determined. 53543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CONSOLE, // Output is written to stdout. 53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ODS // Output is written to debug facility. 53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 53843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic OutputMode output_mode = UNKNOWN; // Current output mode. 54043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Determine if the process has a console for output. 54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic bool HasConsole() { 54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Only check the first time. Eventual race conditions are not a problem, 54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // because all threads will eventually determine the same mode. 54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (output_mode == UNKNOWN) { 54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // We cannot just check that the standard output is attached to a console 54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // because this would fail if output is redirected to a file. Therefore we 54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // say that a process does not have an output console if either the 55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // standard output handle is invalid or its file type is unknown. 55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (GetStdHandle(STD_OUTPUT_HANDLE) != INVALID_HANDLE_VALUE && 55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)) != FILE_TYPE_UNKNOWN) 55343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen output_mode = CONSOLE; 55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen else 55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen output_mode = ODS; 55643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 55743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return output_mode == CONSOLE; 55843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 55943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 56143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic void VPrintHelper(FILE* stream, const char* format, va_list args) { 56250bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org if ((stream == stdout || stream == stderr) && !HasConsole()) { 56343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // It is important to use safe print here in order to avoid 56443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // overflowing the buffer. We might truncate the output, but this 56543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // does not crash. 56670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org char buffer[4096]; 56770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org OS::VSNPrintF(buffer, sizeof(buffer), format, args); 56870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org OutputDebugStringA(buffer); 56950bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org } else { 57050bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org vfprintf(stream, format, args); 571b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 572b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org} 573b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 574b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 575b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgFILE* OS::FOpen(const char* path, const char* mode) { 576b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org FILE* result; 577b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org if (fopen_s(&result, path, mode) == 0) { 578b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return result; 579b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } else { 580b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return NULL; 58143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 58243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 58343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5850a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgbool OS::Remove(const char* path) { 5860a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org return (DeleteFileA(path) != 0); 5870a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 5880a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 5890a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 590030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.orgFILE* OS::OpenTemporaryFile() { 591030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org // tmpfile_s tries to use the root dir, don't use it. 592030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org char tempPathBuffer[MAX_PATH]; 593030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org DWORD path_result = 0; 594030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org path_result = GetTempPathA(MAX_PATH, tempPathBuffer); 595030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org if (path_result > MAX_PATH || path_result == 0) return NULL; 596030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org UINT name_result = 0; 597030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org char tempNameBuffer[MAX_PATH]; 598030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org name_result = GetTempFileNameA(tempPathBuffer, "", 0, tempNameBuffer); 599030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org if (name_result == 0) return NULL; 600030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org FILE* result = FOpen(tempNameBuffer, "w+"); // Same mode as tmpfile uses. 601030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org if (result != NULL) { 602030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org Remove(tempNameBuffer); // Delete on close. 603030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org } 604030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org return result; 605030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org} 606030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org 607030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org 60871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// Open log file in binary mode to avoid /n -> /r/n conversion. 609ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgconst char* const OS::LogFileOpenMode = "wb"; 61071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 61171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 61243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Print (debug) message to console. 61343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid OS::Print(const char* format, ...) { 61443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen va_list args; 61543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen va_start(args, format); 61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen VPrint(format, args); 61743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen va_end(args); 61843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 61943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 62043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 62143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid OS::VPrint(const char* format, va_list args) { 62243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen VPrintHelper(stdout, format, args); 62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 62543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 626023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.orgvoid OS::FPrint(FILE* out, const char* format, ...) { 627023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org va_list args; 628023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org va_start(args, format); 629023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org VFPrint(out, format, args); 630023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org va_end(args); 631023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org} 632023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 633023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 634023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.orgvoid OS::VFPrint(FILE* out, const char* format, va_list args) { 635023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org VPrintHelper(out, format, args); 636023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org} 637023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 638023421e6892b2ba6dcd2bbee117e0bfb24545cf7whesse@chromium.org 63943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Print error message to console. 64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid OS::PrintError(const char* format, ...) { 64143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen va_list args; 64243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen va_start(args, format); 64343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen VPrintError(format, args); 64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen va_end(args); 64543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 64643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 64743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 64843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid OS::VPrintError(const char* format, va_list args) { 64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen VPrintHelper(stderr, format, args); 65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 65143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 65370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.orgint OS::SNPrintF(char* str, int length, const char* format, ...) { 65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen va_list args; 65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen va_start(args, format); 65670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org int result = VSNPrintF(str, length, format, args); 65743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen va_end(args); 65843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 65943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 66043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 66270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.orgint OS::VSNPrintF(char* str, int length, const char* format, va_list args) { 66370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org int n = _vsnprintf_s(str, length, _TRUNCATE, format, args); 66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Make sure to zero-terminate the string if the output was 66543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // truncated or if there was an error. 66670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org if (n < 0 || n >= length) { 66770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org if (length > 0) 66870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org str[length - 1] = '\0'; 6697276f14ca716596e0a0d17539516370c1f453847kasper.lund return -1; 6707276f14ca716596e0a0d17539516370c1f453847kasper.lund } else { 6717276f14ca716596e0a0d17539516370c1f453847kasper.lund return n; 6727276f14ca716596e0a0d17539516370c1f453847kasper.lund } 67343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 67443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 67543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 676381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgchar* OS::StrChr(char* str, int c) { 677381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org return const_cast<char*>(strchr(str, c)); 678381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org} 679381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 680381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 68170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.orgvoid OS::StrNCpy(char* dest, int length, const char* src, size_t n) { 682ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Use _TRUNCATE or strncpy_s crashes (by design) if buffer is too small. 68370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org size_t buffer_size = static_cast<size_t>(length); 684ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (n + 1 > buffer_size) // count for trailing '\0' 685ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org n = _TRUNCATE; 68670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org int result = strncpy_s(dest, length, src, n); 687b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org USE(result); 688e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(result == 0 || (n == _TRUNCATE && result == STRUNCATE)); 689b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org} 690b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 691b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 6922f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#undef _TRUNCATE 6932f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#undef STRUNCATE 6942f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 69543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 696769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com// Get the system's page size used by VirtualAlloc() or the next power 697769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com// of two. The reason for always returning a power of two is that the 698769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com// rounding up in OS::Allocate expects that. 69943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic size_t GetPageSize() { 70043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static size_t page_size = 0; 70143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (page_size == 0) { 70243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen SYSTEM_INFO info; 70343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GetSystemInfo(&info); 70421d700eedcdd6570eff22ece724b63a5eefe78cbmachenbach@chromium.org page_size = base::bits::RoundUpToPowerOfTwo32(info.dwPageSize); 70543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 70643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return page_size; 70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 70843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 70943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 710769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com// The allocation alignment is the guaranteed alignment for 711769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com// VirtualAlloc'ed blocks of memory. 71243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansensize_t OS::AllocateAlignment() { 713769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com static size_t allocate_alignment = 0; 714769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com if (allocate_alignment == 0) { 715769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com SYSTEM_INFO info; 716769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com GetSystemInfo(&info); 717769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com allocate_alignment = info.dwAllocationGranularity; 718769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com } 719769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com return allocate_alignment; 72043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 72143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 72243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7235de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgstatic LazyInstance<RandomNumberGenerator>::type 724c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org platform_random_number_generator = LAZY_INSTANCE_INITIALIZER; 725c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org 726c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org 727248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgvoid OS::Initialize(int64_t random_seed, bool hard_abort, 728248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org const char* const gc_fake_mmap) { 729248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org if (random_seed) { 730248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org platform_random_number_generator.Pointer()->SetSeed(random_seed); 731248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org } 732248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org g_hard_abort = hard_abort; 733c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org} 734c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org 735c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org 736d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgvoid* OS::GetRandomMmapAddr() { 737c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org // The address range used to randomize RWX allocations in OS::Allocate 738c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org // Try not to map pages into the default range that windows loads DLLs 739c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org // Use a multiple of 64k to prevent committing unused memory. 740c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org // Note: This does not guarantee RWX regions will be within the 741c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org // range kAllocationRandomAddressMin to kAllocationRandomAddressMax 742c3a0197135f4b8e9327e067465b07b7c27cd4941sgjesse@chromium.org#ifdef V8_HOST_ARCH_64_BIT 743c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org static const intptr_t kAllocationRandomAddressMin = 0x0000000080000000; 744c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org static const intptr_t kAllocationRandomAddressMax = 0x000003FFFFFF0000; 745c3a0197135f4b8e9327e067465b07b7c27cd4941sgjesse@chromium.org#else 746c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org static const intptr_t kAllocationRandomAddressMin = 0x04000000; 747c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org static const intptr_t kAllocationRandomAddressMax = 0x3FFF0000; 748c3a0197135f4b8e9327e067465b07b7c27cd4941sgjesse@chromium.org#endif 749c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org uintptr_t address = 750c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org (platform_random_number_generator.Pointer()->NextInt() << kPageSizeBits) | 751c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org kAllocationRandomAddressMin; 752c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org address &= kAllocationRandomAddressMax; 753c3564d8de4ebfc4fa3dc009fc9f6f18968ffcbd7machenbach@chromium.org return reinterpret_cast<void *>(address); 754be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 755be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 756be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 757be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgstatic void* RandomizedVirtualAlloc(size_t size, int action, int protection) { 758be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LPVOID base = NULL; 759be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 760be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org if (protection == PAGE_EXECUTE_READWRITE || protection == PAGE_NOACCESS) { 761be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org // For exectutable pages try and randomize the allocation address 762be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org for (size_t attempts = 0; base == NULL && attempts < 3; ++attempts) { 763d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org base = VirtualAlloc(OS::GetRandomMmapAddr(), size, action, protection); 764be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org } 765be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org } 766be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 767be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org // After three attempts give up and let the OS find an address to use. 768be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org if (base == NULL) base = VirtualAlloc(NULL, size, action, protection); 769be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 770be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org return base; 771be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org} 772be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org 773c3a0197135f4b8e9327e067465b07b7c27cd4941sgjesse@chromium.org 774be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgvoid* OS::Allocate(const size_t requested, 775be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org size_t* allocated, 776be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org bool is_executable) { 77743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // VirtualAlloc rounds allocated size to page size automatically. 778c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org size_t msize = RoundUp(requested, static_cast<int>(GetPageSize())); 77943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 78043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Windows XP SP2 allows Data Excution Prevention (DEP). 781f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org int prot = is_executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; 782c3a0197135f4b8e9327e067465b07b7c27cd4941sgjesse@chromium.org 783be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org LPVOID mbase = RandomizedVirtualAlloc(msize, 784be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org MEM_COMMIT | MEM_RESERVE, 785be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org prot); 786c3a0197135f4b8e9327e067465b07b7c27cd4941sgjesse@chromium.org 7871845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if (mbase == NULL) return NULL; 78843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 789e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org DCHECK((reinterpret_cast<uintptr_t>(mbase) % OS::AllocateAlignment()) == 0); 79043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 79143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *allocated = msize; 79243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return mbase; 79343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 79443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 79543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 796f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.orgvoid OS::Free(void* address, const size_t size) { 79743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // TODO(1240712): VirtualFree has a return value which is ignored here. 798f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org VirtualFree(address, 0, MEM_RELEASE); 799f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org USE(size); 80043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 80143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 80243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 80364e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.orgintptr_t OS::CommitPageSize() { 80464e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org return 4096; 80564e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org} 80664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 80764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org 808d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.orgvoid OS::ProtectCode(void* address, const size_t size) { 809d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org DWORD old_protect; 810d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org VirtualProtect(address, size, PAGE_EXECUTE_READ, &old_protect); 811d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org} 812d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org 813d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org 814717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.orgvoid OS::Guard(void* address, const size_t size) { 815717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org DWORD oldprotect; 816c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org VirtualProtect(address, size, PAGE_NOACCESS, &oldprotect); 817717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org} 818717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 819717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org 82043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid OS::Sleep(int milliseconds) { 82143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ::Sleep(milliseconds); 82243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 82343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 82443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 82543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid OS::Abort() { 826248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org if (g_hard_abort) { 827f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org V8_IMMEDIATE_CRASH(); 828a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 829f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Make the MSVCRT do a silent abort. 830f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org raise(SIGABRT); 83143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 83243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8347276f14ca716596e0a0d17539516370c1f453847kasper.lundvoid OS::DebugBreak() { 835245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#ifdef _MSC_VER 8369259716434187c932704601f700375e53d865de8rossberg@chromium.org // To avoid Visual Studio runtime support the following code can be used 8379259716434187c932704601f700375e53d865de8rossberg@chromium.org // instead 8389259716434187c932704601f700375e53d865de8rossberg@chromium.org // __asm { int 3 } 8397276f14ca716596e0a0d17539516370c1f453847kasper.lund __debugbreak(); 840245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#else 841245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org ::DebugBreak(); 842245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#endif 8437276f14ca716596e0a0d17539516370c1f453847kasper.lund} 8447276f14ca716596e0a0d17539516370c1f453847kasper.lund 8457276f14ca716596e0a0d17539516370c1f453847kasper.lund 84643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Win32MemoryMappedFile : public OS::MemoryMappedFile { 84743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 8480a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org Win32MemoryMappedFile(HANDLE file, 8490a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org HANDLE file_mapping, 8500a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org void* memory, 8510a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org int size) 8520a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org : file_(file), 8530a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org file_mapping_(file_mapping), 8540a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org memory_(memory), 8550a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org size_(size) { } 85643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual ~Win32MemoryMappedFile(); 85743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual void* memory() { return memory_; } 8580a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org virtual int size() { return size_; } 85943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 86043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HANDLE file_; 86143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HANDLE file_mapping_; 86243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void* memory_; 8630a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org int size_; 86443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 86643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8670a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.orgOS::MemoryMappedFile* OS::MemoryMappedFile::open(const char* name) { 8680a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org // Open a physical file 8690a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org HANDLE file = CreateFileA(name, GENERIC_READ | GENERIC_WRITE, 8700a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 8713a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if (file == INVALID_HANDLE_VALUE) return NULL; 8720a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 8730a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org int size = static_cast<int>(GetFileSize(file, NULL)); 8740a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 8750a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org // Create a file mapping for the physical file 8760a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org HANDLE file_mapping = CreateFileMapping(file, NULL, 8770a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org PAGE_READWRITE, 0, static_cast<DWORD>(size), NULL); 8780a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org if (file_mapping == NULL) return NULL; 8790a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 8800a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org // Map a view of the file into memory 8810a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org void* memory = MapViewOfFile(file_mapping, FILE_MAP_ALL_ACCESS, 0, 0, size); 8820a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org return new Win32MemoryMappedFile(file, file_mapping, memory, size); 8830a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org} 8840a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 8850a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org 88643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenOS::MemoryMappedFile* OS::MemoryMappedFile::create(const char* name, int size, 88743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void* initial) { 88843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Open a physical file 88943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HANDLE file = CreateFileA(name, GENERIC_READ | GENERIC_WRITE, 89043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL); 89143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (file == NULL) return NULL; 89243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Create a file mapping for the physical file 89343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HANDLE file_mapping = CreateFileMapping(file, NULL, 89443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PAGE_READWRITE, 0, static_cast<DWORD>(size), NULL); 89543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (file_mapping == NULL) return NULL; 89643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Map a view of the file into memory 89743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void* memory = MapViewOfFile(file_mapping, FILE_MAP_ALL_ACCESS, 0, 0, size); 8985de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org if (memory) memmove(memory, initial, size); 8990a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org return new Win32MemoryMappedFile(file, file_mapping, memory, size); 90043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 90143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenWin32MemoryMappedFile::~Win32MemoryMappedFile() { 90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (memory_ != NULL) 90543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UnmapViewOfFile(memory_); 90643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CloseHandle(file_mapping_); 90743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CloseHandle(file_); 90843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 90943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 91043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 91143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The following code loads functions defined in DbhHelp.h and TlHelp32.h 9123291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// dynamically. This is to avoid being depending on dbghelp.dll and 91343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// tlhelp32.dll when running (the functions in tlhelp32.dll have been moved to 91443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// kernel32.dll at some point so loading functions defines in TlHelp32.h 91543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// dynamically might not be necessary any more - for some versions of Windows?). 91643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 91743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Function pointers to functions dynamically loaded from dbghelp.dll. 91843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define DBGHELP_FUNCTION_LIST(V) \ 91943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(SymInitialize) \ 92043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(SymGetOptions) \ 92143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(SymSetOptions) \ 92243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(SymGetSearchPath) \ 92343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(SymLoadModule64) \ 92443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(StackWalk64) \ 92543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(SymGetSymFromAddr64) \ 92643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(SymGetLineFromAddr64) \ 92743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(SymFunctionTableAccess64) \ 92843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(SymGetModuleBase64) 92943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 93043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Function pointers to functions dynamically loaded from dbghelp.dll. 93143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define TLHELP32_FUNCTION_LIST(V) \ 93243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(CreateToolhelp32Snapshot) \ 93343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(Module32FirstW) \ 93443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(Module32NextW) 93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Define the decoration to use for the type and variable name used for 93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// dynamically loaded DLL function.. 93843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define DLL_FUNC_TYPE(name) _##name##_ 93943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define DLL_FUNC_VAR(name) _##name 94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 94143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Define the type for each dynamically loaded DLL function. The function 94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// definitions are copied from DbgHelp.h and TlHelp32.h. The IN and VOID macros 94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// from the Windows include files are redefined here to have the function 94443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// definitions to be as close to the ones in the original .h files as possible. 94543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef IN 94643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define IN 94743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef VOID 94943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define VOID void 95043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 95143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 952245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// DbgHelp isn't supported on MinGW yet 953245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#ifndef __MINGW32__ 95443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DbgHelp.h functions. 95543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef BOOL (__stdcall *DLL_FUNC_TYPE(SymInitialize))(IN HANDLE hProcess, 95643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN PSTR UserSearchPath, 95743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN BOOL fInvadeProcess); 95843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef DWORD (__stdcall *DLL_FUNC_TYPE(SymGetOptions))(VOID); 95943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef DWORD (__stdcall *DLL_FUNC_TYPE(SymSetOptions))(IN DWORD SymOptions); 96043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef BOOL (__stdcall *DLL_FUNC_TYPE(SymGetSearchPath))( 96143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN HANDLE hProcess, 96243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen OUT PSTR SearchPath, 96343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN DWORD SearchPathLength); 96443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef DWORD64 (__stdcall *DLL_FUNC_TYPE(SymLoadModule64))( 96543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN HANDLE hProcess, 96643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN HANDLE hFile, 96743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN PSTR ImageName, 96843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN PSTR ModuleName, 96943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN DWORD64 BaseOfDll, 97043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN DWORD SizeOfDll); 97143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef BOOL (__stdcall *DLL_FUNC_TYPE(StackWalk64))( 97243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DWORD MachineType, 97343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HANDLE hProcess, 97443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HANDLE hThread, 97543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen LPSTACKFRAME64 StackFrame, 97643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PVOID ContextRecord, 97743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, 97843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, 97943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, 98043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress); 98143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef BOOL (__stdcall *DLL_FUNC_TYPE(SymGetSymFromAddr64))( 98243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN HANDLE hProcess, 98343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN DWORD64 qwAddr, 98443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen OUT PDWORD64 pdwDisplacement, 98543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen OUT PIMAGEHLP_SYMBOL64 Symbol); 98643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef BOOL (__stdcall *DLL_FUNC_TYPE(SymGetLineFromAddr64))( 98743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN HANDLE hProcess, 98843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IN DWORD64 qwAddr, 98943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen OUT PDWORD pdwDisplacement, 99043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen OUT PIMAGEHLP_LINE64 Line64); 99143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DbgHelp.h typedefs. Implementation found in dbghelp.dll. 99243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef PVOID (__stdcall *DLL_FUNC_TYPE(SymFunctionTableAccess64))( 99343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HANDLE hProcess, 99443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DWORD64 AddrBase); // DbgHelp.h typedef PFUNCTION_TABLE_ACCESS_ROUTINE64 99543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef DWORD64 (__stdcall *DLL_FUNC_TYPE(SymGetModuleBase64))( 99643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HANDLE hProcess, 99743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DWORD64 AddrBase); // DbgHelp.h typedef PGET_MODULE_BASE_ROUTINE64 99843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 99943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// TlHelp32.h functions. 100043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef HANDLE (__stdcall *DLL_FUNC_TYPE(CreateToolhelp32Snapshot))( 100143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DWORD dwFlags, 100243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DWORD th32ProcessID); 100343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef BOOL (__stdcall *DLL_FUNC_TYPE(Module32FirstW))(HANDLE hSnapshot, 100443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen LPMODULEENTRY32W lpme); 100543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef BOOL (__stdcall *DLL_FUNC_TYPE(Module32NextW))(HANDLE hSnapshot, 100643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen LPMODULEENTRY32W lpme); 100743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 100843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef IN 100943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef VOID 101043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 101143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Declare a variable for each dynamically loaded DLL function. 101243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define DEF_DLL_FUNCTION(name) DLL_FUNC_TYPE(name) DLL_FUNC_VAR(name) = NULL; 101343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDBGHELP_FUNCTION_LIST(DEF_DLL_FUNCTION) 101443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenTLHELP32_FUNCTION_LIST(DEF_DLL_FUNCTION) 101543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef DEF_DLL_FUNCTION 101643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 101743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Load the functions. This function has a lot of "ugly" macros in order to 101843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// keep down code duplication. 101943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 102043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic bool LoadDbgHelpAndTlHelp32() { 102143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static bool dbghelp_loaded = false; 102243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 102343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (dbghelp_loaded) return true; 102443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 102543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HMODULE module; 102643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 102743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Load functions from the dbghelp.dll module. 102843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen module = LoadLibrary(TEXT("dbghelp.dll")); 102943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (module == NULL) { 103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return false; 103143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 103243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define LOAD_DLL_FUNC(name) \ 103443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DLL_FUNC_VAR(name) = \ 103543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reinterpret_cast<DLL_FUNC_TYPE(name)>(GetProcAddress(module, #name)); 103643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 103743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDBGHELP_FUNCTION_LIST(LOAD_DLL_FUNC) 103843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 103943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef LOAD_DLL_FUNC 104043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Load functions from the kernel32.dll module (the TlHelp32.h function used 104243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // to be in tlhelp32.dll but are now moved to kernel32.dll). 104343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen module = LoadLibrary(TEXT("kernel32.dll")); 104443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (module == NULL) { 104543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return false; 104643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 104743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 104843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define LOAD_DLL_FUNC(name) \ 104943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DLL_FUNC_VAR(name) = \ 105043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reinterpret_cast<DLL_FUNC_TYPE(name)>(GetProcAddress(module, #name)); 105143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 105243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenTLHELP32_FUNCTION_LIST(LOAD_DLL_FUNC) 105343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 105443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef LOAD_DLL_FUNC 105543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 105643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Check that all functions where loaded. 105743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool result = 105843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define DLL_FUNC_LOADED(name) (DLL_FUNC_VAR(name) != NULL) && 105943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 106043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDBGHELP_FUNCTION_LIST(DLL_FUNC_LOADED) 106143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenTLHELP32_FUNCTION_LIST(DLL_FUNC_LOADED) 106243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 106343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef DLL_FUNC_LOADED 106443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen true; 106543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 106643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen dbghelp_loaded = result; 106743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return result; 10683291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // NOTE: The modules are never unloaded and will stay around until the 106943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // application is closed. 107043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 107143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10722f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#undef DBGHELP_FUNCTION_LIST 10732f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#undef TLHELP32_FUNCTION_LIST 10742f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#undef DLL_FUNC_VAR 10752f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#undef DLL_FUNC_TYPE 10762f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 107743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 107843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Load the symbols for generating stack traces. 10791845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgstatic std::vector<OS::SharedLibraryAddress> LoadSymbols( 10801845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org HANDLE process_handle) { 10811845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org static std::vector<OS::SharedLibraryAddress> result; 10821845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 108343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen static bool symbols_loaded = false; 108443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10851845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if (symbols_loaded) return result; 108643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 108743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen BOOL ok; 108843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 108943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Initialize the symbol engine. 109043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ok = _SymInitialize(process_handle, // hProcess 109143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen NULL, // UserSearchPath 1092a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org false); // fInvadeProcess 10931845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if (!ok) return result; 109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DWORD options = _SymGetOptions(); 109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen options |= SYMOPT_LOAD_LINES; 109743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen options |= SYMOPT_FAIL_CRITICAL_ERRORS; 109843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen options = _SymSetOptions(options); 109943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 110043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen char buf[OS::kStackWalkMaxNameLen] = {0}; 110143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ok = _SymGetSearchPath(process_handle, buf, OS::kStackWalkMaxNameLen); 110243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (!ok) { 110343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int err = GetLastError(); 11045de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org OS::Print("%d\n", err); 11051845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org return result; 110643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 110743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 110843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HANDLE snapshot = _CreateToolhelp32Snapshot( 110943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TH32CS_SNAPMODULE, // dwFlags 111043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen GetCurrentProcessId()); // th32ProcessId 11111845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if (snapshot == INVALID_HANDLE_VALUE) return result; 111243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen MODULEENTRY32W module_entry; 111343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen module_entry.dwSize = sizeof(module_entry); // Set the size of the structure. 111443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen BOOL cont = _Module32FirstW(snapshot, &module_entry); 111543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen while (cont) { 111643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DWORD64 base; 111743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // NOTE the SymLoadModule64 function has the peculiarity of accepting a 111843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // both unicode and ASCII strings even though the parameter is PSTR. 111943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen base = _SymLoadModule64( 112043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen process_handle, // hProcess 112143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 0, // hFile 112243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reinterpret_cast<PSTR>(module_entry.szExePath), // ImageName 112343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reinterpret_cast<PSTR>(module_entry.szModule), // ModuleName 112443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen reinterpret_cast<DWORD64>(module_entry.modBaseAddr), // BaseOfDll 112543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen module_entry.modBaseSize); // SizeOfDll 112643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (base == 0) { 112743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int err = GetLastError(); 112843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (err != ERROR_MOD_NOT_FOUND && 11291845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org err != ERROR_INVALID_HANDLE) { 11301845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org result.clear(); 11311845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org return result; 11321845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org } 113343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 11341845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org int lib_name_length = WideCharToMultiByte( 11351845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org CP_UTF8, 0, module_entry.szExePath, -1, NULL, 0, NULL, NULL); 11361845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org std::string lib_name(lib_name_length, 0); 11371845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org WideCharToMultiByte(CP_UTF8, 0, module_entry.szExePath, -1, &lib_name[0], 11381845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org lib_name_length, NULL, NULL); 11391845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org result.push_back(OS::SharedLibraryAddress( 11401845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org lib_name, reinterpret_cast<unsigned int>(module_entry.modBaseAddr), 11411845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org reinterpret_cast<unsigned int>(module_entry.modBaseAddr + 11421845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org module_entry.modBaseSize))); 114343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen cont = _Module32NextW(snapshot, &module_entry); 114443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 114543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CloseHandle(snapshot); 114643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 114743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen symbols_loaded = true; 11481845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org return result; 114943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 115043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 115143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11521845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgstd::vector<OS::SharedLibraryAddress> OS::GetSharedLibraryAddresses() { 115343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // SharedLibraryEvents are logged when loading symbol information. 115443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Only the shared libraries loaded at the time of the call to 11551845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org // GetSharedLibraryAddresses are logged. DLLs loaded after 115643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // initialization are not accounted for. 11571845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org if (!LoadDbgHelpAndTlHelp32()) return std::vector<OS::SharedLibraryAddress>(); 115843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HANDLE process_handle = GetCurrentProcess(); 11591845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org return LoadSymbols(process_handle); 116043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 116143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 116243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11634a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgvoid OS::SignalCodeMovingGC() { 11644a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org} 11654a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 11664a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 1167245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#else // __MINGW32__ 11681845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.orgstd::vector<OS::SharedLibraryAddress> OS::GetSharedLibraryAddresses() { 11691845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org return std::vector<OS::SharedLibraryAddress>(); 11701845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org} 11711845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 11721845eb0120c7a870d7388de091246a7d1b48a4f8machenbach@chromium.org 1173a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid OS::SignalCodeMovingGC() { } 1174245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#endif // __MINGW32__ 1175245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 117643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 117743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansendouble OS::nan_value() { 1178245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#ifdef _MSC_VER 11795de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org return std::numeric_limits<double>::quiet_NaN(); 1180245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#else // _MSC_VER 1181245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org return NAN; 1182245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org#endif // _MSC_VER 118343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 118443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1185236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 1186236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.orgint OS::ActivationFrameAlignment() { 118718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef _WIN64 118818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org return 16; // Windows 64-bit ABI requires the stack to be 16-byte aligned. 1189e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org#elif defined(__MINGW32__) 1190e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // With gcc 4.4 the tree vectorization optimizer can generate code 1191e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org // that requires 16 byte alignment such as movdqa on x86. 1192e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org return 16; 119318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#else 119418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org return 8; // Floating-point math runs faster with 8-byte alignment. 119518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif 1196236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org} 1197236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 1198236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org 1199c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comVirtualMemory::VirtualMemory() : address_(NULL), size_(0) { } 1200c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1201c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1202c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comVirtualMemory::VirtualMemory(size_t size) 1203c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com : address_(ReserveRegion(size)), size_(size) { } 120443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 120543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1206c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comVirtualMemory::VirtualMemory(size_t size, size_t alignment) 1207c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com : address_(NULL), size_(0) { 1208e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org DCHECK((alignment % OS::AllocateAlignment()) == 0); 1209c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com size_t request_size = RoundUp(size + alignment, 1210c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com static_cast<intptr_t>(OS::AllocateAlignment())); 1211c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com void* address = ReserveRegion(request_size); 1212c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (address == NULL) return; 1213248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org uint8_t* base = RoundUp(static_cast<uint8_t*>(address), alignment); 1214c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Try reducing the size by freeing and then reallocating a specific area. 1215c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool result = ReleaseRegion(address, request_size); 1216c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com USE(result); 1217e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(result); 1218c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com address = VirtualAlloc(base, size, MEM_RESERVE, PAGE_NOACCESS); 1219c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (address != NULL) { 1220c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com request_size = size; 1221e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(base == static_cast<uint8_t*>(address)); 1222c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } else { 1223c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Resizing failed, just go with a bigger area. 1224c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com address = ReserveRegion(request_size); 1225c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (address == NULL) return; 1226c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 1227c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com address_ = address; 1228c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com size_ = request_size; 122943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 123043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 123143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 123243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenVirtualMemory::~VirtualMemory() { 123343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (IsReserved()) { 1234e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org bool result = ReleaseRegion(address(), size()); 1235e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(result); 1236c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com USE(result); 123743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 123843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 123943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 124043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1241c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool VirtualMemory::IsReserved() { 1242c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return address_ != NULL; 1243c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 1244c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1245c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1246c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid VirtualMemory::Reset() { 1247c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com address_ = NULL; 1248c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com size_ = 0; 1249c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 1250c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1251c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1252f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.orgbool VirtualMemory::Commit(void* address, size_t size, bool is_executable) { 1253e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return CommitRegion(address, size, is_executable); 1254c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 1255c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1256c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1257c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool VirtualMemory::Uncommit(void* address, size_t size) { 1258e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsReserved()); 1259c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return UncommitRegion(address, size); 1260c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 1261c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1262c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1263e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgbool VirtualMemory::Guard(void* address) { 1264e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (NULL == VirtualAlloc(address, 1265e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org OS::CommitPageSize(), 1266e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org MEM_COMMIT, 1267c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org PAGE_NOACCESS)) { 1268e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return false; 1269e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 1270e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return true; 1271e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 1272e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1273e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1274c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comvoid* VirtualMemory::ReserveRegion(size_t size) { 1275be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org return RandomizedVirtualAlloc(size, MEM_RESERVE, PAGE_NOACCESS); 1276c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 1277c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1278c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1279c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool VirtualMemory::CommitRegion(void* base, size_t size, bool is_executable) { 1280f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org int prot = is_executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE; 1281c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (NULL == VirtualAlloc(base, size, MEM_COMMIT, prot)) { 128243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return false; 128343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 128443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return true; 128543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 128643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 128743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1288c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool VirtualMemory::UncommitRegion(void* base, size_t size) { 1289c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return VirtualFree(base, size, MEM_DECOMMIT) != 0; 129043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 129143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 129243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1293c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool VirtualMemory::ReleaseRegion(void* base, size_t size) { 1294c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return VirtualFree(base, 0, MEM_RELEASE) != 0; 1295c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 1296c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 1297c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 129872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.orgbool VirtualMemory::HasLazyCommits() { 129972204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org // TODO(alph): implement for the platform. 130072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org return false; 130172204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org} 130272204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org 130372204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org 130443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ---------------------------------------------------------------------------- 130543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Win32 thread support. 130643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 130743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Definition of invalid thread handle and id. 130843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic const HANDLE kNoThread = INVALID_HANDLE_VALUE; 130943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 131043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Entry point for threads. The supplied argument is a pointer to the thread 131143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// object. The entry function dispatches to the run method in the thread 131243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// object. It is important that this function has __stdcall calling 131343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// convention. 131443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic unsigned int __stdcall ThreadEntry(void* arg) { 131543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Thread* thread = reinterpret_cast<Thread*>(arg); 1316e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org thread->NotifyStartedAndRun(); 131743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 0; 131843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 131943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 132043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1321248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgclass Thread::PlatformData { 132243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 132343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen explicit PlatformData(HANDLE thread) : thread_(thread) {} 132443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen HANDLE thread_; 1325c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com unsigned thread_id_; 132643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 132743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 132843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 132943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Initialize a Win32 thread object. The thread has an invalid thread 133043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// handle until it is started. 133143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13326d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.orgThread::Thread(const Options& options) 1333e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org : stack_size_(options.stack_size()), 1334e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org start_semaphore_(NULL) { 133543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen data_ = new PlatformData(kNoThread); 1336659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org set_name(options.name()); 13375d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org} 13385d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org 13395d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org 13405d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.orgvoid Thread::set_name(const char* name) { 134170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org OS::StrNCpy(name_, sizeof(name_), name, strlen(name)); 13425d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org name_[sizeof(name_) - 1] = '\0'; 134343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 134443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 134543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 134643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Close our own handle for the thread. 134743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenThread::~Thread() { 134843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (data_->thread_ != kNoThread) CloseHandle(data_->thread_); 134943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen delete data_; 135043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 135143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 135243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 135343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Create a new thread. It is important to use _beginthreadex() instead of 135443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the Win32 function CreateThread(), because the CreateThread() does not 135543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// initialize thread specific structures in the C runtime library. 135643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Thread::Start() { 135743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen data_->thread_ = reinterpret_cast<HANDLE>( 135843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen _beginthreadex(NULL, 1359ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static_cast<unsigned>(stack_size_), 136043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ThreadEntry, 136143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen this, 136243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 0, 1363c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com &data_->thread_id_)); 136443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 136543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 136643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 136743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Wait for thread to terminate. 136843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Thread::Join() { 1369c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (data_->thread_id_ != GetCurrentThreadId()) { 1370c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com WaitForSingleObject(data_->thread_, INFINITE); 1371c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 137243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 137343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 137443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 137543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenThread::LocalStorageKey Thread::CreateThreadLocalKey() { 137643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DWORD result = TlsAlloc(); 1377e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(result != TLS_OUT_OF_INDEXES); 137843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return static_cast<LocalStorageKey>(result); 137943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 138043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 138143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 138243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Thread::DeleteThreadLocalKey(LocalStorageKey key) { 138343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen BOOL result = TlsFree(static_cast<DWORD>(key)); 138443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen USE(result); 1385e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(result); 138643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 138743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 138843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 138943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid* Thread::GetThreadLocal(LocalStorageKey key) { 139043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return TlsGetValue(static_cast<DWORD>(key)); 139143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 139243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 139343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 139443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Thread::SetThreadLocal(LocalStorageKey key, void* value) { 139543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen BOOL result = TlsSetValue(static_cast<DWORD>(key), value); 139643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen USE(result); 1397e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(result); 139843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 139943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 140043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 140143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 140243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Thread::YieldCPU() { 140343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Sleep(0); 140443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 140543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14065de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org} } // namespace v8::base 1407