OpenjdkJvm.cc revision c286a7fcd8a446c086127bf03fd07f904e017336
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) {
119df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return TEMP_FAILURE_RETRY(lseek(fd, offset, whence));
120df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
121a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath
122df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/*
123df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * "raw monitors" seem to be expected to behave like non-recursive pthread
124df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * mutexes.  They're used by ZipFile.
125df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski */
126a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT void* JVM_RawMonitorCreate(void) {
1276c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    pthread_mutex_t* mutex =
128a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath        reinterpret_cast<pthread_mutex_t*>(malloc(sizeof(pthread_mutex_t)));
1296c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    CHECK(mutex != nullptr);
1306c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    CHECK_PTHREAD_CALL(pthread_mutex_init, (mutex, nullptr), "JVM_RawMonitorCreate");
1316c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    return mutex;
132df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
133df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
134a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT void JVM_RawMonitorDestroy(void* mon) {
1356c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    CHECK_PTHREAD_CALL(pthread_mutex_destroy,
1366c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath                       (reinterpret_cast<pthread_mutex_t*>(mon)),
1376c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath                       "JVM_RawMonitorDestroy");
1386c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    free(mon);
139df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
140df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
141a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_RawMonitorEnter(void* mon) {
142a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath    return pthread_mutex_lock(reinterpret_cast<pthread_mutex_t*>(mon));
143df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
144df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
145a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT void JVM_RawMonitorExit(void* mon) {
1466c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    CHECK_PTHREAD_CALL(pthread_mutex_unlock,
1476c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath                       (reinterpret_cast<pthread_mutex_t*>(mon)),
1486c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath                       "JVM_RawMonitorExit");
149df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
150df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
151a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT char* JVM_NativePath(char* path) {
152df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return path;
153df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
154df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
155a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_GetLastErrorString(char* buf, int len) {
156d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath#if defined(__GLIBC__) || defined(__BIONIC__)
157d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  if (len == 0) {
158d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath    return 0;
159d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  }
160df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
16144ba97e747b928f734329226c5daf0eb36f8f687Narayan Kamath  const int err = errno;
162d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  char* result = strerror_r(err, buf, len);
163d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  if (result != buf) {
164d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath    strncpy(buf, result, len);
165d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath    buf[len - 1] = '\0';
166d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  }
167df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
168d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  return strlen(buf);
169df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#else
170d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  UNUSED(buf);
171d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  UNUSED(len);
172d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  return -1;
173df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#endif
174df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
175df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
176a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT int jio_fprintf(FILE* fp, const char* fmt, ...) {
177df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    va_list args;
178df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
179df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    va_start(args, fmt);
180df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    int len = jio_vfprintf(fp, fmt, args);
181df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    va_end(args);
182df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
183df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return len;
184df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
185df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
186a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT int jio_vfprintf(FILE* fp, const char* fmt, va_list args) {
187df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    assert(fp != NULL);
188df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return vfprintf(fp, fmt, args);
189df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
190df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
191df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix fsync() */
192a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Sync(jint fd) {
193df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return TEMP_FAILURE_RETRY(fsync(fd));
194df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
195df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
196a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT void* JVM_FindLibraryEntry(void* handle, const char* name) {
19767d39adad3261f3932defef6b2d1d30b470d1be0Przemyslaw Szczepaniak    return dlsym(handle, name);
198df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
199df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
20044ba97e747b928f734329226c5daf0eb36f8f687Narayan KamathJNIEXPORT jlong JVM_CurrentTimeMillis(JNIEnv* env ATTRIBUTE_UNUSED,
20144ba97e747b928f734329226c5daf0eb36f8f687Narayan Kamath                                      jclass clazz ATTRIBUTE_UNUSED) {
202df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    struct timeval tv;
203df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    gettimeofday(&tv, (struct timezone *) NULL);
204df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    jlong when = tv.tv_sec * 1000LL + tv.tv_usec / 1000;
205df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return when;
206df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
207df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
208a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Socket(jint domain, jint type, jint protocol) {
209df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return TEMP_FAILURE_RETRY(socket(domain, type, protocol));
210df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
211df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
212df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jint JVM_InitializeSocketLibrary() {
213df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  return 0;
214df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
215df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
216df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebskiint jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) {
217a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  if ((intptr_t)count <= 0) return -1;
218a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return vsnprintf(str, count, fmt, args);
219df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
220df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
221df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebskiint jio_snprintf(char *str, size_t count, const char *fmt, ...) {
222a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  va_list args;
223a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  int len;
224a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  va_start(args, fmt);
225a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  len = jio_vsnprintf(str, count, fmt, args);
226a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  va_end(args);
227a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return len;
228df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
229df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
230df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jint JVM_SetSockOpt(jint fd, int level, int optname,
231a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath    const char* optval, int optlen) {
232a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return TEMP_FAILURE_RETRY(setsockopt(fd, level, optname, optval, optlen));
233df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
234df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
235a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_SocketShutdown(jint fd, jint howto) {
236a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return TEMP_FAILURE_RETRY(shutdown(fd, howto));
237df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
238df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
239df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jint JVM_GetSockOpt(jint fd, int level, int optname, char* optval,
240a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  int* optlen) {
241a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  socklen_t len = *optlen;
242a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  int cc = TEMP_FAILURE_RETRY(getsockopt(fd, level, optname, optval, &len));
243a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  *optlen = len;
244a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return cc;
245df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
246df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
247a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_GetSockName(jint fd, struct sockaddr* addr, int* addrlen) {
248a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  socklen_t len = *addrlen;
249a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  int cc = TEMP_FAILURE_RETRY(getsockname(fd, addr, &len));
250a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  *addrlen = len;
251a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return cc;
252df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
253df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
254a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_SocketAvailable(jint fd, jint* result) {
255a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  if (TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, result)) < 0) {
256a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath      return JNI_FALSE;
257a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  }
258df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
259a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return JNI_TRUE;
260df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
261df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
262a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Send(jint fd, char* buf, jint nBytes, jint flags) {
263a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return TEMP_FAILURE_RETRY(send(fd, buf, nBytes, flags));
264df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
265df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
266a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_SocketClose(jint fd) {
26744ba97e747b928f734329226c5daf0eb36f8f687Narayan Kamath  // Don't want TEMP_FAILURE_RETRY here -- file is closed even if EINTR.
268a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return close(fd);
269df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
270df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
271a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Listen(jint fd, jint count) {
272a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return TEMP_FAILURE_RETRY(listen(fd, count));
273df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
274df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
275a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Connect(jint fd, struct sockaddr* addr, jint addrlen) {
276a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return TEMP_FAILURE_RETRY(connect(fd, addr, addrlen));
277df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
278df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
279a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT int JVM_GetHostName(char* name, int namelen) {
280a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return TEMP_FAILURE_RETRY(gethostname(name, namelen));
281df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
282df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
283a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jstring JVM_InternString(JNIEnv* env, jstring jstr) {
284a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  art::ScopedFastNativeObjectAccess soa(env);
285a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  art::mirror::String* s = soa.Decode<art::mirror::String*>(jstr);
286a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  art::mirror::String* result = s->Intern();
287a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return soa.AddLocalReference<jstring>(result);
288df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
289df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
290df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jlong JVM_FreeMemory(void) {
291a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return art::Runtime::Current()->GetHeap()->GetFreeMemory();
292df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
293df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
294df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jlong JVM_TotalMemory(void) {
295a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return art::Runtime::Current()->GetHeap()->GetTotalMemory();
296df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
297df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
298df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jlong JVM_MaxMemory(void) {
299a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return art::Runtime::Current()->GetHeap()->GetMaxMemory();
300df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
301df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
302df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_GC(void) {
303a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  if (art::Runtime::Current()->IsExplicitGcDisabled()) {
304a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath      LOG(INFO) << "Explicit GC skipped.";
305a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath      return;
306a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  }
307a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  art::Runtime::Current()->GetHeap()->CollectGarbage(false);
308df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
309df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3106c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT __attribute__((noreturn)) void JVM_Exit(jint status) {
311df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  LOG(INFO) << "System.exit called, status: " << status;
312df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::Runtime::Current()->CallExitHook(status);
313df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  exit(status);
314df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
315df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3163e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanovstatic void SetLdLibraryPath(JNIEnv* env, jstring javaLdLibraryPath) {
3173e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov#ifdef __ANDROID__
3183e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  if (javaLdLibraryPath != nullptr) {
3193e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov    ScopedUtfChars ldLibraryPath(env, javaLdLibraryPath);
3203e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov    if (ldLibraryPath.c_str() != nullptr) {
3213e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov      android_update_LD_LIBRARY_PATH(ldLibraryPath.c_str());
3223e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov    }
3233e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  }
3243e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov
3253e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov#else
3263e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  LOG(WARNING) << "android_update_LD_LIBRARY_PATH not found; .so dependencies will not work!";
3273e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  UNUSED(javaLdLibraryPath, env);
3283e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov#endif
3293e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov}
3303e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov
3313e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov
332c286a7fcd8a446c086127bf03fd07f904e017336Dimitry IvanovJNIEXPORT jstring JVM_NativeLoad(JNIEnv* env,
333c286a7fcd8a446c086127bf03fd07f904e017336Dimitry Ivanov                                 jstring javaFilename,
334c286a7fcd8a446c086127bf03fd07f904e017336Dimitry Ivanov                                 jobject javaLoader,
335c286a7fcd8a446c086127bf03fd07f904e017336Dimitry Ivanov                                 jstring javaLibrarySearchPath) {
336df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  ScopedUtfChars filename(env, javaFilename);
337df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  if (filename.c_str() == NULL) {
338df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return NULL;
339df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
340df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3413e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  int32_t target_sdk_version = art::Runtime::Current()->GetTargetSdkVersion();
3423e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov
3433e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  // Starting with N nativeLoad uses classloader local
3443e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  // linker namespace instead of global LD_LIBRARY_PATH
3453e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  // (23 is Marshmallow)
3463e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  if (target_sdk_version <= 23) {
347986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov    SetLdLibraryPath(env, javaLibrarySearchPath);
348df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
349df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3503e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  std::string error_msg;
351df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  {
352df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    art::ScopedObjectAccess soa(env);
353df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    art::StackHandleScope<1> hs(soa.Self());
354df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    art::JavaVMExt* vm = art::Runtime::Current()->GetJavaVM();
355986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov    bool success = vm->LoadNativeLibrary(env,
356986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov                                         filename.c_str(),
357986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov                                         javaLoader,
358986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov                                         javaLibrarySearchPath,
359986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov                                         &error_msg);
360df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    if (success) {
361df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski      return nullptr;
362df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    }
363df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
364df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
365df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  // Don't let a pending exception from JNI_OnLoad cause a CheckJNI issue with NewStringUTF.
366df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  env->ExceptionClear();
3673e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  return env->NewStringUTF(error_msg.c_str());
368df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
369df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
370df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_StartThread(JNIEnv* env, jobject jthread, jlong stack_size, jboolean daemon) {
371df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::Thread::CreateNativeThread(env, jthread, stack_size, daemon == JNI_TRUE);
372df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
373df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
374df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio) {
375df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::ScopedObjectAccess soa(env);
376df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::MutexLock mu(soa.Self(), *art::Locks::thread_list_lock_);
377df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::Thread* thread = art::Thread::FromManagedThread(soa, jthread);
378df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  if (thread != NULL) {
379df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    thread->SetNativePriority(prio);
380df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
381df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
382df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3836c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT void JVM_Yield(JNIEnv* env ATTRIBUTE_UNUSED, jclass threadClass ATTRIBUTE_UNUSED) {
384df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  sched_yield();
385df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
386df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3876c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT void JVM_Sleep(JNIEnv* env, jclass threadClass ATTRIBUTE_UNUSED,
3886c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw Szczepaniak                         jobject java_lock, jlong millis) {
389df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::ScopedFastNativeObjectAccess soa(env);
390df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::mirror::Object* lock = soa.Decode<art::mirror::Object*>(java_lock);
391df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::Monitor::Wait(art::Thread::Current(), lock, millis, 0, true, art::kSleeping);
392df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
393df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3946c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jobject JVM_CurrentThread(JNIEnv* env, jclass unused ATTRIBUTE_UNUSED) {
395df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::ScopedFastNativeObjectAccess soa(env);
396df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  return soa.AddLocalReference<jobject>(soa.Self()->GetPeer());
397df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
398df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
399df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_Interrupt(JNIEnv* env, jobject jthread) {
400df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::ScopedFastNativeObjectAccess soa(env);
401df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::MutexLock mu(soa.Self(), *art::Locks::thread_list_lock_);
402df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::Thread* thread = art::Thread::FromManagedThread(soa, jthread);
403df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  if (thread != nullptr) {
404df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    thread->Interrupt(soa.Self());
405df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
406df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
407df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
408df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clearInterrupted) {
409df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  if (clearInterrupted) {
410df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return static_cast<art::JNIEnvExt*>(env)->self->Interrupted() ? JNI_TRUE : JNI_FALSE;
411df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  } else {
412df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    art::ScopedFastNativeObjectAccess soa(env);
413df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    art::MutexLock mu(soa.Self(), *art::Locks::thread_list_lock_);
414df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    art::Thread* thread = art::Thread::FromManagedThread(soa, jthread);
415df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return (thread != nullptr) ? thread->IsInterrupted() : JNI_FALSE;
416df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
417df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
418df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
4196c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jboolean JVM_HoldsLock(JNIEnv* env, jclass unused ATTRIBUTE_UNUSED, jobject jobj) {
420df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::ScopedObjectAccess soa(env);
421df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::mirror::Object* object = soa.Decode<art::mirror::Object*>(jobj);
422df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  if (object == NULL) {
423d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath    art::ThrowNullPointerException("object == null");
424df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return JNI_FALSE;
425df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
426df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  return soa.Self()->HoldsLock(object);
427df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
428df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
429df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring java_name) {
430df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  ScopedUtfChars name(env, java_name);
431df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  {
432df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    art::ScopedObjectAccess soa(env);
433df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    if (soa.Decode<art::mirror::Object*>(jthread) == soa.Self()->GetPeer()) {
434df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski      soa.Self()->SetThreadName(name.c_str());
435df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski      return;
436df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    }
437df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
438df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  // Suspend thread to avoid it from killing itself while we set its name. We don't just hold the
439df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  // thread list lock to avoid this, as setting the thread name causes mutator to lock/unlock
440df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  // in the DDMS send code.
441df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::ThreadList* thread_list = art::Runtime::Current()->GetThreadList();
442df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  bool timed_out;
443df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  // Take suspend thread lock to avoid races with threads trying to suspend this one.
444df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::Thread* thread;
445df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  {
446df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    thread = thread_list->SuspendThreadByPeer(jthread, true, false, &timed_out);
447df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
448df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  if (thread != NULL) {
449df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    {
450df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski      art::ScopedObjectAccess soa(env);
451df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski      thread->SetThreadName(name.c_str());
452df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    }
453df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    thread_list->Resume(thread, false);
454df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  } else if (timed_out) {
455df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    LOG(ERROR) << "Trying to set thread name to '" << name.c_str() << "' failed as the thread "
456df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski        "failed to suspend within a generous timeout.";
457df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
458df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
459df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
46068d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan KamathJNIEXPORT jint JVM_IHashCode(JNIEnv* env ATTRIBUTE_UNUSED,
46168d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath                             jobject javaObject ATTRIBUTE_UNUSED) {
46268d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath  UNIMPLEMENTED(FATAL) << "JVM_IHashCode is not implemented";
46368d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath  return 0;
464df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
465df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
4666c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jlong JVM_NanoTime(JNIEnv* env ATTRIBUTE_UNUSED, jclass unused ATTRIBUTE_UNUSED) {
46768d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath  UNIMPLEMENTED(FATAL) << "JVM_NanoTime is not implemented";
46868d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath  return 0L;
469df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
470df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
47168d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan KamathJNIEXPORT void JVM_ArrayCopy(JNIEnv* /* env */, jclass /* unused */, jobject /* javaSrc */,
47268d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath                             jint /* srcPos */, jobject /* javaDst */, jint /* dstPos */,
47368d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath                             jint /* length */) {
47468d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath  UNIMPLEMENTED(FATAL) << "JVM_ArrayCopy is not implemented";
475df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
476df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
4776c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jint JVM_FindSignal(const char* name ATTRIBUTE_UNUSED) {
47836379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath  LOG(FATAL) << "JVM_FindSignal is not implemented";
47936379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath  return 0;
480df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
481df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
4826c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT void* JVM_RegisterSignal(jint signum ATTRIBUTE_UNUSED, void* handler ATTRIBUTE_UNUSED) {
48336379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath  LOG(FATAL) << "JVM_RegisterSignal is not implemented";
48436379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath  return nullptr;
485df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
486df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
4876c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jboolean JVM_RaiseSignal(jint signum ATTRIBUTE_UNUSED) {
48836379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath  LOG(FATAL) << "JVM_RaiseSignal is not implemented";
48936379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath  return JNI_FALSE;
490df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
491df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
4926c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT __attribute__((noreturn))  void JVM_Halt(jint code) {
493df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  exit(code);
494df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
495b02d9b7329909cbf741b16faf81616a992a1bd2bPrzemyslaw Szczepaniak
496b02d9b7329909cbf741b16faf81616a992a1bd2bPrzemyslaw SzczepaniakJNIEXPORT jboolean JVM_IsNaN(jdouble d) {
497b02d9b7329909cbf741b16faf81616a992a1bd2bPrzemyslaw Szczepaniak  return isnan(d);
498b02d9b7329909cbf741b16faf81616a992a1bd2bPrzemyslaw Szczepaniak}
499