| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Platform-specific code for POSIX goes here. This is not a platform on its | 5 // Platform-specific code for POSIX goes here. This is not a platform on its |
| 6 // own, but contains the parts which are the same across the POSIX platforms | 6 // own, but contains the parts which are the same across the POSIX platforms |
| 7 // Linux, MacOS, FreeBSD, OpenBSD, NetBSD and QNX. | 7 // Linux, MacOS, FreeBSD, OpenBSD, NetBSD and QNX. |
| 8 | 8 |
| 9 #include <errno.h> | 9 #include <errno.h> |
| 10 #include <limits.h> | 10 #include <limits.h> |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 asm("int $3"); | 252 asm("int $3"); |
| 253 #endif // V8_OS_NACL | 253 #endif // V8_OS_NACL |
| 254 #elif V8_HOST_ARCH_X64 | 254 #elif V8_HOST_ARCH_X64 |
| 255 asm("int $3"); | 255 asm("int $3"); |
| 256 #else | 256 #else |
| 257 #error Unsupported host architecture. | 257 #error Unsupported host architecture. |
| 258 #endif | 258 #endif |
| 259 } | 259 } |
| 260 | 260 |
| 261 | 261 |
| 262 class PosixMemoryMappedFile final : public OS::MemoryMappedFile { |
| 263 public: |
| 264 PosixMemoryMappedFile(FILE* file, void* memory, size_t size) |
| 265 : file_(file), memory_(memory), size_(size) {} |
| 266 ~PosixMemoryMappedFile() final; |
| 267 void* memory() const final { return memory_; } |
| 268 size_t size() const final { return size_; } |
| 269 |
| 270 private: |
| 271 FILE* const file_; |
| 272 void* const memory_; |
| 273 size_t const size_; |
| 274 }; |
| 275 |
| 276 |
| 277 // static |
| 278 OS::MemoryMappedFile* OS::MemoryMappedFile::open(const char* name) { |
| 279 if (FILE* file = fopen(name, "r+")) { |
| 280 if (fseek(file, 0, SEEK_END) == 0) { |
| 281 long size = ftell(file); // NOLINT(runtime/int) |
| 282 if (size >= 0) { |
| 283 void* const memory = |
| 284 mmap(OS::GetRandomMmapAddr(), size, PROT_READ | PROT_WRITE, |
| 285 MAP_SHARED, fileno(file), 0); |
| 286 if (memory != MAP_FAILED) { |
| 287 return new PosixMemoryMappedFile(file, memory, size); |
| 288 } |
| 289 } |
| 290 } |
| 291 fclose(file); |
| 292 } |
| 293 return nullptr; |
| 294 } |
| 295 |
| 296 |
| 297 // static |
| 298 OS::MemoryMappedFile* OS::MemoryMappedFile::create(const char* name, |
| 299 size_t size, void* initial) { |
| 300 if (FILE* file = fopen(name, "w+")) { |
| 301 size_t result = fwrite(initial, 1, size, file); |
| 302 if (result == size && !ferror(file)) { |
| 303 void* memory = mmap(OS::GetRandomMmapAddr(), result, |
| 304 PROT_READ | PROT_WRITE, MAP_SHARED, fileno(file), 0); |
| 305 if (memory != MAP_FAILED) { |
| 306 return new PosixMemoryMappedFile(file, memory, result); |
| 307 } |
| 308 } |
| 309 fclose(file); |
| 310 } |
| 311 return nullptr; |
| 312 } |
| 313 |
| 314 |
| 315 PosixMemoryMappedFile::~PosixMemoryMappedFile() { |
| 316 if (memory_) OS::Free(memory_, size_); |
| 317 fclose(file_); |
| 318 } |
| 319 |
| 320 |
| 262 int OS::GetCurrentProcessId() { | 321 int OS::GetCurrentProcessId() { |
| 263 return static_cast<int>(getpid()); | 322 return static_cast<int>(getpid()); |
| 264 } | 323 } |
| 265 | 324 |
| 266 | 325 |
| 267 int OS::GetCurrentThreadId() { | 326 int OS::GetCurrentThreadId() { |
| 268 #if V8_OS_MACOSX || (V8_OS_ANDROID && defined(__APPLE__)) | 327 #if V8_OS_MACOSX || (V8_OS_ANDROID && defined(__APPLE__)) |
| 269 return static_cast<int>(pthread_mach_thread_np(pthread_self())); | 328 return static_cast<int>(pthread_mach_thread_np(pthread_self())); |
| 270 #elif V8_OS_LINUX | 329 #elif V8_OS_LINUX |
| 271 return static_cast<int>(syscall(__NR_gettid)); | 330 return static_cast<int>(syscall(__NR_gettid)); |
| 272 #elif V8_OS_ANDROID | 331 #elif V8_OS_ANDROID |
| 273 return static_cast<int>(gettid()); | 332 return static_cast<int>(gettid()); |
| 274 #elif V8_OS_AIX | 333 #elif V8_OS_AIX |
| 275 return static_cast<int>(thread_self()); | 334 return static_cast<int>(thread_self()); |
| 276 #elif V8_OS_SOLARIS | 335 #elif V8_OS_SOLARIS |
| 277 return static_cast<int>(pthread_self()); | 336 return static_cast<int>(pthread_self()); |
| 278 #else | 337 #else |
| 279 return static_cast<int>(reinterpret_cast<intptr_t>(pthread_self())); | 338 return static_cast<int>(reinterpret_cast<intptr_t>(pthread_self())); |
| 280 #endif | 339 #endif |
| 281 } | 340 } |
| 282 | 341 |
| 283 | 342 |
| 284 // ---------------------------------------------------------------------------- | 343 // ---------------------------------------------------------------------------- |
| 285 // POSIX date/time support. | 344 // POSIX date/time support. |
| 286 // | 345 // |
| 287 | 346 |
| 288 int OS::GetUserTime(uint32_t* secs, uint32_t* usecs) { | 347 int OS::GetUserTime(uint32_t* secs, uint32_t* usecs) { |
| 289 #if V8_OS_NACL | 348 #if V8_OS_NACL |
| 290 // Optionally used in Logger::ResourceEvent. | 349 // Optionally used in Logger::ResourceEvent. |
| 291 return -1; | 350 return -1; |
| 292 #else | 351 #else |
| 293 struct rusage usage; | 352 struct rusage usage; |
| 294 | 353 |
| 295 if (getrusage(RUSAGE_SELF, &usage) < 0) return -1; | 354 if (getrusage(RUSAGE_SELF, &usage) < 0) return -1; |
| 296 *secs = usage.ru_utime.tv_sec; | 355 *secs = static_cast<uint32_t>(usage.ru_utime.tv_sec); |
| 297 *usecs = usage.ru_utime.tv_usec; | 356 *usecs = static_cast<uint32_t>(usage.ru_utime.tv_usec); |
| 298 return 0; | 357 return 0; |
| 299 #endif | 358 #endif |
| 300 } | 359 } |
| 301 | 360 |
| 302 | 361 |
| 303 double OS::TimeCurrentMillis() { | 362 double OS::TimeCurrentMillis() { |
| 304 return Time::Now().ToJsTime(); | 363 return Time::Now().ToJsTime(); |
| 305 } | 364 } |
| 306 | 365 |
| 307 | 366 |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 697 | 756 |
| 698 void Thread::SetThreadLocal(LocalStorageKey key, void* value) { | 757 void Thread::SetThreadLocal(LocalStorageKey key, void* value) { |
| 699 pthread_key_t pthread_key = LocalKeyToPthreadKey(key); | 758 pthread_key_t pthread_key = LocalKeyToPthreadKey(key); |
| 700 int result = pthread_setspecific(pthread_key, value); | 759 int result = pthread_setspecific(pthread_key, value); |
| 701 DCHECK_EQ(0, result); | 760 DCHECK_EQ(0, result); |
| 702 USE(result); | 761 USE(result); |
| 703 } | 762 } |
| 704 | 763 |
| 705 | 764 |
| 706 } } // namespace v8::base | 765 } } // namespace v8::base |
| OLD | NEW |