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
61df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#undef LOG_TAG
626280ef88a9231d2a14f2b0bbe6d39770c994787dNarayan Kamath#define LOG_TAG "artopenjdk"
63df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
64d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamathusing art::WARNING;
65d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamathusing art::INFO;
66d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamathusing art::ERROR;
67d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamathusing art::FATAL;
68d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath
69df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix open() with extensions; used by e.g. ZipFile */
70a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Open(const char* fname, jint flags, jint mode) {
71df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    /*
72df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski     * The call is expected to handle JVM_O_DELETE, which causes the file
73df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski     * to be removed after it is opened.  Also, some code seems to
74df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski     * want the special return value JVM_EEXIST if the file open fails
75df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski     * due to O_EXCL.
76df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski     */
77df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    int fd = TEMP_FAILURE_RETRY(open(fname, flags & ~JVM_O_DELETE, mode));
78df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    if (fd < 0) {
79df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski        int err = errno;
80df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski        if (err == EEXIST) {
81df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski            return JVM_EEXIST;
82df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski        } else {
83df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski            return -1;
84df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski        }
85df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    }
86df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
87df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    if (flags & JVM_O_DELETE) {
88df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski        if (unlink(fname) != 0) {
89df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski            LOG(WARNING) << "Post-open deletion of '" << fname << "' failed: " << strerror(errno);
90df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski        }
91df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    }
92df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
93df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return fd;
94df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
95df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
96df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix close() */
97a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Close(jint fd) {
98df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    // don't want TEMP_FAILURE_RETRY here -- file is closed even if EINTR
99df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return close(fd);
100df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
101df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
102df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix read() */
103a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Read(jint fd, char* buf, jint nbytes) {
104df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return TEMP_FAILURE_RETRY(read(fd, buf, nbytes));
105df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
106df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
107df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix write(); is used to write messages to stderr */
108a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Write(jint fd, char* buf, jint nbytes) {
109df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return TEMP_FAILURE_RETRY(write(fd, buf, nbytes));
110df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
111df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
112df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix lseek() */
113a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jlong JVM_Lseek(jint fd, jlong offset, jint whence) {
114589bf49ef3068c148f7b9650c42b0794b65f5e35Narayan Kamath#if !defined(__APPLE__)
1156fb4c732f3fed182fdd4d9a725a9d039d42dce83Narayan Kamath    // NOTE: Using TEMP_FAILURE_RETRY here is busted for LP32 on glibc - the return
1166fb4c732f3fed182fdd4d9a725a9d039d42dce83Narayan Kamath    // value will be coerced into an int32_t.
1176fb4c732f3fed182fdd4d9a725a9d039d42dce83Narayan Kamath    //
1186fb4c732f3fed182fdd4d9a725a9d039d42dce83Narayan Kamath    // lseek64 isn't specified to return EINTR so it shouldn't be necessary
1196fb4c732f3fed182fdd4d9a725a9d039d42dce83Narayan Kamath    // anyway.
1206fb4c732f3fed182fdd4d9a725a9d039d42dce83Narayan Kamath    return lseek64(fd, offset, whence);
121589bf49ef3068c148f7b9650c42b0794b65f5e35Narayan Kamath#else
122589bf49ef3068c148f7b9650c42b0794b65f5e35Narayan Kamath    // NOTE: This code is compiled for Mac OS but isn't ever run on that
123589bf49ef3068c148f7b9650c42b0794b65f5e35Narayan Kamath    // platform.
124589bf49ef3068c148f7b9650c42b0794b65f5e35Narayan Kamath    return lseek(fd, offset, whence);
125589bf49ef3068c148f7b9650c42b0794b65f5e35Narayan Kamath#endif
126df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
127a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath
128df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/*
129df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * "raw monitors" seem to be expected to behave like non-recursive pthread
130df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski * mutexes.  They're used by ZipFile.
131df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski */
132a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT void* JVM_RawMonitorCreate(void) {
1336c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    pthread_mutex_t* mutex =
134a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath        reinterpret_cast<pthread_mutex_t*>(malloc(sizeof(pthread_mutex_t)));
1356c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    CHECK(mutex != nullptr);
1366c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    CHECK_PTHREAD_CALL(pthread_mutex_init, (mutex, nullptr), "JVM_RawMonitorCreate");
1376c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    return mutex;
138df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
139df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
140a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT void JVM_RawMonitorDestroy(void* mon) {
1416c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    CHECK_PTHREAD_CALL(pthread_mutex_destroy,
1426c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath                       (reinterpret_cast<pthread_mutex_t*>(mon)),
1436c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath                       "JVM_RawMonitorDestroy");
1446c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    free(mon);
145df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
146df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
147a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_RawMonitorEnter(void* mon) {
148a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath    return pthread_mutex_lock(reinterpret_cast<pthread_mutex_t*>(mon));
149df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
150df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
151a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT void JVM_RawMonitorExit(void* mon) {
1526c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath    CHECK_PTHREAD_CALL(pthread_mutex_unlock,
1536c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath                       (reinterpret_cast<pthread_mutex_t*>(mon)),
1546c37e9adf7afc547a0fdf4db29249f6982845162Narayan Kamath                       "JVM_RawMonitorExit");
155df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
156df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
157a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT char* JVM_NativePath(char* path) {
158df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return path;
159df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
160df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
161a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_GetLastErrorString(char* buf, int len) {
162d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath#if defined(__GLIBC__) || defined(__BIONIC__)
163d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  if (len == 0) {
164d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath    return 0;
165d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  }
166df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
16744ba97e747b928f734329226c5daf0eb36f8f687Narayan Kamath  const int err = errno;
168d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  char* result = strerror_r(err, buf, len);
169d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  if (result != buf) {
170d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath    strncpy(buf, result, len);
171d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath    buf[len - 1] = '\0';
172d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  }
173df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
174d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  return strlen(buf);
175df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#else
176d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  UNUSED(buf);
177d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  UNUSED(len);
178d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath  return -1;
179df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski#endif
180df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
181df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
182a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT int jio_fprintf(FILE* fp, const char* fmt, ...) {
183df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    va_list args;
184df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
185df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    va_start(args, fmt);
186df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    int len = jio_vfprintf(fp, fmt, args);
187df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    va_end(args);
188df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
189df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return len;
190df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
191df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
192a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT int jio_vfprintf(FILE* fp, const char* fmt, va_list args) {
193df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    assert(fp != NULL);
194df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return vfprintf(fp, fmt, args);
195df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
196df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
197df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski/* posix fsync() */
198a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Sync(jint fd) {
199df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return TEMP_FAILURE_RETRY(fsync(fd));
200df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
201df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
202a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT void* JVM_FindLibraryEntry(void* handle, const char* name) {
20367d39adad3261f3932defef6b2d1d30b470d1be0Przemyslaw Szczepaniak    return dlsym(handle, name);
204df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
205df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
20644ba97e747b928f734329226c5daf0eb36f8f687Narayan KamathJNIEXPORT jlong JVM_CurrentTimeMillis(JNIEnv* env ATTRIBUTE_UNUSED,
20744ba97e747b928f734329226c5daf0eb36f8f687Narayan Kamath                                      jclass clazz ATTRIBUTE_UNUSED) {
208df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    struct timeval tv;
209df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    gettimeofday(&tv, (struct timezone *) NULL);
210df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    jlong when = tv.tv_sec * 1000LL + tv.tv_usec / 1000;
211df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return when;
212df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
213df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
214a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Socket(jint domain, jint type, jint protocol) {
215df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return TEMP_FAILURE_RETRY(socket(domain, type, protocol));
216df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
217df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
218df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jint JVM_InitializeSocketLibrary() {
219df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  return 0;
220df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
221df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
222df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebskiint jio_vsnprintf(char *str, size_t count, const char *fmt, va_list args) {
223a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  if ((intptr_t)count <= 0) return -1;
224a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return vsnprintf(str, count, fmt, args);
225df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
226df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
227df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebskiint jio_snprintf(char *str, size_t count, const char *fmt, ...) {
228a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  va_list args;
229a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  int len;
230a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  va_start(args, fmt);
231a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  len = jio_vsnprintf(str, count, fmt, args);
232a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  va_end(args);
233a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return len;
234df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
235df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
236df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jint JVM_SetSockOpt(jint fd, int level, int optname,
237a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath    const char* optval, int optlen) {
238a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return TEMP_FAILURE_RETRY(setsockopt(fd, level, optname, optval, optlen));
239df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
240df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
241a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_SocketShutdown(jint fd, jint howto) {
242a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return TEMP_FAILURE_RETRY(shutdown(fd, howto));
243df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
244df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
245df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jint JVM_GetSockOpt(jint fd, int level, int optname, char* optval,
246a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  int* optlen) {
247a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  socklen_t len = *optlen;
248a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  int cc = TEMP_FAILURE_RETRY(getsockopt(fd, level, optname, optval, &len));
249a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  *optlen = len;
250a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return cc;
251df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
252df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
253a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_GetSockName(jint fd, struct sockaddr* addr, int* addrlen) {
254a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  socklen_t len = *addrlen;
255a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  int cc = TEMP_FAILURE_RETRY(getsockname(fd, addr, &len));
256a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  *addrlen = len;
257a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return cc;
258df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
259df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
260a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_SocketAvailable(jint fd, jint* result) {
261a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  if (TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, result)) < 0) {
262a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath      return JNI_FALSE;
263a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  }
264df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
265a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return JNI_TRUE;
266df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
267df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
268a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Send(jint fd, char* buf, jint nBytes, jint flags) {
269a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return TEMP_FAILURE_RETRY(send(fd, buf, nBytes, flags));
270df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
271df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
272a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_SocketClose(jint fd) {
27344ba97e747b928f734329226c5daf0eb36f8f687Narayan Kamath  // Don't want TEMP_FAILURE_RETRY here -- file is closed even if EINTR.
274a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return close(fd);
275df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
276df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
277a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Listen(jint fd, jint count) {
278a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return TEMP_FAILURE_RETRY(listen(fd, count));
279df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
280df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
281a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jint JVM_Connect(jint fd, struct sockaddr* addr, jint addrlen) {
282a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return TEMP_FAILURE_RETRY(connect(fd, addr, addrlen));
283df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
284df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
285a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT int JVM_GetHostName(char* name, int namelen) {
286a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return TEMP_FAILURE_RETRY(gethostname(name, namelen));
287df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
288df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
289a0cf5a663f19f0392187d349f1832d85f90ab805Narayan KamathJNIEXPORT jstring JVM_InternString(JNIEnv* env, jstring jstr) {
290a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  art::ScopedFastNativeObjectAccess soa(env);
291a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  art::mirror::String* s = soa.Decode<art::mirror::String*>(jstr);
292a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  art::mirror::String* result = s->Intern();
293a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return soa.AddLocalReference<jstring>(result);
294df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
295df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
296df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jlong JVM_FreeMemory(void) {
297a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return art::Runtime::Current()->GetHeap()->GetFreeMemory();
298df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
299df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
300df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jlong JVM_TotalMemory(void) {
301a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return art::Runtime::Current()->GetHeap()->GetTotalMemory();
302df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
303df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
304df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jlong JVM_MaxMemory(void) {
305a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  return art::Runtime::Current()->GetHeap()->GetMaxMemory();
306df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
307df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
308df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_GC(void) {
309a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  if (art::Runtime::Current()->IsExplicitGcDisabled()) {
310a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath      LOG(INFO) << "Explicit GC skipped.";
311a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath      return;
312a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  }
313a0cf5a663f19f0392187d349f1832d85f90ab805Narayan Kamath  art::Runtime::Current()->GetHeap()->CollectGarbage(false);
314df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
315df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3166c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT __attribute__((noreturn)) void JVM_Exit(jint status) {
317df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  LOG(INFO) << "System.exit called, status: " << status;
318df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::Runtime::Current()->CallExitHook(status);
319df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  exit(status);
320df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
321df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
322c286a7fcd8a446c086127bf03fd07f904e017336Dimitry IvanovJNIEXPORT jstring JVM_NativeLoad(JNIEnv* env,
323c286a7fcd8a446c086127bf03fd07f904e017336Dimitry Ivanov                                 jstring javaFilename,
324c286a7fcd8a446c086127bf03fd07f904e017336Dimitry Ivanov                                 jobject javaLoader,
325c286a7fcd8a446c086127bf03fd07f904e017336Dimitry Ivanov                                 jstring javaLibrarySearchPath) {
326df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  ScopedUtfChars filename(env, javaFilename);
327df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  if (filename.c_str() == NULL) {
328df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return NULL;
329df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
330df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3313e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  std::string error_msg;
332df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  {
333df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    art::JavaVMExt* vm = art::Runtime::Current()->GetJavaVM();
334986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov    bool success = vm->LoadNativeLibrary(env,
335986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov                                         filename.c_str(),
336986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov                                         javaLoader,
337986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov                                         javaLibrarySearchPath,
338986f650d8b552e8b7dbebef1f50f015e7850edfcDimitry Ivanov                                         &error_msg);
339df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    if (success) {
340df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski      return nullptr;
341df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    }
342df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
343df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
344df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  // Don't let a pending exception from JNI_OnLoad cause a CheckJNI issue with NewStringUTF.
345df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  env->ExceptionClear();
3463e381723658e8a0bce24071b53f57bf22af76a1eDmitriy Ivanov  return env->NewStringUTF(error_msg.c_str());
347df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
348df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
349df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_StartThread(JNIEnv* env, jobject jthread, jlong stack_size, jboolean daemon) {
350df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::Thread::CreateNativeThread(env, jthread, stack_size, daemon == JNI_TRUE);
351df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
352df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
353df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_SetThreadPriority(JNIEnv* env, jobject jthread, jint prio) {
354df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::ScopedObjectAccess soa(env);
355df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::MutexLock mu(soa.Self(), *art::Locks::thread_list_lock_);
356df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::Thread* thread = art::Thread::FromManagedThread(soa, jthread);
357df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  if (thread != NULL) {
358df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    thread->SetNativePriority(prio);
359df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
360df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
361df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3626c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT void JVM_Yield(JNIEnv* env ATTRIBUTE_UNUSED, jclass threadClass ATTRIBUTE_UNUSED) {
363df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  sched_yield();
364df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
365df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3666c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT void JVM_Sleep(JNIEnv* env, jclass threadClass ATTRIBUTE_UNUSED,
3676c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw Szczepaniak                         jobject java_lock, jlong millis) {
368df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::ScopedFastNativeObjectAccess soa(env);
369df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::mirror::Object* lock = soa.Decode<art::mirror::Object*>(java_lock);
370df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::Monitor::Wait(art::Thread::Current(), lock, millis, 0, true, art::kSleeping);
371df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
372df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3736c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jobject JVM_CurrentThread(JNIEnv* env, jclass unused ATTRIBUTE_UNUSED) {
374df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::ScopedFastNativeObjectAccess soa(env);
375df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  return soa.AddLocalReference<jobject>(soa.Self()->GetPeer());
376df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
377df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
378df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_Interrupt(JNIEnv* env, jobject jthread) {
379df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::ScopedFastNativeObjectAccess soa(env);
380df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::MutexLock mu(soa.Self(), *art::Locks::thread_list_lock_);
381df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::Thread* thread = art::Thread::FromManagedThread(soa, jthread);
382df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  if (thread != nullptr) {
383df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    thread->Interrupt(soa.Self());
384df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
385df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
386df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
387df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT jboolean JVM_IsInterrupted(JNIEnv* env, jobject jthread, jboolean clearInterrupted) {
388df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  if (clearInterrupted) {
389df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return static_cast<art::JNIEnvExt*>(env)->self->Interrupted() ? JNI_TRUE : JNI_FALSE;
390df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  } else {
391df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    art::ScopedFastNativeObjectAccess soa(env);
392df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    art::MutexLock mu(soa.Self(), *art::Locks::thread_list_lock_);
393df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    art::Thread* thread = art::Thread::FromManagedThread(soa, jthread);
394df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return (thread != nullptr) ? thread->IsInterrupted() : JNI_FALSE;
395df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
396df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
397df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
3986c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jboolean JVM_HoldsLock(JNIEnv* env, jclass unused ATTRIBUTE_UNUSED, jobject jobj) {
399df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::ScopedObjectAccess soa(env);
400df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::mirror::Object* object = soa.Decode<art::mirror::Object*>(jobj);
401df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  if (object == NULL) {
402d1ef4362bf799f9f5d50e5edef8433664b503051Narayan Kamath    art::ThrowNullPointerException("object == null");
403df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    return JNI_FALSE;
404df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
405df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  return soa.Self()->HoldsLock(object);
406df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
407df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
408df0b17a474306198b7b0320311496e42d707a00ePiotr JastrzebskiJNIEXPORT void JVM_SetNativeThreadName(JNIEnv* env, jobject jthread, jstring java_name) {
409df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  ScopedUtfChars name(env, java_name);
410df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  {
411df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    art::ScopedObjectAccess soa(env);
412df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    if (soa.Decode<art::mirror::Object*>(jthread) == soa.Self()->GetPeer()) {
413df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski      soa.Self()->SetThreadName(name.c_str());
414df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski      return;
415df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    }
416df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
417df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  // Suspend thread to avoid it from killing itself while we set its name. We don't just hold the
418df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  // thread list lock to avoid this, as setting the thread name causes mutator to lock/unlock
419df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  // in the DDMS send code.
420df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::ThreadList* thread_list = art::Runtime::Current()->GetThreadList();
421df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  bool timed_out;
422df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  // Take suspend thread lock to avoid races with threads trying to suspend this one.
423df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  art::Thread* thread;
424df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  {
425df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    thread = thread_list->SuspendThreadByPeer(jthread, true, false, &timed_out);
426df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
427df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  if (thread != NULL) {
428df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    {
429df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski      art::ScopedObjectAccess soa(env);
430df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski      thread->SetThreadName(name.c_str());
431df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    }
432df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    thread_list->Resume(thread, false);
433df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  } else if (timed_out) {
434df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski    LOG(ERROR) << "Trying to set thread name to '" << name.c_str() << "' failed as the thread "
435df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski        "failed to suspend within a generous timeout.";
436df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  }
437df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
438df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
43968d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan KamathJNIEXPORT jint JVM_IHashCode(JNIEnv* env ATTRIBUTE_UNUSED,
44068d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath                             jobject javaObject ATTRIBUTE_UNUSED) {
44168d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath  UNIMPLEMENTED(FATAL) << "JVM_IHashCode is not implemented";
44268d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath  return 0;
443df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
444df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
4456c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jlong JVM_NanoTime(JNIEnv* env ATTRIBUTE_UNUSED, jclass unused ATTRIBUTE_UNUSED) {
44668d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath  UNIMPLEMENTED(FATAL) << "JVM_NanoTime is not implemented";
44768d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath  return 0L;
448df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
449df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
45068d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan KamathJNIEXPORT void JVM_ArrayCopy(JNIEnv* /* env */, jclass /* unused */, jobject /* javaSrc */,
45168d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath                             jint /* srcPos */, jobject /* javaDst */, jint /* dstPos */,
45268d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath                             jint /* length */) {
45368d8ff4bc1b83c87e9dac0ac0394d1381369e223Narayan Kamath  UNIMPLEMENTED(FATAL) << "JVM_ArrayCopy is not implemented";
454df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
455df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
4566c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jint JVM_FindSignal(const char* name ATTRIBUTE_UNUSED) {
45736379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath  LOG(FATAL) << "JVM_FindSignal is not implemented";
45836379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath  return 0;
459df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
460df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
4616c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT void* JVM_RegisterSignal(jint signum ATTRIBUTE_UNUSED, void* handler ATTRIBUTE_UNUSED) {
46236379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath  LOG(FATAL) << "JVM_RegisterSignal is not implemented";
46336379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath  return nullptr;
464df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
465df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
4666c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT jboolean JVM_RaiseSignal(jint signum ATTRIBUTE_UNUSED) {
46736379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath  LOG(FATAL) << "JVM_RaiseSignal is not implemented";
46836379fdf339a85cd89d12506d97ecdf582041b16Narayan Kamath  return JNI_FALSE;
469df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
470df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski
4716c0ea2799f7dc8b8763c07a6e94c23590f6b54b5Przemyslaw SzczepaniakJNIEXPORT __attribute__((noreturn))  void JVM_Halt(jint code) {
472df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski  exit(code);
473df0b17a474306198b7b0320311496e42d707a00ePiotr Jastrzebski}
474b02d9b7329909cbf741b16faf81616a992a1bd2bPrzemyslaw Szczepaniak
475b02d9b7329909cbf741b16faf81616a992a1bd2bPrzemyslaw SzczepaniakJNIEXPORT jboolean JVM_IsNaN(jdouble d) {
476b02d9b7329909cbf741b16faf81616a992a1bd2bPrzemyslaw Szczepaniak  return isnan(d);
477b02d9b7329909cbf741b16faf81616a992a1bd2bPrzemyslaw Szczepaniak}
478