Commit 7dece760 authored by iposva@chromium.org's avatar iposva@chromium.org

- Fix delta time calculation in LinuxSemaphore::Wait.

Review URL: http://codereview.chromium.org/69024

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1732 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent b34db3d2
......@@ -108,7 +108,7 @@ LIBRARY_FLAGS = {
'os:linux': {
'CCFLAGS': ['-ansi'],
'library:shared': {
'LIBS': ['pthread', 'rt']
'LIBS': ['pthread']
}
},
'os:macos': {
......@@ -224,7 +224,7 @@ V8_EXTRA_FLAGS = {
MKSNAPSHOT_EXTRA_FLAGS = {
'gcc': {
'os:linux': {
'LIBS': ['pthread', 'rt'],
'LIBS': ['pthread'],
},
'os:macos': {
'LIBS': ['pthread'],
......@@ -269,7 +269,7 @@ CCTEST_EXTRA_FLAGS = {
'LIBPATH': [abspath('.')]
},
'os:linux': {
'LIBS': ['pthread', 'rt'],
'LIBS': ['pthread'],
},
'os:macos': {
'LIBS': ['pthread'],
......@@ -308,7 +308,7 @@ SAMPLE_FLAGS = {
'CCFLAGS': ['-fno-rtti', '-fno-exceptions']
},
'os:linux': {
'LIBS': ['pthread', 'rt'],
'LIBS': ['pthread'],
},
'os:macos': {
'LIBS': ['pthread'],
......@@ -388,7 +388,7 @@ D8_FLAGS = {
'LIBS': ['readline']
},
'os:linux': {
'LIBS': ['pthread', 'rt'],
'LIBS': ['pthread'],
},
'os:macos': {
'LIBS': ['pthread'],
......
......@@ -503,27 +503,24 @@ void FreeBSDSemaphore::Wait() {
bool FreeBSDSemaphore::Wait(int timeout) {
const long kOneSecondMicros = 1000000; // NOLINT
const long kOneSecondNanos = 1000000000; // NOLINT
// Split timeout into second and nanosecond parts.
long nanos = (timeout % kOneSecondMicros) * 1000; // NOLINT
time_t secs = timeout / kOneSecondMicros;
struct timeval delta;
delta.tv_usec = timeout % kOneSecondMicros;
delta.tv_sec = timeout / kOneSecondMicros;
// Get the current real time clock.
struct timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts) == -1) {
struct timeval current_time;
// Get the current time.
if (gettimeofday(&current_time, NULL) == -1) {
return false;
}
// Calculate realtime for end of timeout.
ts.tv_nsec += nanos;
if (ts.tv_nsec >= kOneSecondNanos) {
ts.tv_nsec -= kOneSecondNanos;
ts.tv_nsec++;
}
ts.tv_sec += secs;
// Calculate time for end of timeout.
struct timeval end_time;
timeradd(&current_time, &delta, &end_time);
// Wait for semaphore signalled or timeout.
struct timespec ts;
TIMEVAL_TO_TIMESPEC(&end_time, &ts);
while (true) {
int result = sem_timedwait(&sem_, &ts);
if (result == 0) return true; // Successfully got semaphore.
......
......@@ -509,26 +509,24 @@ void LinuxSemaphore::Wait() {
bool LinuxSemaphore::Wait(int timeout) {
const long kOneSecondMicros = 1000000; // NOLINT
const long kOneSecondNanos = 1000000000; // NOLINT
// Split timeout into second and nanosecond parts.
long nanos = (timeout % kOneSecondMicros) * 1000; // NOLINT
time_t secs = timeout / kOneSecondMicros;
struct timeval delta;
delta.tv_usec = timeout % kOneSecondMicros;
delta.tv_sec = timeout / kOneSecondMicros;
// Get the current realtime clock.
struct timespec ts;
if (clock_gettime(CLOCK_REALTIME, &ts) == -1) {
struct timeval current_time;
// Get the current time.
if (gettimeofday(&current_time, NULL) == -1) {
return false;
}
// Calculate real time for end of timeout.
ts.tv_nsec += nanos;
if (ts.tv_nsec >= kOneSecondNanos) {
ts.tv_nsec -= kOneSecondNanos;
ts.tv_nsec++;
}
ts.tv_sec += secs;
// Calculate time for end of timeout.
struct timeval end_time;
timeradd(&current_time, &delta, &end_time);
struct timespec ts;
TIMEVAL_TO_TIMESPEC(&end_time, &ts);
// Wait for semaphore signalled or timeout.
while (true) {
int result = sem_timedwait(&sem_, &ts);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment