OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 while (true) { | 502 while (true) { |
503 int result = sem_wait(&sem_); | 503 int result = sem_wait(&sem_); |
504 if (result == 0) return; // Successfully got semaphore. | 504 if (result == 0) return; // Successfully got semaphore. |
505 CHECK(result == -1 && errno == EINTR); // Signal caused spurious wakeup. | 505 CHECK(result == -1 && errno == EINTR); // Signal caused spurious wakeup. |
506 } | 506 } |
507 } | 507 } |
508 | 508 |
509 | 509 |
510 bool LinuxSemaphore::Wait(int timeout) { | 510 bool LinuxSemaphore::Wait(int timeout) { |
511 const long kOneSecondMicros = 1000000; // NOLINT | 511 const long kOneSecondMicros = 1000000; // NOLINT |
512 const long kOneSecondNanos = 1000000000; // NOLINT | 512 |
513 | |
514 // Split timeout into second and nanosecond parts. | 513 // Split timeout into second and nanosecond parts. |
515 long nanos = (timeout % kOneSecondMicros) * 1000; // NOLINT | 514 struct timeval delta; |
516 time_t secs = timeout / kOneSecondMicros; | 515 delta.tv_usec = timeout % kOneSecondMicros; |
517 | 516 delta.tv_sec = timeout / kOneSecondMicros; |
518 // Get the current realtime clock. | 517 |
519 struct timespec ts; | 518 struct timeval current_time; |
520 if (clock_gettime(CLOCK_REALTIME, &ts) == -1) { | 519 // Get the current time. |
| 520 if (gettimeofday(¤t_time, NULL) == -1) { |
521 return false; | 521 return false; |
522 } | 522 } |
523 | 523 |
524 // Calculate real time for end of timeout. | 524 // Calculate time for end of timeout. |
525 ts.tv_nsec += nanos; | 525 struct timeval end_time; |
526 if (ts.tv_nsec >= kOneSecondNanos) { | 526 timeradd(¤t_time, &delta, &end_time); |
527 ts.tv_nsec -= kOneSecondNanos; | 527 |
528 ts.tv_nsec++; | 528 struct timespec ts; |
529 } | 529 TIMEVAL_TO_TIMESPEC(&end_time, &ts); |
530 ts.tv_sec += secs; | |
531 | |
532 // Wait for semaphore signalled or timeout. | 530 // Wait for semaphore signalled or timeout. |
533 while (true) { | 531 while (true) { |
534 int result = sem_timedwait(&sem_, &ts); | 532 int result = sem_timedwait(&sem_, &ts); |
535 if (result == 0) return true; // Successfully got semaphore. | 533 if (result == 0) return true; // Successfully got semaphore. |
536 if (result > 0) { | 534 if (result > 0) { |
537 // For glibc prior to 2.3.4 sem_timedwait returns the error instead of -1. | 535 // For glibc prior to 2.3.4 sem_timedwait returns the error instead of -1. |
538 errno = result; | 536 errno = result; |
539 result = -1; | 537 result = -1; |
540 } | 538 } |
541 if (result == -1 && errno == ETIMEDOUT) return false; // Timeout. | 539 if (result == -1 && errno == ETIMEDOUT) return false; // Timeout. |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
669 } | 667 } |
670 | 668 |
671 // This sampler is no longer the active sampler. | 669 // This sampler is no longer the active sampler. |
672 active_sampler_ = NULL; | 670 active_sampler_ = NULL; |
673 active_ = false; | 671 active_ = false; |
674 } | 672 } |
675 | 673 |
676 #endif // ENABLE_LOGGING_AND_PROFILING | 674 #endif // ENABLE_LOGGING_AND_PROFILING |
677 | 675 |
678 } } // namespace v8::internal | 676 } } // namespace v8::internal |
OLD | NEW |