OpenjdkJvm.cc revision 6fb4c732f3fed182fdd4d9a725a9d039d42dce83
128ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath/* Copyright (C) 2014 The Android Open Source Project 228ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 328ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * 428ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * This file implements interfaces from the file jvm.h. This implementation 528ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * is licensed under the same terms as the file jvm.h. The 628ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * copyright and license information for the file jvm.h follows. 728ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * 828ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. 928ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1028ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * 1128ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * This code is free software; you can redistribute it and/or modify it 1228ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * under the terms of the GNU General Public License version 2 only, as 1328ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * published by the Free Software Foundation. Oracle designates this 1428ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * particular file as subject to the "Classpath" exception as provided 1528ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * by Oracle in the LICENSE file that accompanied this code. 16df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * 1728ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * This code is distributed in the hope that it will be useful, but WITHOUT 1828ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1928ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 2028ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * version 2 for more details (a copy is included in the LICENSE file that 2128ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * accompanied this code). 22df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * 2328ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * You should have received a copy of the GNU General Public License version 2428ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * 2 along with this work; if not, write to the Free Software Foundation, 2528ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 26df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * 2728ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2828ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * or visit www.oracle.com if you need additional information or have any 2928ee8dbece62bf1ed9a7dfd3c581fd5860ed8867Narayan Kamath * questions. 30df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski */ 31df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 32df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* 33df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * Services that OpenJDK expects the VM to provide. 34df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski */ 35df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include<stdio.h> 36df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include <dlfcn.h> 37df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include <limits.h> 38df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include <unistd.h> 39df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 40df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "common_throws.h" 41df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "gc/heap.h" 42df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "thread.h" 43df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "thread_list.h" 44df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "runtime.h" 45df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "handle_scope-inl.h" 46df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "scoped_thread_state_change.h" 47df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "ScopedUtfChars.h" 48df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "mirror/class_loader.h" 49df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "verify_object-inl.h" 50df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "base/logging.h" 51df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "base/macros.h" 52a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath#include "../../libcore/ojluni/src/main/native/jvm.h" // TODO(narayan): fix it 53df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "jni_internal.h" 54df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "mirror/string-inl.h" 5518d209582e0bb1caed97102a86b416173f5aad42Narayan Kamath#include "native/scoped_fast_native_object_access.h" 56df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include "ScopedLocalRef.h" 57df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include <sys/time.h> 58df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include <sys/socket.h> 59df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#include <sys/ioctl.h> 60df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 613e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov#ifdef __ANDROID__ 623e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov// This function is provided by android linker. 633e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanovextern "C" void android_update_LD_LIBRARY_PATH(const char* ld_library_path); 643e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov#endif // __ANDROID__ 653e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov 66df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#undef LOG_TAG 676280ef88a9231d2a14f2b0bbe6d39770c994787dNarayan Kamath#define LOG_TAG "artopenjdk" 68df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 69d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamathusing art::WARNING; 70d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamathusing art::INFO; 71d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamathusing art::ERROR; 72d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamathusing art::FATAL; 73d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath 74df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix open() with extensions; used by e.g. ZipFile */ 75a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Open(const char* fname, jint flags, jint mode) { 76df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski /* 77df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * The call is expected to handle JVM_O_DELETE, which causes the file 78df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * to be removed after it is opened. Also, some code seems to 79df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * want the special return value JVM_EEXIST if the file open fails 80df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * due to O_EXCL. 81df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski */ 82df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski int fd = TEMP_FAILURE_RETRY(open(fname, flags & ~JVM_O_DELETE, mode)); 83df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski if (fd < 0) { 84df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski int err = errno; 85df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski if (err == EEXIST) { 86df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return JVM_EEXIST; 87df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } else { 88df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return -1; 89df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 90df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 91df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 92df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski if (flags & JVM_O_DELETE) { 93df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski if (unlink(fname) != 0) { 94df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski LOG(WARNING) << "Post-open deletion of '" << fname << "' failed: " << strerror(errno); 95df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 96df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 97df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 98df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return fd; 99df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 100df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 101df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix close() */ 102a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Close(jint fd) { 103df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski // don't want TEMP_FAILURE_RETRY here -- file is closed even if EINTR 104df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return close(fd); 105df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 106df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 107df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix read() */ 108a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Read(jint fd, char* buf, jint nbytes) { 109df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return TEMP_FAILURE_RETRY(read(fd, buf, nbytes)); 110df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 111df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 112df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix write(); is used to write messages to stderr */ 113a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Write(jint fd, char* buf, jint nbytes) { 114df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return TEMP_FAILURE_RETRY(write(fd, buf, nbytes)); 115df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 116df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 117df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix lseek() */ 118a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jlong JVM_Lseek(jint fd, jlong offset, jint whence) { 1196fb4c732f3fed182fdd4d9a725a9d039d42dce83Narayan Kamath // NOTE: Using TEMP_FAILURE_RETRY here is busted for LP32 on glibc - the return 1206fb4c732f3fed182fdd4d9a725a9d039d42dce83Narayan Kamath // value will be coerced into an int32_t. 1216fb4c732f3fed182fdd4d9a725a9d039d42dce83Narayan Kamath // 1226fb4c732f3fed182fdd4d9a725a9d039d42dce83Narayan Kamath // lseek64 isn't specified to return EINTR so it shouldn't be necessary 1236fb4c732f3fed182fdd4d9a725a9d039d42dce83Narayan Kamath // anyway. 1246fb4c732f3fed182fdd4d9a725a9d039d42dce83Narayan Kamath return lseek64(fd, offset, whence); 125df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 126a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath 127df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* 128df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * "raw monitors" seem to be expected to behave like non-recursive pthread 129df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * mutexes. They're used by ZipFile. 130df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski */ 131a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT void* JVM_RawMonitorCreate(void) { 1326c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath pthread_mutex_t* mutex = 133a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath reinterpret_cast<pthread_mutex_t*>(malloc(sizeof(pthread_mutex_t))); 1346c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath CHECK(mutex != nullptr); 1356c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath CHECK_PTHREAD_CALL(pthread_mutex_init, (mutex, nullptr), "JVM_RawMonitorCreate"); 1366c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath return mutex; 137df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 138df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 139a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT void JVM_RawMonitorDestroy(void* mon) { 1406c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath CHECK_PTHREAD_CALL(pthread_mutex_destroy, 1416c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath (reinterpret_cast<pthread_mutex_t*>(mon)), 1426c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath "JVM_RawMonitorDestroy"); 1436c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath free(mon); 144df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 145df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 146a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_RawMonitorEnter(void* mon) { 147a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return pthread_mutex_lock(reinterpret_cast<pthread_mutex_t*>(mon)); 148df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 149df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 150a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT void JVM_RawMonitorExit(void* mon) { 1516c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath CHECK_PTHREAD_CALL(pthread_mutex_unlock, 1526c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath (reinterpret_cast<pthread_mutex_t*>(mon)), 1536c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath "JVM_RawMonitorExit"); 154df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 155df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 156a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT char* JVM_NativePath(char* path) { 157df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return path; 158df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 159df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 160a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_GetLastErrorString(char* buf, int len) { 161d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath#if defined(__GLIBC__) || defined(__BIONIC__) 162d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath if (len == 0) { 163d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath return 0; 164d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath } 165df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 16644ba97e747b928f734329226c5daf0eb36f8f687Narayan Kamath const int err = errno; 167d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath char* result = strerror_r(err, buf, len); 168d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath if (result != buf) { 169d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath strncpy(buf, result, len); 170d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath buf[len - 1] = '\0'; 171d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath } 172df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 173d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath return strlen(buf); 174df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#else 175d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath UNUSED(buf); 176d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath UNUSED(len); 177d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath return -1; 178df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#endif 179df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 180df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 181a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT int jio_fprintf(FILE* fp, const char* fmt, ...) { 182df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski va_list args; 183df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 184df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski va_start(args, fmt); 185df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski int len = jio_vfprintf(fp, fmt, args); 186df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski va_end(args); 187df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 188df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return len; 189df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 190df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 191a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT int jio_vfprintf(FILE* fp, const char* fmt, va_list args) { 192df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski assert(fp != NULL); 193df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return vfprintf(fp, fmt, args); 194df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 195df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 196df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix fsync() */ 197a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Sync(jint fd) { 198df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return TEMP_FAILURE_RETRY(fsync(fd)); 199df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 200df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 201a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT void* JVM_FindLibraryEntry(void* handle, const char* name) { 20267d39adad3261f3932defef6b2d1d30b470d1be0Przemyslaw Szczepaniak return dlsym(handle, name); 203df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 204df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 20544ba97e747b928f734329226c5daf0eb36f8f687Narayan KamathJNIEXPORT jlong JVM_CurrentTimeMillis(JNIEnv* env ATTRIBUTE_UNUSED, 20644ba97e747b928f734329226c5daf0eb36f8f687Narayan Kamath jclass clazz ATTRIBUTE_UNUSED) { 207df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski struct timeval tv; 208df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski gettimeofday(&tv, (struct timezone *) NULL); 209df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski jlong when = tv.tv_sec * 1000LL + tv.tv_usec / 1000; 210df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return when; 211df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 212df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 213a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Socket(jint domain, jint type, jint protocol) { 214df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return TEMP_FAILURE_RETRY(socket(domain, type, protocol)); 215df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 216df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 217df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jint JVM_InitializeSocketLibrary() { 218df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return 0; 219df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 220df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 221df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebskiint jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) { 222a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath if ((intptr_t)count <= 0) return -1; 223a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return vsnprintf(str, count, fmt, args); 224df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 225df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 226df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebskiint jio_snprintf(char *str, size_t count, const char *fmt, ...) { 227a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath va_list args; 228a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath int len; 229a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath va_start(args, fmt); 230a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath len = jio_vsnprintf(str, count, fmt, args); 231a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath va_end(args); 232a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return len; 233df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 234df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 235df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jint JVM_SetSockOpt(jint fd, int level, int optname, 236a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath const char* optval, int optlen) { 237a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return TEMP_FAILURE_RETRY(setsockopt(fd, level, optname, optval, optlen)); 238df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 239df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 240a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_SocketShutdown(jint fd, jint howto) { 241a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return TEMP_FAILURE_RETRY(shutdown(fd, howto)); 242df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 243df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 244df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jint JVM_GetSockOpt(jint fd, int level, int optname, char* optval, 245a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath int* optlen) { 246a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath socklen_t len = *optlen; 247a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath int cc = TEMP_FAILURE_RETRY(getsockopt(fd, level, optname, optval, &len)); 248a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath *optlen = len; 249a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return cc; 250df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 251df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 252a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_GetSockName(jint fd, struct sockaddr* addr, int* addrlen) { 253a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath socklen_t len = *addrlen; 254a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath int cc = TEMP_FAILURE_RETRY(getsockname(fd, addr, &len)); 255a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath *addrlen = len; 256a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return cc; 257df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 258df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 259a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_SocketAvailable(jint fd, jint* result) { 260a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath if (TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, result)) < 0) { 261a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return JNI_FALSE; 262a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath } 263df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 264a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return JNI_TRUE; 265df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 266df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 267a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Send(jint fd, char* buf, jint nBytes, jint flags) { 268a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return TEMP_FAILURE_RETRY(send(fd, buf, nBytes, flags)); 269df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 270df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 271a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_SocketClose(jint fd) { 27244ba97e747b928f734329226c5daf0eb36f8f687Narayan Kamath // Don't want TEMP_FAILURE_RETRY here -- file is closed even if EINTR. 273a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return close(fd); 274df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 275df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 276a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Listen(jint fd, jint count) { 277a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return TEMP_FAILURE_RETRY(listen(fd, count)); 278df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 279df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 280a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Connect(jint fd, struct sockaddr* addr, jint addrlen) { 281a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return TEMP_FAILURE_RETRY(connect(fd, addr, addrlen)); 282df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 283df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 284a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT int JVM_GetHostName(char* name, int namelen) { 285a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return TEMP_FAILURE_RETRY(gethostname(name, namelen)); 286df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 287df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 288a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jstring JVM_InternString(JNIEnv* env, jstring jstr) { 289a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath art::ScopedFastNativeObjectAccess soa(env); 290a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath art::mirror::String* s = soa.Decode<art::mirror::String*>(jstr); 291a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath art::mirror::String* result = s->Intern(); 292a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return soa.AddLocalReference<jstring>(result); 293df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 294df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 295df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jlong JVM_FreeMemory(void) { 296a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return art::Runtime::Current()->GetHeap()->GetFreeMemory(); 297df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 298df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 299df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jlong JVM_TotalMemory(void) { 300a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return art::Runtime::Current()->GetHeap()->GetTotalMemory(); 301df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 302df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 303df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jlong JVM_MaxMemory(void) { 304a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return art::Runtime::Current()->GetHeap()->GetMaxMemory(); 305df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 306df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 307df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_GC(void) { 308a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath if (art::Runtime::Current()->IsExplicitGcDisabled()) { 309a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath LOG(INFO) << "Explicit GC skipped."; 310a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath return; 311a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath } 312a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath art::Runtime::Current()->GetHeap()->CollectGarbage(false); 313df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 314df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 3156c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT __attribute__((noreturn)) void JVM_Exit(jint status) { 316df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski LOG(INFO) << "System.exit called, status: " << status; 317df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::Runtime::Current()->CallExitHook(status); 318df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski exit(status); 319df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 320df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 3213e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanovstatic void SetLdLibraryPath(JNIEnv* env, jstring javaLdLibraryPath) { 3223e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov#ifdef __ANDROID__ 3233e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov if (javaLdLibraryPath != nullptr) { 3243e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov ScopedUtfChars ldLibraryPath(env, javaLdLibraryPath); 3253e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov if (ldLibraryPath.c_str() != nullptr) { 3263e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov android_update_LD_LIBRARY_PATH(ldLibraryPath.c_str()); 3273e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov } 3283e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov } 3293e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov 3303e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov#else 3313e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov LOG(WARNING) << "android_update_LD_LIBRARY_PATH not found; .so dependencies will not work!"; 3323e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov UNUSED(javaLdLibraryPath, env); 3333e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov#endif 3343e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov} 3353e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov 3363e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov 337c286a7fcd8a446c086127bf03fd07f904e017336Dimitry IvanovJNIEXPORT jstring JVM_NativeLoad(JNIEnv* env, 338c286a7fcd8a446c086127bf03fd07f904e017336Dimitry Ivanov jstring javaFilename, 339c286a7fcd8a446c086127bf03fd07f904e017336Dimitry Ivanov jobject javaLoader, 340c286a7fcd8a446c086127bf03fd07f904e017336Dimitry Ivanov jstring javaLibrarySearchPath) { 341df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski ScopedUtfChars filename(env, javaFilename); 342df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski if (filename.c_str() == NULL) { 343df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return NULL; 344df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 345df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 3463e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov int32_t target_sdk_version = art::Runtime::Current()->GetTargetSdkVersion(); 3473e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov 3483e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov // Starting with N nativeLoad uses classloader local 3493e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov // linker namespace instead of global LD_LIBRARY_PATH 350f525272b1edec721058e7d888545dd5d97b5045dNarayan Kamath // (23 is Marshmallow). This call is here to preserve 351f525272b1edec721058e7d888545dd5d97b5045dNarayan Kamath // backwards compatibility for the apps targeting sdk 352f525272b1edec721058e7d888545dd5d97b5045dNarayan Kamath // version <= 23 353f525272b1edec721058e7d888545dd5d97b5045dNarayan Kamath if (target_sdk_version == 0) { 354986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov SetLdLibraryPath(env, javaLibrarySearchPath); 355df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 356df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 3573e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov std::string error_msg; 358df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski { 359df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::JavaVMExt* vm = art::Runtime::Current()->GetJavaVM(); 360986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov bool success = vm->LoadNativeLibrary(env, 361986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov filename.c_str(), 362986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov javaLoader, 363986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov javaLibrarySearchPath, 364986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov &error_msg); 365df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski if (success) { 366df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return nullptr; 367df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 368df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 369df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 370df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski // Don't let a pending exception from JNI_OnLoad cause a CheckJNI issue with NewStringUTF. 371df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski env->ExceptionClear(); 3723e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov return env->NewStringUTF(error_msg.c_str()); 373df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 374df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 375df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_StartThread(JNIEnv* env, jobject jthread, jlong stack_size, jboolean daemon) { 376df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::Thread::CreateNativeThread(env, jthread, stack_size, daemon == JNI_TRUE); 377df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 378df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 379df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio) { 380df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::ScopedObjectAccess soa(env); 381df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::MutexLock mu(soa.Self(), *art::Locks::thread_list_lock_); 382df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::Thread* thread = art::Thread::FromManagedThread(soa, jthread); 383df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski if (thread != NULL) { 384df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski thread->SetNativePriority(prio); 385df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 386df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 387df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 3886c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT void JVM_Yield(JNIEnv* env ATTRIBUTE_UNUSED, jclass threadClass ATTRIBUTE_UNUSED) { 389df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski sched_yield(); 390df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 391df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 3926c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT void JVM_Sleep(JNIEnv* env, jclass threadClass ATTRIBUTE_UNUSED, 3936c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw Szczepaniak jobject java_lock, jlong millis) { 394df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::ScopedFastNativeObjectAccess soa(env); 395df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::mirror::Object* lock = soa.Decode<art::mirror::Object*>(java_lock); 396df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::Monitor::Wait(art::Thread::Current(), lock, millis, 0, true, art::kSleeping); 397df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 398df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 3996c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jobject JVM_CurrentThread(JNIEnv* env, jclass unused ATTRIBUTE_UNUSED) { 400df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::ScopedFastNativeObjectAccess soa(env); 401df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return soa.AddLocalReference<jobject>(soa.Self()->GetPeer()); 402df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 403df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 404df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_Interrupt(JNIEnv* env, jobject jthread) { 405df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::ScopedFastNativeObjectAccess soa(env); 406df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::MutexLock mu(soa.Self(), *art::Locks::thread_list_lock_); 407df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::Thread* thread = art::Thread::FromManagedThread(soa, jthread); 408df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski if (thread != nullptr) { 409df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski thread->Interrupt(soa.Self()); 410df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 411df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 412df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 413df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clearInterrupted) { 414df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski if (clearInterrupted) { 415df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return static_cast<art::JNIEnvExt*>(env)->self->Interrupted() ? JNI_TRUE : JNI_FALSE; 416df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } else { 417df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::ScopedFastNativeObjectAccess soa(env); 418df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::MutexLock mu(soa.Self(), *art::Locks::thread_list_lock_); 419df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::Thread* thread = art::Thread::FromManagedThread(soa, jthread); 420df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return (thread != nullptr) ? thread->IsInterrupted() : JNI_FALSE; 421df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 422df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 423df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 4246c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jboolean JVM_HoldsLock(JNIEnv* env, jclass unused ATTRIBUTE_UNUSED, jobject jobj) { 425df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::ScopedObjectAccess soa(env); 426df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::mirror::Object* object = soa.Decode<art::mirror::Object*>(jobj); 427df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski if (object == NULL) { 428d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath art::ThrowNullPointerException("object == null"); 429df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return JNI_FALSE; 430df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 431df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return soa.Self()->HoldsLock(object); 432df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 433df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 434df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring java_name) { 435df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski ScopedUtfChars name(env, java_name); 436df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski { 437df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::ScopedObjectAccess soa(env); 438df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski if (soa.Decode<art::mirror::Object*>(jthread) == soa.Self()->GetPeer()) { 439df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski soa.Self()->SetThreadName(name.c_str()); 440df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski return; 441df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 442df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 443df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski // Suspend thread to avoid it from killing itself while we set its name. We don't just hold the 444df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski // thread list lock to avoid this, as setting the thread name causes mutator to lock/unlock 445df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski // in the DDMS send code. 446df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::ThreadList* thread_list = art::Runtime::Current()->GetThreadList(); 447df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski bool timed_out; 448df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski // Take suspend thread lock to avoid races with threads trying to suspend this one. 449df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::Thread* thread; 450df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski { 451df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski thread = thread_list->SuspendThreadByPeer(jthread, true, false, &timed_out); 452df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 453df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski if (thread != NULL) { 454df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski { 455df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski art::ScopedObjectAccess soa(env); 456df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski thread->SetThreadName(name.c_str()); 457df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 458df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski thread_list->Resume(thread, false); 459df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } else if (timed_out) { 460df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski LOG(ERROR) << "Trying to set thread name to '" << name.c_str() << "' failed as the thread " 461df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski "failed to suspend within a generous timeout."; 462df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski } 463df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 464df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 46568d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan KamathJNIEXPORT jint JVM_IHashCode(JNIEnv* env ATTRIBUTE_UNUSED, 46668d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath jobject javaObject ATTRIBUTE_UNUSED) { 46768d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath UNIMPLEMENTED(FATAL) << "JVM_IHashCode is not implemented"; 46868d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath return 0; 469df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 470df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 4716c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jlong JVM_NanoTime(JNIEnv* env ATTRIBUTE_UNUSED, jclass unused ATTRIBUTE_UNUSED) { 47268d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath UNIMPLEMENTED(FATAL) << "JVM_NanoTime is not implemented"; 47368d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath return 0L; 474df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 475df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 47668d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan KamathJNIEXPORT void JVM_ArrayCopy(JNIEnv* /* env */, jclass /* unused */, jobject /* javaSrc */, 47768d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath jint /* srcPos */, jobject /* javaDst */, jint /* dstPos */, 47868d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath jint /* length */) { 47968d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath UNIMPLEMENTED(FATAL) << "JVM_ArrayCopy is not implemented"; 480df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 481df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 4826c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jint JVM_FindSignal(const char* name ATTRIBUTE_UNUSED) { 48336379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath LOG(FATAL) << "JVM_FindSignal is not implemented"; 48436379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath return 0; 485df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 486df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 4876c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT void* JVM_RegisterSignal(jint signum ATTRIBUTE_UNUSED, void* handler ATTRIBUTE_UNUSED) { 48836379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath LOG(FATAL) << "JVM_RegisterSignal is not implemented"; 48936379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath return nullptr; 490df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 491df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 4926c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jboolean JVM_RaiseSignal(jint signum ATTRIBUTE_UNUSED) { 49336379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath LOG(FATAL) << "JVM_RaiseSignal is not implemented"; 49436379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath return JNI_FALSE; 495df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 496df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski 4976c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT __attribute__((noreturn)) void JVM_Halt(jint code) { 498df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski exit(code); 499df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski} 500b02d9b7329909cbf741b16faf81616a992a1bd2bPrzemyslaw Szczepaniak 501b02d9b7329909cbf741b16faf81616a992a1bd2bPrzemyslaw SzczepaniakJNIEXPORT jboolean JVM_IsNaN(jdouble d) { 502b02d9b7329909cbf741b16faf81616a992a1bd2bPrzemyslaw Szczepaniak return isnan(d); 503b02d9b7329909cbf741b16faf81616a992a1bd2bPrzemyslaw Szczepaniak} 504