Use CLOCK_MONOTONIC instead of CLOCK_MONOTONIC_RAW in performanceNow

Reviewed By: AaaChiuuu

Differential Revision: D4688909

fbshipit-source-id: 30d02ea6af4cce47bcd4fe41bc1f048dccbb3b2b
This commit is contained in:
Alexey Lang 2017-03-10 10:10:35 -08:00 committed by Facebook Github Bot
parent acb9fa8f66
commit 434ca242ec
1 changed files with 8 additions and 2 deletions

View File

@ -73,9 +73,15 @@ static JSValueRef nativePerformanceNow(
static const int64_t NANOSECONDS_IN_SECOND = 1000000000LL; static const int64_t NANOSECONDS_IN_SECOND = 1000000000LL;
static const int64_t NANOSECONDS_IN_MILLISECOND = 1000000LL; static const int64_t NANOSECONDS_IN_MILLISECOND = 1000000LL;
// This is equivalent to android.os.SystemClock.elapsedRealtime() in native // Since SystemClock.uptimeMillis() is commonly used for performance measurement in Java
// and uptimeMillis() internally uses clock_gettime(CLOCK_MONOTONIC),
// we use the same API here.
// We need that to make sure we use the same time system on both JS and Java sides.
// Links to the source code:
// https://android.googlesource.com/platform/frameworks/native/+/jb-mr1-release/libs/utils/SystemClock.cpp
// https://android.googlesource.com/platform/system/core/+/master/libutils/Timers.cpp
struct timespec now; struct timespec now;
clock_gettime(CLOCK_MONOTONIC_RAW, &now); clock_gettime(CLOCK_MONOTONIC, &now);
int64_t nano = now.tv_sec * NANOSECONDS_IN_SECOND + now.tv_nsec; int64_t nano = now.tv_sec * NANOSECONDS_IN_SECOND + now.tv_nsec;
return Value::makeNumber(ctx, (nano / (double)NANOSECONDS_IN_MILLISECOND)); return Value::makeNumber(ctx, (nano / (double)NANOSECONDS_IN_MILLISECOND));
} }