19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * System clock functions. 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 221f5762e646bed2290934280464832782766ee68eMathias Agopian#ifdef HAVE_ANDROID_OS 231f5762e646bed2290934280464832782766ee68eMathias Agopian#include <linux/ioctl.h> 241f5762e646bed2290934280464832782766ee68eMathias Agopian#include <linux/rtc.h> 251f5762e646bed2290934280464832782766ee68eMathias Agopian#include <utils/Atomic.h> 261f5762e646bed2290934280464832782766ee68eMathias Agopian#include <linux/android_alarm.h> 271f5762e646bed2290934280464832782766ee68eMathias Agopian#endif 281f5762e646bed2290934280464832782766ee68eMathias Agopian 291f5762e646bed2290934280464832782766ee68eMathias Agopian#include <sys/time.h> 301f5762e646bed2290934280464832782766ee68eMathias Agopian#include <limits.h> 311f5762e646bed2290934280464832782766ee68eMathias Agopian#include <fcntl.h> 321f5762e646bed2290934280464832782766ee68eMathias Agopian#include <errno.h> 331f5762e646bed2290934280464832782766ee68eMathias Agopian#include <string.h> 341f5762e646bed2290934280464832782766ee68eMathias Agopian 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h" 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h" 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/time.h> 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <time.h> 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 421f5762e646bed2290934280464832782766ee68eMathias Agopian#include <utils/SystemClock.h> 431f5762e646bed2290934280464832782766ee68eMathias Agopian 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 471f5762e646bed2290934280464832782766ee68eMathias Agopian * Set the current time. This only works when running as root. 481f5762e646bed2290934280464832782766ee68eMathias Agopian */ 491f5762e646bed2290934280464832782766ee68eMathias Agopianstatic int setCurrentTimeMillis(int64_t millis) 501f5762e646bed2290934280464832782766ee68eMathias Agopian{ 511f5762e646bed2290934280464832782766ee68eMathias Agopian struct timeval tv; 521f5762e646bed2290934280464832782766ee68eMathias Agopian struct timespec ts; 531f5762e646bed2290934280464832782766ee68eMathias Agopian int fd; 541f5762e646bed2290934280464832782766ee68eMathias Agopian int res; 551f5762e646bed2290934280464832782766ee68eMathias Agopian int ret = 0; 561f5762e646bed2290934280464832782766ee68eMathias Agopian 571f5762e646bed2290934280464832782766ee68eMathias Agopian if (millis <= 0 || millis / 1000LL >= INT_MAX) { 581f5762e646bed2290934280464832782766ee68eMathias Agopian return -1; 591f5762e646bed2290934280464832782766ee68eMathias Agopian } 601f5762e646bed2290934280464832782766ee68eMathias Agopian 611f5762e646bed2290934280464832782766ee68eMathias Agopian tv.tv_sec = (time_t) (millis / 1000LL); 621f5762e646bed2290934280464832782766ee68eMathias Agopian tv.tv_usec = (suseconds_t) ((millis % 1000LL) * 1000LL); 631f5762e646bed2290934280464832782766ee68eMathias Agopian 641f5762e646bed2290934280464832782766ee68eMathias Agopian ALOGD("Setting time of day to sec=%d\n", (int) tv.tv_sec); 651f5762e646bed2290934280464832782766ee68eMathias Agopian 661f5762e646bed2290934280464832782766ee68eMathias Agopian fd = open("/dev/alarm", O_RDWR); 671f5762e646bed2290934280464832782766ee68eMathias Agopian if(fd < 0) { 681f5762e646bed2290934280464832782766ee68eMathias Agopian ALOGW("Unable to open alarm driver: %s\n", strerror(errno)); 691f5762e646bed2290934280464832782766ee68eMathias Agopian return -1; 701f5762e646bed2290934280464832782766ee68eMathias Agopian } 711f5762e646bed2290934280464832782766ee68eMathias Agopian ts.tv_sec = tv.tv_sec; 721f5762e646bed2290934280464832782766ee68eMathias Agopian ts.tv_nsec = tv.tv_usec * 1000; 731f5762e646bed2290934280464832782766ee68eMathias Agopian res = ioctl(fd, ANDROID_ALARM_SET_RTC, &ts); 741f5762e646bed2290934280464832782766ee68eMathias Agopian if(res < 0) { 751f5762e646bed2290934280464832782766ee68eMathias Agopian ALOGW("Unable to set rtc to %ld: %s\n", tv.tv_sec, strerror(errno)); 761f5762e646bed2290934280464832782766ee68eMathias Agopian ret = -1; 771f5762e646bed2290934280464832782766ee68eMathias Agopian } 781f5762e646bed2290934280464832782766ee68eMathias Agopian close(fd); 791f5762e646bed2290934280464832782766ee68eMathias Agopian return ret; 801f5762e646bed2290934280464832782766ee68eMathias Agopian} 811f5762e646bed2290934280464832782766ee68eMathias Agopian 821f5762e646bed2290934280464832782766ee68eMathias Agopian/* 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native public static void setCurrentTimeMillis(long millis) 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the current time. This only works when running as root. 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_SystemClock_setCurrentTimeMillis(JNIEnv* env, 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject clazz, jlong millis) 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (setCurrentTimeMillis(millis) == 0); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native public static long uptimeMillis(); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_SystemClock_uptimeMillis(JNIEnv* env, 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject clazz) 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jlong)uptimeMillis(); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native public static long elapsedRealtime(); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_SystemClock_elapsedRealtime(JNIEnv* env, 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject clazz) 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (jlong)elapsedRealtime(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * native public static long currentThreadTimeMillis(); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_SystemClock_currentThreadTimeMillis(JNIEnv* env, 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject clazz) 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if defined(HAVE_POSIX_CLOCKS) 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct timespec tm; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tm); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return tm.tv_sec * 1000LL + tm.tv_nsec / 1000000; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct timeval tv; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gettimeofday(&tv, NULL); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return tv.tv_sec * 1000LL + tv.tv_usec / 1000; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 132648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * native public static long currentThreadTimeMicro(); 133648bee18a1ccd362445d562729250ff5910f16a0Romain Guy */ 134648bee18a1ccd362445d562729250ff5910f16a0Romain Guystatic jlong android_os_SystemClock_currentThreadTimeMicro(JNIEnv* env, 135648bee18a1ccd362445d562729250ff5910f16a0Romain Guy jobject clazz) 136648bee18a1ccd362445d562729250ff5910f16a0Romain Guy{ 137648bee18a1ccd362445d562729250ff5910f16a0Romain Guy#if defined(HAVE_POSIX_CLOCKS) 138648bee18a1ccd362445d562729250ff5910f16a0Romain Guy struct timespec tm; 139648bee18a1ccd362445d562729250ff5910f16a0Romain Guy 140648bee18a1ccd362445d562729250ff5910f16a0Romain Guy clock_gettime(CLOCK_THREAD_CPUTIME_ID, &tm); 141648bee18a1ccd362445d562729250ff5910f16a0Romain Guy 142648bee18a1ccd362445d562729250ff5910f16a0Romain Guy return tm.tv_sec * 1000000LL + tm.tv_nsec / 1000; 143648bee18a1ccd362445d562729250ff5910f16a0Romain Guy#else 144648bee18a1ccd362445d562729250ff5910f16a0Romain Guy struct timeval tv; 145648bee18a1ccd362445d562729250ff5910f16a0Romain Guy 146648bee18a1ccd362445d562729250ff5910f16a0Romain Guy gettimeofday(&tv, NULL); 147648bee18a1ccd362445d562729250ff5910f16a0Romain Guy return tv.tv_sec * 1000000LL + tv.tv_nsec / 1000; 148648bee18a1ccd362445d562729250ff5910f16a0Romain Guy#endif 149648bee18a1ccd362445d562729250ff5910f16a0Romain Guy} 150648bee18a1ccd362445d562729250ff5910f16a0Romain Guy 151648bee18a1ccd362445d562729250ff5910f16a0Romain Guy/* 152648bee18a1ccd362445d562729250ff5910f16a0Romain Guy * native public static long currentTimeMicro(); 153648bee18a1ccd362445d562729250ff5910f16a0Romain Guy */ 154648bee18a1ccd362445d562729250ff5910f16a0Romain Guystatic jlong android_os_SystemClock_currentTimeMicro(JNIEnv* env, 155648bee18a1ccd362445d562729250ff5910f16a0Romain Guy jobject clazz) 156648bee18a1ccd362445d562729250ff5910f16a0Romain Guy{ 157648bee18a1ccd362445d562729250ff5910f16a0Romain Guy struct timeval tv; 158648bee18a1ccd362445d562729250ff5910f16a0Romain Guy 159648bee18a1ccd362445d562729250ff5910f16a0Romain Guy gettimeofday(&tv, NULL); 160648bee18a1ccd362445d562729250ff5910f16a0Romain Guy return tv.tv_sec * 1000000LL + tv.tv_usec; 161648bee18a1ccd362445d562729250ff5910f16a0Romain Guy} 162648bee18a1ccd362445d562729250ff5910f16a0Romain Guy 163648bee18a1ccd362445d562729250ff5910f16a0Romain Guy/* 16495f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly * public static native long elapsedRealtimeNano(); 16595f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly */ 16695f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pellystatic jlong android_os_SystemClock_elapsedRealtimeNano(JNIEnv* env, 16795f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly jobject clazz) 16895f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly{ 16995f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly return (jlong)elapsedRealtimeNano(); 17095f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly} 17195f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly 17295f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly/* 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration. 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "setCurrentTimeMillis", "(J)Z", 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_os_SystemClock_setCurrentTimeMillis }, 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "uptimeMillis", "()J", 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_os_SystemClock_uptimeMillis }, 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "elapsedRealtime", "()J", 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_os_SystemClock_elapsedRealtime }, 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "currentThreadTimeMillis", "()J", 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_os_SystemClock_currentThreadTimeMillis }, 185648bee18a1ccd362445d562729250ff5910f16a0Romain Guy { "currentThreadTimeMicro", "()J", 186648bee18a1ccd362445d562729250ff5910f16a0Romain Guy (void*) android_os_SystemClock_currentThreadTimeMicro }, 187648bee18a1ccd362445d562729250ff5910f16a0Romain Guy { "currentTimeMicro", "()J", 188648bee18a1ccd362445d562729250ff5910f16a0Romain Guy (void*) android_os_SystemClock_currentTimeMicro }, 189dd78d462f6dceac71f9d1cbb723bb38a3b5bdc2eJeff Sharkey { "elapsedRealtimeNanos", "()J", 19095f1158908d990bbf954d7cc78f3f214a6c84f1fNick Pelly (void*) android_os_SystemClock_elapsedRealtimeNano }, 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_os_SystemClock(JNIEnv* env) 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/os/SystemClock", gMethods, NELEM(gMethods)); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 200