OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 15 matching lines...) Expand all Loading... |
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
28 // Platform specific code for POSIX goes here. This is not a platform on its | 28 // Platform specific code for POSIX goes here. This is not a platform on its |
29 // own but contains the parts which are the same across POSIX platforms Linux, | 29 // own but contains the parts which are the same across POSIX platforms Linux, |
30 // Mac OS, FreeBSD and OpenBSD. | 30 // Mac OS, FreeBSD and OpenBSD. |
31 | 31 |
32 #include "platform-posix.h" | 32 #include "platform-posix.h" |
33 | 33 |
34 #include <dlfcn.h> | 34 #include <dlfcn.h> |
35 #include <pthread.h> | 35 #include <pthread.h> |
36 #if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__) | 36 #if V8_OS_FREEBSD || V8_OS_OPENBSD |
37 #include <pthread_np.h> // for pthread_set_name_np | 37 #include <pthread_np.h> // for pthread_set_name_np |
38 #endif | 38 #endif |
39 #include <sched.h> // for sched_yield | 39 #include <sched.h> // for sched_yield |
40 #include <unistd.h> | 40 #include <unistd.h> |
41 #include <errno.h> | 41 #include <errno.h> |
42 #include <time.h> | 42 #include <time.h> |
43 | 43 |
44 #include <sys/mman.h> | 44 #include <sys/mman.h> |
45 #include <sys/socket.h> | 45 #include <sys/socket.h> |
46 #include <sys/resource.h> | 46 #include <sys/resource.h> |
47 #include <sys/time.h> | 47 #include <sys/time.h> |
48 #include <sys/types.h> | 48 #include <sys/types.h> |
49 #include <sys/stat.h> | 49 #include <sys/stat.h> |
50 #if defined(__linux__) | 50 #if V8_OS_LINUX |
51 #include <sys/prctl.h> // for prctl | 51 #include <sys/prctl.h> // for prctl |
52 #endif | 52 #elif V8_OS_BSD4 |
53 #if defined(__APPLE__) || defined(__DragonFly__) || defined(__FreeBSD__) || \ | |
54 defined(__NetBSD__) || defined(__OpenBSD__) | |
55 #include <sys/sysctl.h> // for sysctl | 53 #include <sys/sysctl.h> // for sysctl |
56 #endif | 54 #endif |
57 | 55 |
58 #include <arpa/inet.h> | 56 #include <arpa/inet.h> |
59 #include <netinet/in.h> | 57 #include <netinet/in.h> |
60 #include <netdb.h> | 58 #include <netdb.h> |
61 | 59 |
62 #undef MAP_TYPE | 60 #undef MAP_TYPE |
63 | 61 |
64 #if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT) | 62 #if V8_OS_ANDROID && !defined(V8_ANDROID_LOG_STDOUT) |
65 #define LOG_TAG "v8" | 63 #define LOG_TAG "v8" |
66 #include <android/log.h> | 64 #include <android/log.h> |
67 #endif | 65 #endif |
68 | 66 |
69 #include "v8.h" | 67 #include "v8.h" |
70 | 68 |
71 #include "codegen.h" | 69 #include "codegen.h" |
72 #include "platform.h" | 70 #include "platform.h" |
73 | 71 |
74 namespace v8 { | 72 namespace v8 { |
75 namespace internal { | 73 namespace internal { |
76 | 74 |
77 // 0 is never a valid thread id. | 75 // 0 is never a valid thread id. |
78 static const pthread_t kNoThread = (pthread_t) 0; | 76 static const pthread_t kNoThread = (pthread_t) 0; |
79 | 77 |
80 | 78 |
81 uint64_t OS::CpuFeaturesImpliedByPlatform() { | 79 uint64_t OS::CpuFeaturesImpliedByPlatform() { |
82 #if defined(__APPLE__) | 80 #if V8_OS_DARWIN |
83 // Mac OS X requires all these to install so we can assume they are present. | 81 // Mac OS X requires all these to install so we can assume they are present. |
84 // These constants are defined by the CPUid instructions. | 82 // These constants are defined by the CPUid instructions. |
85 const uint64_t one = 1; | 83 const uint64_t one = 1; |
86 return (one << SSE2) | (one << CMOV) | (one << RDTSC) | (one << CPUID); | 84 return (one << SSE2) | (one << CMOV) | (one << RDTSC) | (one << CPUID); |
87 #else | 85 #else |
88 return 0; // Nothing special about the other systems. | 86 return 0; // Nothing special about the other systems. |
89 #endif | 87 #endif |
90 } | 88 } |
91 | 89 |
92 | 90 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 void OS::Free(void* address, const size_t size) { | 126 void OS::Free(void* address, const size_t size) { |
129 // TODO(1240712): munmap has a return value which is ignored here. | 127 // TODO(1240712): munmap has a return value which is ignored here. |
130 int result = munmap(address, size); | 128 int result = munmap(address, size); |
131 USE(result); | 129 USE(result); |
132 ASSERT(result == 0); | 130 ASSERT(result == 0); |
133 } | 131 } |
134 | 132 |
135 | 133 |
136 // Get rid of writable permission on code allocations. | 134 // Get rid of writable permission on code allocations. |
137 void OS::ProtectCode(void* address, const size_t size) { | 135 void OS::ProtectCode(void* address, const size_t size) { |
138 #if defined(__CYGWIN__) | 136 #if V8_OS_CYGWIN |
139 DWORD old_protect; | 137 DWORD old_protect; |
140 VirtualProtect(address, size, PAGE_EXECUTE_READ, &old_protect); | 138 VirtualProtect(address, size, PAGE_EXECUTE_READ, &old_protect); |
141 #elif defined(__native_client__) | 139 #elif V8_OS_NACL |
142 // The Native Client port of V8 uses an interpreter, so | 140 // The Native Client port of V8 uses an interpreter, so |
143 // code pages don't need PROT_EXEC. | 141 // code pages don't need PROT_EXEC. |
144 mprotect(address, size, PROT_READ); | 142 mprotect(address, size, PROT_READ); |
145 #else | 143 #else |
146 mprotect(address, size, PROT_READ | PROT_EXEC); | 144 mprotect(address, size, PROT_READ | PROT_EXEC); |
147 #endif | 145 #endif |
148 } | 146 } |
149 | 147 |
150 | 148 |
151 // Create guard pages. | 149 // Create guard pages. |
152 void OS::Guard(void* address, const size_t size) { | 150 void OS::Guard(void* address, const size_t size) { |
153 #if defined(__CYGWIN__) | 151 #if V8_OS_CYGWIN |
154 DWORD oldprotect; | 152 DWORD oldprotect; |
155 VirtualProtect(address, size, PAGE_READONLY | PAGE_GUARD, &oldprotect); | 153 VirtualProtect(address, size, PAGE_READONLY | PAGE_GUARD, &oldprotect); |
156 #else | 154 #else |
157 mprotect(address, size, PROT_NONE); | 155 mprotect(address, size, PROT_NONE); |
158 #endif | 156 #endif |
159 } | 157 } |
160 | 158 |
161 | 159 |
162 void* OS::GetRandomMmapAddr() { | 160 void* OS::GetRandomMmapAddr() { |
163 #if defined(__native_client__) | 161 #if V8_OS_NACL |
164 // TODO(bradchen): restore randomization once Native Client gets | 162 // TODO(bradchen): restore randomization once Native Client gets |
165 // smarter about using mmap address hints. | 163 // smarter about using mmap address hints. |
166 // See http://code.google.com/p/nativeclient/issues/3341 | 164 // See http://code.google.com/p/nativeclient/issues/3341 |
167 return NULL; | 165 return NULL; |
168 #endif | 166 #endif |
169 Isolate* isolate = Isolate::UncheckedCurrent(); | 167 Isolate* isolate = Isolate::UncheckedCurrent(); |
170 // Note that the current isolate isn't set up in a call path via | 168 // Note that the current isolate isn't set up in a call path via |
171 // CpuFeatures::Probe. We don't care about randomization in this case because | 169 // CpuFeatures::Probe. We don't care about randomization in this case because |
172 // the code page is immediately freed. | 170 // the code page is immediately freed. |
173 if (isolate != NULL) { | 171 if (isolate != NULL) { |
174 #if V8_TARGET_ARCH_X64 | 172 #if V8_HOST_ARCH_64_BIT |
175 uint64_t rnd1 = V8::RandomPrivate(isolate); | 173 uint64_t rnd1 = V8::RandomPrivate(isolate); |
176 uint64_t rnd2 = V8::RandomPrivate(isolate); | 174 uint64_t rnd2 = V8::RandomPrivate(isolate); |
177 uint64_t raw_addr = (rnd1 << 32) ^ rnd2; | 175 uint64_t raw_addr = (rnd1 << 32) ^ rnd2; |
178 // Currently available CPUs have 48 bits of virtual addressing. Truncate | 176 // Currently available CPUs have 48 bits of virtual addressing. Truncate |
179 // the hint address to 46 bits to give the kernel a fighting chance of | 177 // the hint address to 46 bits to give the kernel a fighting chance of |
180 // fulfilling our placement request. | 178 // fulfilling our placement request. |
181 raw_addr &= V8_UINT64_C(0x3ffffffff000); | 179 raw_addr &= V8_UINT64_C(0x3ffffffff000); |
182 #else | 180 #else |
183 uint32_t raw_addr = V8::RandomPrivate(isolate); | 181 uint32_t raw_addr = V8::RandomPrivate(isolate); |
184 | 182 |
185 raw_addr &= 0x3ffff000; | 183 raw_addr &= 0x3ffff000; |
186 | 184 |
187 # ifdef __sun | 185 #if V8_OS_SOLARIS |
188 // For our Solaris/illumos mmap hint, we pick a random address in the bottom | 186 // For our Solaris/illumos mmap hint, we pick a random address in the bottom |
189 // half of the top half of the address space (that is, the third quarter). | 187 // half of the top half of the address space (that is, the third quarter). |
190 // Because we do not MAP_FIXED, this will be treated only as a hint -- the | 188 // Because we do not MAP_FIXED, this will be treated only as a hint -- the |
191 // system will not fail to mmap() because something else happens to already | 189 // system will not fail to mmap() because something else happens to already |
192 // be mapped at our random address. We deliberately set the hint high enough | 190 // be mapped at our random address. We deliberately set the hint high enough |
193 // to get well above the system's break (that is, the heap); Solaris and | 191 // to get well above the system's break (that is, the heap); Solaris and |
194 // illumos will try the hint and if that fails allocate as if there were | 192 // illumos will try the hint and if that fails allocate as if there were |
195 // no hint at all. The high hint prevents the break from getting hemmed in | 193 // no hint at all. The high hint prevents the break from getting hemmed in |
196 // at low values, ceding half of the address space to the system heap. | 194 // at low values, ceding half of the address space to the system heap. |
197 raw_addr += 0x80000000; | 195 raw_addr += 0x80000000; |
198 # else | 196 #else |
199 // The range 0x20000000 - 0x60000000 is relatively unpopulated across a | 197 // The range 0x20000000 - 0x60000000 is relatively unpopulated across a |
200 // variety of ASLR modes (PAE kernel, NX compat mode, etc) and on macos | 198 // variety of ASLR modes (PAE kernel, NX compat mode, etc) and on macos |
201 // 10.6 and 10.7. | 199 // 10.6 and 10.7. |
202 raw_addr += 0x20000000; | 200 raw_addr += 0x20000000; |
203 # endif | 201 #endif // V8_OS_SOLARIS |
204 #endif | 202 #endif // V8_HOST_ARCH_64_BIT |
205 return reinterpret_cast<void*>(raw_addr); | 203 return reinterpret_cast<void*>(raw_addr); |
206 } | 204 } |
207 return NULL; | 205 return NULL; |
208 } | 206 } |
209 | 207 |
210 | 208 |
211 size_t OS::AllocateAlignment() { | 209 size_t OS::AllocateAlignment() { |
212 return getpagesize(); | 210 return getpagesize(); |
213 } | 211 } |
214 | 212 |
(...skipping 17 matching lines...) Expand all Loading... |
232 abort(); | 230 abort(); |
233 } | 231 } |
234 | 232 |
235 | 233 |
236 void OS::DebugBreak() { | 234 void OS::DebugBreak() { |
237 #if V8_HOST_ARCH_ARM | 235 #if V8_HOST_ARCH_ARM |
238 asm("bkpt 0"); | 236 asm("bkpt 0"); |
239 #elif V8_HOST_ARCH_MIPS | 237 #elif V8_HOST_ARCH_MIPS |
240 asm("break"); | 238 asm("break"); |
241 #elif V8_HOST_ARCH_IA32 | 239 #elif V8_HOST_ARCH_IA32 |
242 #if defined(__native_client__) | 240 #if V8_OS_NACL |
243 asm("hlt"); | 241 asm("hlt"); |
244 #else | 242 #else |
245 asm("int $3"); | 243 asm("int $3"); |
246 #endif // __native_client__ | 244 #endif // V8_OS_NACL |
247 #elif V8_HOST_ARCH_X64 | 245 #elif V8_HOST_ARCH_X64 |
248 asm("int $3"); | 246 asm("int $3"); |
249 #else | 247 #else |
250 #error Unsupported host architecture. | 248 #error Unsupported host architecture. |
251 #endif | 249 #endif |
252 } | 250 } |
253 | 251 |
254 | 252 |
255 // ---------------------------------------------------------------------------- | 253 // ---------------------------------------------------------------------------- |
256 // Math functions | 254 // Math functions |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 | 377 |
380 void OS::Print(const char* format, ...) { | 378 void OS::Print(const char* format, ...) { |
381 va_list args; | 379 va_list args; |
382 va_start(args, format); | 380 va_start(args, format); |
383 VPrint(format, args); | 381 VPrint(format, args); |
384 va_end(args); | 382 va_end(args); |
385 } | 383 } |
386 | 384 |
387 | 385 |
388 void OS::VPrint(const char* format, va_list args) { | 386 void OS::VPrint(const char* format, va_list args) { |
389 #if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT) | 387 #if V8_OS_ANDROID && !defined(V8_ANDROID_LOG_STDOUT) |
390 __android_log_vprint(ANDROID_LOG_INFO, LOG_TAG, format, args); | 388 __android_log_vprint(ANDROID_LOG_INFO, LOG_TAG, format, args); |
391 #else | 389 #else |
392 vprintf(format, args); | 390 vprintf(format, args); |
393 #endif | 391 #endif |
394 } | 392 } |
395 | 393 |
396 | 394 |
397 void OS::FPrint(FILE* out, const char* format, ...) { | 395 void OS::FPrint(FILE* out, const char* format, ...) { |
398 va_list args; | 396 va_list args; |
399 va_start(args, format); | 397 va_start(args, format); |
400 VFPrint(out, format, args); | 398 VFPrint(out, format, args); |
401 va_end(args); | 399 va_end(args); |
402 } | 400 } |
403 | 401 |
404 | 402 |
405 void OS::VFPrint(FILE* out, const char* format, va_list args) { | 403 void OS::VFPrint(FILE* out, const char* format, va_list args) { |
406 #if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT) | 404 #if V8_OS_ANDROID && !defined(V8_ANDROID_LOG_STDOUT) |
407 __android_log_vprint(ANDROID_LOG_INFO, LOG_TAG, format, args); | 405 __android_log_vprint(ANDROID_LOG_INFO, LOG_TAG, format, args); |
408 #else | 406 #else |
409 vfprintf(out, format, args); | 407 vfprintf(out, format, args); |
410 #endif | 408 #endif |
411 } | 409 } |
412 | 410 |
413 | 411 |
414 void OS::PrintError(const char* format, ...) { | 412 void OS::PrintError(const char* format, ...) { |
415 va_list args; | 413 va_list args; |
416 va_start(args, format); | 414 va_start(args, format); |
417 VPrintError(format, args); | 415 VPrintError(format, args); |
418 va_end(args); | 416 va_end(args); |
419 } | 417 } |
420 | 418 |
421 | 419 |
422 void OS::VPrintError(const char* format, va_list args) { | 420 void OS::VPrintError(const char* format, va_list args) { |
423 #if defined(ANDROID) && !defined(V8_ANDROID_LOG_STDOUT) | 421 #if V8_OS_ANDROID && !defined(V8_ANDROID_LOG_STDOUT) |
424 __android_log_vprint(ANDROID_LOG_ERROR, LOG_TAG, format, args); | 422 __android_log_vprint(ANDROID_LOG_ERROR, LOG_TAG, format, args); |
425 #else | 423 #else |
426 vfprintf(stderr, format, args); | 424 vfprintf(stderr, format, args); |
427 #endif | 425 #endif |
428 } | 426 } |
429 | 427 |
430 | 428 |
431 int OS::SNPrintF(Vector<char> str, const char* format, ...) { | 429 int OS::SNPrintF(Vector<char> str, const char* format, ...) { |
432 va_list args; | 430 va_list args; |
433 va_start(args, format); | 431 va_start(args, format); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 OS::MemMoveFunction CreateMemMoveFunction(); | 463 OS::MemMoveFunction CreateMemMoveFunction(); |
466 | 464 |
467 // Copy memory area. No restrictions. | 465 // Copy memory area. No restrictions. |
468 void OS::MemMove(void* dest, const void* src, size_t size) { | 466 void OS::MemMove(void* dest, const void* src, size_t size) { |
469 if (size == 0) return; | 467 if (size == 0) return; |
470 // Note: here we rely on dependent reads being ordered. This is true | 468 // Note: here we rely on dependent reads being ordered. This is true |
471 // on all architectures we currently support. | 469 // on all architectures we currently support. |
472 (*memmove_function)(dest, src, size); | 470 (*memmove_function)(dest, src, size); |
473 } | 471 } |
474 | 472 |
475 #elif defined(V8_HOST_ARCH_ARM) | 473 #elif V8_HOST_ARCH_ARM |
476 void OS::MemCopyUint16Uint8Wrapper(uint16_t* dest, | 474 void OS::MemCopyUint16Uint8Wrapper(uint16_t* dest, |
477 const uint8_t* src, | 475 const uint8_t* src, |
478 size_t chars) { | 476 size_t chars) { |
479 uint16_t *limit = dest + chars; | 477 uint16_t *limit = dest + chars; |
480 while (dest < limit) { | 478 while (dest < limit) { |
481 *dest++ = static_cast<uint16_t>(*src++); | 479 *dest++ = static_cast<uint16_t>(*src++); |
482 } | 480 } |
483 } | 481 } |
484 | 482 |
485 | 483 |
486 OS::MemCopyUint8Function OS::memcopy_uint8_function = &OS::MemCopyUint8Wrapper; | 484 OS::MemCopyUint8Function OS::memcopy_uint8_function = &OS::MemCopyUint8Wrapper; |
487 OS::MemCopyUint16Uint8Function OS::memcopy_uint16_uint8_function = | 485 OS::MemCopyUint16Uint8Function OS::memcopy_uint16_uint8_function = |
488 &OS::MemCopyUint16Uint8Wrapper; | 486 &OS::MemCopyUint16Uint8Wrapper; |
489 // Defined in codegen-arm.cc. | 487 // Defined in codegen-arm.cc. |
490 OS::MemCopyUint8Function CreateMemCopyUint8Function( | 488 OS::MemCopyUint8Function CreateMemCopyUint8Function( |
491 OS::MemCopyUint8Function stub); | 489 OS::MemCopyUint8Function stub); |
492 OS::MemCopyUint16Uint8Function CreateMemCopyUint16Uint8Function( | 490 OS::MemCopyUint16Uint8Function CreateMemCopyUint16Uint8Function( |
493 OS::MemCopyUint16Uint8Function stub); | 491 OS::MemCopyUint16Uint8Function stub); |
494 #endif | 492 #endif |
495 | 493 |
496 | 494 |
497 void OS::PostSetUp() { | 495 void OS::PostSetUp() { |
498 #if V8_TARGET_ARCH_IA32 | 496 #if V8_TARGET_ARCH_IA32 |
499 OS::MemMoveFunction generated_memmove = CreateMemMoveFunction(); | 497 OS::MemMoveFunction generated_memmove = CreateMemMoveFunction(); |
500 if (generated_memmove != NULL) { | 498 if (generated_memmove != NULL) { |
501 memmove_function = generated_memmove; | 499 memmove_function = generated_memmove; |
502 } | 500 } |
503 #elif defined(V8_HOST_ARCH_ARM) | 501 #elif V8_HOST_ARCH_ARM |
504 OS::memcopy_uint8_function = | 502 OS::memcopy_uint8_function = |
505 CreateMemCopyUint8Function(&OS::MemCopyUint8Wrapper); | 503 CreateMemCopyUint8Function(&OS::MemCopyUint8Wrapper); |
506 OS::memcopy_uint16_uint8_function = | 504 OS::memcopy_uint16_uint8_function = |
507 CreateMemCopyUint16Uint8Function(&OS::MemCopyUint16Uint8Wrapper); | 505 CreateMemCopyUint16Uint8Function(&OS::MemCopyUint16Uint8Wrapper); |
508 #endif | 506 #endif |
509 init_fast_sin_function(); | 507 init_fast_sin_function(); |
510 init_fast_cos_function(); | 508 init_fast_cos_function(); |
511 init_fast_tan_function(); | 509 init_fast_tan_function(); |
512 init_fast_log_function(); | 510 init_fast_log_function(); |
513 // fast_exp is initialized lazily. | 511 // fast_exp is initialized lazily. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 set_name(options.name()); | 544 set_name(options.name()); |
547 } | 545 } |
548 | 546 |
549 | 547 |
550 Thread::~Thread() { | 548 Thread::~Thread() { |
551 delete data_; | 549 delete data_; |
552 } | 550 } |
553 | 551 |
554 | 552 |
555 static void SetThreadName(const char* name) { | 553 static void SetThreadName(const char* name) { |
556 #if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__) | 554 #if V8_OS_FREEBSD || V8_OS_OPENBSD |
557 pthread_set_name_np(pthread_self(), name); | 555 pthread_set_name_np(pthread_self(), name); |
558 #elif defined(__NetBSD__) | 556 #elif V8_OS_NETBSD |
559 STATIC_ASSERT(Thread::kMaxThreadNameLength <= PTHREAD_MAX_NAMELEN_NP); | 557 STATIC_ASSERT(Thread::kMaxThreadNameLength <= PTHREAD_MAX_NAMELEN_NP); |
560 pthread_setname_np(pthread_self(), "%s", name); | 558 pthread_setname_np(pthread_self(), "%s", name); |
561 #elif defined(__APPLE__) | 559 #elif V8_OS_DARWIN |
562 // pthread_setname_np is only available in 10.6 or later, so test | 560 // pthread_setname_np is only available in 10.6 or later, so test |
563 // for it at runtime. | 561 // for it at runtime. |
564 int (*dynamic_pthread_setname_np)(const char*); | 562 int (*dynamic_pthread_setname_np)(const char*); |
565 *reinterpret_cast<void**>(&dynamic_pthread_setname_np) = | 563 *reinterpret_cast<void**>(&dynamic_pthread_setname_np) = |
566 dlsym(RTLD_DEFAULT, "pthread_setname_np"); | 564 dlsym(RTLD_DEFAULT, "pthread_setname_np"); |
567 if (dynamic_pthread_setname_np == NULL) | 565 if (dynamic_pthread_setname_np == NULL) |
568 return; | 566 return; |
569 | 567 |
570 // Mac OS X does not expose the length limit of the name, so hardcode it. | 568 // Mac OS X does not expose the length limit of the name, so hardcode it. |
571 static const int kMaxNameLength = 63; | 569 static const int kMaxNameLength = 63; |
(...skipping 26 matching lines...) Expand all Loading... |
598 } | 596 } |
599 | 597 |
600 | 598 |
601 void Thread::Start() { | 599 void Thread::Start() { |
602 int result; | 600 int result; |
603 pthread_attr_t attr; | 601 pthread_attr_t attr; |
604 memset(&attr, 0, sizeof(attr)); | 602 memset(&attr, 0, sizeof(attr)); |
605 result = pthread_attr_init(&attr); | 603 result = pthread_attr_init(&attr); |
606 ASSERT_EQ(0, result); | 604 ASSERT_EQ(0, result); |
607 // Native client uses default stack size. | 605 // Native client uses default stack size. |
608 #if !defined(__native_client__) | 606 #if !V8_OS_NACL |
609 if (stack_size_ > 0) { | 607 if (stack_size_ > 0) { |
610 result = pthread_attr_setstacksize(&attr, static_cast<size_t>(stack_size_)); | 608 result = pthread_attr_setstacksize(&attr, static_cast<size_t>(stack_size_)); |
611 ASSERT_EQ(0, result); | 609 ASSERT_EQ(0, result); |
612 } | 610 } |
613 #endif | 611 #endif |
614 result = pthread_create(&data_->thread_, &attr, ThreadEntry, this); | 612 result = pthread_create(&data_->thread_, &attr, ThreadEntry, this); |
615 ASSERT_EQ(0, result); | 613 ASSERT_EQ(0, result); |
616 result = pthread_attr_destroy(&attr); | 614 result = pthread_attr_destroy(&attr); |
617 ASSERT_EQ(0, result); | 615 ASSERT_EQ(0, result); |
618 ASSERT(data_->thread_ != kNoThread); | 616 ASSERT(data_->thread_ != kNoThread); |
619 USE(result); | 617 USE(result); |
620 } | 618 } |
621 | 619 |
622 | 620 |
623 void Thread::Join() { | 621 void Thread::Join() { |
624 pthread_join(data_->thread_, NULL); | 622 pthread_join(data_->thread_, NULL); |
625 } | 623 } |
626 | 624 |
627 | 625 |
628 void Thread::YieldCPU() { | 626 void Thread::YieldCPU() { |
629 int result = sched_yield(); | 627 int result = sched_yield(); |
630 ASSERT_EQ(0, result); | 628 ASSERT_EQ(0, result); |
631 USE(result); | 629 USE(result); |
632 } | 630 } |
633 | 631 |
634 | 632 |
635 static Thread::LocalStorageKey PthreadKeyToLocalKey(pthread_key_t pthread_key) { | 633 static Thread::LocalStorageKey PthreadKeyToLocalKey(pthread_key_t pthread_key) { |
636 #if defined(__CYGWIN__) | 634 #if V8_OS_CYGWIN |
637 // We need to cast pthread_key_t to Thread::LocalStorageKey in two steps | 635 // We need to cast pthread_key_t to Thread::LocalStorageKey in two steps |
638 // because pthread_key_t is a pointer type on Cygwin. This will probably not | 636 // because pthread_key_t is a pointer type on Cygwin. This will probably not |
639 // work on 64-bit platforms, but Cygwin doesn't support 64-bit anyway. | 637 // work on 64-bit platforms, but Cygwin doesn't support 64-bit anyway. |
640 STATIC_ASSERT(sizeof(Thread::LocalStorageKey) == sizeof(pthread_key_t)); | 638 STATIC_ASSERT(sizeof(Thread::LocalStorageKey) == sizeof(pthread_key_t)); |
641 intptr_t ptr_key = reinterpret_cast<intptr_t>(pthread_key); | 639 intptr_t ptr_key = reinterpret_cast<intptr_t>(pthread_key); |
642 return static_cast<Thread::LocalStorageKey>(ptr_key); | 640 return static_cast<Thread::LocalStorageKey>(ptr_key); |
643 #else | 641 #else |
644 return static_cast<Thread::LocalStorageKey>(pthread_key); | 642 return static_cast<Thread::LocalStorageKey>(pthread_key); |
645 #endif | 643 #endif |
646 } | 644 } |
647 | 645 |
648 | 646 |
649 static pthread_key_t LocalKeyToPthreadKey(Thread::LocalStorageKey local_key) { | 647 static pthread_key_t LocalKeyToPthreadKey(Thread::LocalStorageKey local_key) { |
650 #if defined(__CYGWIN__) | 648 #if V8_OS_CYGWIN |
651 STATIC_ASSERT(sizeof(Thread::LocalStorageKey) == sizeof(pthread_key_t)); | 649 STATIC_ASSERT(sizeof(Thread::LocalStorageKey) == sizeof(pthread_key_t)); |
652 intptr_t ptr_key = static_cast<intptr_t>(local_key); | 650 intptr_t ptr_key = static_cast<intptr_t>(local_key); |
653 return reinterpret_cast<pthread_key_t>(ptr_key); | 651 return reinterpret_cast<pthread_key_t>(ptr_key); |
654 #else | 652 #else |
655 return static_cast<pthread_key_t>(local_key); | 653 return static_cast<pthread_key_t>(local_key); |
656 #endif | 654 #endif |
657 } | 655 } |
658 | 656 |
659 | 657 |
660 #ifdef V8_FAST_TLS_SUPPORTED | 658 #ifdef V8_FAST_TLS_SUPPORTED |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
990 return ntohl(value); | 988 return ntohl(value); |
991 } | 989 } |
992 | 990 |
993 | 991 |
994 Socket* OS::CreateSocket() { | 992 Socket* OS::CreateSocket() { |
995 return new POSIXSocket(); | 993 return new POSIXSocket(); |
996 } | 994 } |
997 | 995 |
998 | 996 |
999 } } // namespace v8::internal | 997 } } // namespace v8::internal |
OLD | NEW |