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