blob: 1af65a371b5ff89e91fd7c848b6e1112d0fa7370 [file] [log] [blame]
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -07001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Andreas Gampe277ccbd2014-11-03 21:36:10 -080017#include "sun_misc_Unsafe.h"
Andreas Gampea14100c2017-04-24 15:09:56 -070018
Andreas Gampea14100c2017-04-24 15:09:56 -070019#include <unistd.h>
20
Andreas Gampe8cf9cb32017-07-19 09:28:38 -070021#include <cstdlib>
22#include <cstring>
23#include <atomic>
24
Andreas Gampea14100c2017-04-24 15:09:56 -070025#include "nativehelper/jni_macros.h"
26
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +010027#include "common_throws.h"
Ian Rogers1d54e732013-05-02 21:10:01 -070028#include "gc/accounting/card_table-inl.h"
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -070029#include "jni_internal.h"
Hiroshi Yamauchi4d2efce2014-02-10 16:19:09 -080030#include "mirror/array.h"
Mathieu Chartiere401d142015-04-22 13:56:20 -070031#include "mirror/class-inl.h"
Ian Rogers2dd0e2c2013-01-24 12:42:14 -080032#include "mirror/object-inl.h"
Andreas Gampe87583b32017-05-25 11:22:18 -070033#include "native_util.h"
Mathieu Chartier0795f232016-09-27 18:43:30 -070034#include "scoped_fast_native_object_access-inl.h"
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -070035
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -070036namespace art {
37
Ian Rogersef7d42f2014-01-06 12:55:46 -080038static jboolean Unsafe_compareAndSwapInt(JNIEnv* env, jobject, jobject javaObj, jlong offset,
39 jint expectedValue, jint newValue) {
Ian Rogers1eb512d2013-10-18 15:42:20 -070040 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -070041 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +010042 // JNI must use non transactional mode.
Hans Boehmd8434432014-07-11 09:56:07 -070043 bool success = obj->CasFieldStrongSequentiallyConsistent32<false>(MemberOffset(offset),
Mathieu Chartier0795f232016-09-27 18:43:30 -070044 expectedValue,
45 newValue);
Ian Rogers9adbff52013-01-23 18:19:03 -080046 return success ? JNI_TRUE : JNI_FALSE;
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -070047}
48
Ian Rogersef7d42f2014-01-06 12:55:46 -080049static jboolean Unsafe_compareAndSwapLong(JNIEnv* env, jobject, jobject javaObj, jlong offset,
50 jlong expectedValue, jlong newValue) {
51 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -070052 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +010053 // JNI must use non transactional mode.
Hans Boehmd8434432014-07-11 09:56:07 -070054 bool success = obj->CasFieldStrongSequentiallyConsistent64<false>(MemberOffset(offset),
Mathieu Chartier0795f232016-09-27 18:43:30 -070055 expectedValue,
56 newValue);
Ian Rogersef7d42f2014-01-06 12:55:46 -080057 return success ? JNI_TRUE : JNI_FALSE;
58}
59
60static jboolean Unsafe_compareAndSwapObject(JNIEnv* env, jobject, jobject javaObj, jlong offset,
61 jobject javaExpectedValue, jobject javaNewValue) {
Ian Rogers1eb512d2013-10-18 15:42:20 -070062 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -070063 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
64 ObjPtr<mirror::Object> expectedValue = soa.Decode<mirror::Object>(javaExpectedValue);
65 ObjPtr<mirror::Object> newValue = soa.Decode<mirror::Object>(javaNewValue);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +010066 // JNI must use non transactional mode.
Hiroshi Yamauchicc78f3f2015-12-11 15:51:04 -080067 if (kUseReadBarrier) {
68 // Need to make sure the reference stored in the field is a to-space one before attempting the
69 // CAS or the CAS could fail incorrectly.
Hans Boehmcc55e1d2017-07-27 15:28:07 -070070 // Note that the read barrier load does NOT need to be volatile.
Hiroshi Yamauchicc78f3f2015-12-11 15:51:04 -080071 mirror::HeapReference<mirror::Object>* field_addr =
72 reinterpret_cast<mirror::HeapReference<mirror::Object>*>(
Mathieu Chartier1cc62e42016-10-03 18:01:28 -070073 reinterpret_cast<uint8_t*>(obj.Ptr()) + static_cast<size_t>(offset));
Hans Boehmcc55e1d2017-07-27 15:28:07 -070074 ReadBarrier::Barrier<mirror::Object, /* kIsVolatile */ false, kWithReadBarrier,
75 /* kAlwaysUpdateField */ true>(
Mathieu Chartier1cc62e42016-10-03 18:01:28 -070076 obj.Ptr(),
Hiroshi Yamauchicc78f3f2015-12-11 15:51:04 -080077 MemberOffset(offset),
78 field_addr);
79 }
Hans Boehmd8434432014-07-11 09:56:07 -070080 bool success = obj->CasFieldStrongSequentiallyConsistentObject<false>(MemberOffset(offset),
Mathieu Chartier1a5337f2016-10-13 13:48:23 -070081 expectedValue,
82 newValue);
Ian Rogersef7d42f2014-01-06 12:55:46 -080083 return success ? JNI_TRUE : JNI_FALSE;
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -070084}
85
Elliott Hughes0512f022012-03-15 22:10:52 -070086static jint Unsafe_getInt(JNIEnv* env, jobject, jobject javaObj, jlong offset) {
Ian Rogers1eb512d2013-10-18 15:42:20 -070087 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -070088 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070089 return obj->GetField32(MemberOffset(offset));
Ian Rogers5d76c432011-10-31 21:42:49 -070090}
91
Elliott Hughes0512f022012-03-15 22:10:52 -070092static jint Unsafe_getIntVolatile(JNIEnv* env, jobject, jobject javaObj, jlong offset) {
Ian Rogers1eb512d2013-10-18 15:42:20 -070093 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -070094 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -070095 return obj->GetField32Volatile(MemberOffset(offset));
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -070096}
97
Elliott Hughes0512f022012-03-15 22:10:52 -070098static void Unsafe_putInt(JNIEnv* env, jobject, jobject javaObj, jlong offset, jint newValue) {
Ian Rogers1eb512d2013-10-18 15:42:20 -070099 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700100 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100101 // JNI must use non transactional mode.
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700102 obj->SetField32<false>(MemberOffset(offset), newValue);
Ian Rogers5d76c432011-10-31 21:42:49 -0700103}
104
Ian Rogersef7d42f2014-01-06 12:55:46 -0800105static void Unsafe_putIntVolatile(JNIEnv* env, jobject, jobject javaObj, jlong offset,
106 jint newValue) {
Ian Rogers1eb512d2013-10-18 15:42:20 -0700107 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700108 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100109 // JNI must use non transactional mode.
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700110 obj->SetField32Volatile<false>(MemberOffset(offset), newValue);
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -0700111}
112
Ian Rogersef7d42f2014-01-06 12:55:46 -0800113static void Unsafe_putOrderedInt(JNIEnv* env, jobject, jobject javaObj, jlong offset,
114 jint newValue) {
Ian Rogers1eb512d2013-10-18 15:42:20 -0700115 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700116 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Hans Boehmcc55e1d2017-07-27 15:28:07 -0700117 // TODO: A release store is likely to be faster on future processors.
Hans Boehm30359612014-05-21 17:46:23 -0700118 QuasiAtomic::ThreadFenceRelease();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100119 // JNI must use non transactional mode.
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700120 obj->SetField32<false>(MemberOffset(offset), newValue);
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -0700121}
122
Elliott Hughes0512f022012-03-15 22:10:52 -0700123static jlong Unsafe_getLong(JNIEnv* env, jobject, jobject javaObj, jlong offset) {
Ian Rogers1eb512d2013-10-18 15:42:20 -0700124 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700125 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700126 return obj->GetField64(MemberOffset(offset));
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -0700127}
128
Elliott Hughes0512f022012-03-15 22:10:52 -0700129static jlong Unsafe_getLongVolatile(JNIEnv* env, jobject, jobject javaObj, jlong offset) {
Ian Rogers1eb512d2013-10-18 15:42:20 -0700130 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700131 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700132 return obj->GetField64Volatile(MemberOffset(offset));
Ian Rogers5d76c432011-10-31 21:42:49 -0700133}
134
Elliott Hughes0512f022012-03-15 22:10:52 -0700135static void Unsafe_putLong(JNIEnv* env, jobject, jobject javaObj, jlong offset, jlong newValue) {
Ian Rogers1eb512d2013-10-18 15:42:20 -0700136 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700137 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100138 // JNI must use non transactional mode.
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700139 obj->SetField64<false>(MemberOffset(offset), newValue);
Ian Rogers5d76c432011-10-31 21:42:49 -0700140}
141
Ian Rogersef7d42f2014-01-06 12:55:46 -0800142static void Unsafe_putLongVolatile(JNIEnv* env, jobject, jobject javaObj, jlong offset,
143 jlong newValue) {
Ian Rogers1eb512d2013-10-18 15:42:20 -0700144 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700145 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100146 // JNI must use non transactional mode.
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700147 obj->SetField64Volatile<false>(MemberOffset(offset), newValue);
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -0700148}
149
Ian Rogersef7d42f2014-01-06 12:55:46 -0800150static void Unsafe_putOrderedLong(JNIEnv* env, jobject, jobject javaObj, jlong offset,
151 jlong newValue) {
Ian Rogers1eb512d2013-10-18 15:42:20 -0700152 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700153 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Hans Boehm30359612014-05-21 17:46:23 -0700154 QuasiAtomic::ThreadFenceRelease();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100155 // JNI must use non transactional mode.
Ian Rogersb0fa5dc2014-04-28 16:47:08 -0700156 obj->SetField64<false>(MemberOffset(offset), newValue);
Ian Rogers5d76c432011-10-31 21:42:49 -0700157}
158
Elliott Hughes0512f022012-03-15 22:10:52 -0700159static jobject Unsafe_getObjectVolatile(JNIEnv* env, jobject, jobject javaObj, jlong offset) {
Ian Rogers1eb512d2013-10-18 15:42:20 -0700160 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700161 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
162 ObjPtr<mirror::Object> value = obj->GetFieldObjectVolatile<mirror::Object>(MemberOffset(offset));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700163 return soa.AddLocalReference<jobject>(value);
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -0700164}
165
Elliott Hughes0512f022012-03-15 22:10:52 -0700166static jobject Unsafe_getObject(JNIEnv* env, jobject, jobject javaObj, jlong offset) {
Ian Rogers1eb512d2013-10-18 15:42:20 -0700167 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700168 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
169 ObjPtr<mirror::Object> value = obj->GetFieldObject<mirror::Object>(MemberOffset(offset));
Ian Rogers00f7d0e2012-07-19 15:28:27 -0700170 return soa.AddLocalReference<jobject>(value);
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -0700171}
172
Ian Rogersef7d42f2014-01-06 12:55:46 -0800173static void Unsafe_putObject(JNIEnv* env, jobject, jobject javaObj, jlong offset,
174 jobject javaNewValue) {
Ian Rogers1eb512d2013-10-18 15:42:20 -0700175 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700176 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
177 ObjPtr<mirror::Object> newValue = soa.Decode<mirror::Object>(javaNewValue);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100178 // JNI must use non transactional mode.
Mathieu Chartier1a5337f2016-10-13 13:48:23 -0700179 obj->SetFieldObject<false>(MemberOffset(offset), newValue);
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -0700180}
181
Ian Rogersef7d42f2014-01-06 12:55:46 -0800182static void Unsafe_putObjectVolatile(JNIEnv* env, jobject, jobject javaObj, jlong offset,
183 jobject javaNewValue) {
Ian Rogers1eb512d2013-10-18 15:42:20 -0700184 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700185 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
186 ObjPtr<mirror::Object> newValue = soa.Decode<mirror::Object>(javaNewValue);
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100187 // JNI must use non transactional mode.
Mathieu Chartier1a5337f2016-10-13 13:48:23 -0700188 obj->SetFieldObjectVolatile<false>(MemberOffset(offset), newValue);
Ian Rogers5d76c432011-10-31 21:42:49 -0700189}
190
Ian Rogersef7d42f2014-01-06 12:55:46 -0800191static void Unsafe_putOrderedObject(JNIEnv* env, jobject, jobject javaObj, jlong offset,
192 jobject javaNewValue) {
Ian Rogers1eb512d2013-10-18 15:42:20 -0700193 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700194 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
195 ObjPtr<mirror::Object> newValue = soa.Decode<mirror::Object>(javaNewValue);
Hans Boehm30359612014-05-21 17:46:23 -0700196 QuasiAtomic::ThreadFenceRelease();
Sebastien Hertzd2fe10a2014-01-15 10:20:56 +0100197 // JNI must use non transactional mode.
Mathieu Chartier1a5337f2016-10-13 13:48:23 -0700198 obj->SetFieldObject<false>(MemberOffset(offset), newValue);
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -0700199}
200
Igor Murashkin06537f72018-02-22 15:03:05 -0800201static jint Unsafe_getArrayBaseOffsetForComponentType(JNIEnv* env, jclass, jclass component_class) {
Hiroshi Yamauchi4d2efce2014-02-10 16:19:09 -0800202 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700203 ObjPtr<mirror::Class> component = soa.Decode<mirror::Class>(component_class);
Hiroshi Yamauchi4d2efce2014-02-10 16:19:09 -0800204 Primitive::Type primitive_type = component->GetPrimitiveType();
205 return mirror::Array::DataOffset(Primitive::ComponentSize(primitive_type)).Int32Value();
206}
207
Igor Murashkin06537f72018-02-22 15:03:05 -0800208static jint Unsafe_getArrayIndexScaleForComponentType(JNIEnv* env, jclass, jclass component_class) {
Hiroshi Yamauchi4d2efce2014-02-10 16:19:09 -0800209 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700210 ObjPtr<mirror::Class> component = soa.Decode<mirror::Class>(component_class);
Hiroshi Yamauchi4d2efce2014-02-10 16:19:09 -0800211 Primitive::Type primitive_type = component->GetPrimitiveType();
212 return Primitive::ComponentSize(primitive_type);
213}
214
Przemyslaw Szczepaniak6c0ea272015-09-23 08:48:00 +0100215static jint Unsafe_addressSize(JNIEnv* env ATTRIBUTE_UNUSED, jobject ob ATTRIBUTE_UNUSED) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100216 return sizeof(void*);
217}
218
Przemyslaw Szczepaniak6c0ea272015-09-23 08:48:00 +0100219static jint Unsafe_pageSize(JNIEnv* env ATTRIBUTE_UNUSED, jobject ob ATTRIBUTE_UNUSED) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100220 return sysconf(_SC_PAGESIZE);
221}
222
223static jlong Unsafe_allocateMemory(JNIEnv* env, jobject, jlong bytes) {
224 ScopedFastNativeObjectAccess soa(env);
225 // bytes is nonnegative and fits into size_t
226 if (bytes < 0 || bytes != (jlong)(size_t) bytes) {
Narayan Kamathd1ef4362015-11-12 11:49:06 +0000227 ThrowIllegalAccessException("wrong number of bytes");
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100228 return 0;
229 }
230 void* mem = malloc(bytes);
231 if (mem == nullptr) {
232 soa.Self()->ThrowOutOfMemoryError("native alloc");
233 return 0;
234 }
235 return (uintptr_t) mem;
236}
237
Przemyslaw Szczepaniak6c0ea272015-09-23 08:48:00 +0100238static void Unsafe_freeMemory(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address) {
Narayan Kamatha0cf5a62015-09-07 11:41:37 +0100239 free(reinterpret_cast<void*>(static_cast<uintptr_t>(address)));
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100240}
241
Przemyslaw Szczepaniak6c0ea272015-09-23 08:48:00 +0100242static void Unsafe_setMemory(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address, jlong bytes, jbyte value) {
Narayan Kamatha0cf5a62015-09-07 11:41:37 +0100243 memset(reinterpret_cast<void*>(static_cast<uintptr_t>(address)), value, bytes);
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100244}
245
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000246static jbyte Unsafe_getByteJ(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100247 return *reinterpret_cast<jbyte*>(address);
248}
249
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000250static void Unsafe_putByteJB(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address, jbyte value) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100251 *reinterpret_cast<jbyte*>(address) = value;
252}
253
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000254static jshort Unsafe_getShortJ(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100255 return *reinterpret_cast<jshort*>(address);
256}
257
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000258static void Unsafe_putShortJS(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address, jshort value) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100259 *reinterpret_cast<jshort*>(address) = value;
260}
261
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000262static jchar Unsafe_getCharJ(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100263 return *reinterpret_cast<jchar*>(address);
264}
265
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000266static void Unsafe_putCharJC(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address, jchar value) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100267 *reinterpret_cast<jchar*>(address) = value;
268}
269
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000270static jint Unsafe_getIntJ(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100271 return *reinterpret_cast<jint*>(address);
272}
273
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000274static void Unsafe_putIntJI(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address, jint value) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100275 *reinterpret_cast<jint*>(address) = value;
276}
277
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000278static jlong Unsafe_getLongJ(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100279 return *reinterpret_cast<jlong*>(address);
280}
281
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000282static void Unsafe_putLongJJ(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address, jlong value) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100283 *reinterpret_cast<jlong*>(address) = value;
284}
285
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000286static jfloat Unsafe_getFloatJ(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100287 return *reinterpret_cast<jfloat*>(address);
288}
289
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000290static void Unsafe_putFloatJF(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address, jfloat value) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100291 *reinterpret_cast<jfloat*>(address) = value;
292}
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000293static jdouble Unsafe_getDoubleJ(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100294 return *reinterpret_cast<jdouble*>(address);
295}
296
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000297static void Unsafe_putDoubleJD(JNIEnv* env ATTRIBUTE_UNUSED, jobject, jlong address, jdouble value) {
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100298 *reinterpret_cast<jdouble*>(address) = value;
299}
300
Przemyslaw Szczepaniak6c0ea272015-09-23 08:48:00 +0100301static void Unsafe_copyMemory(JNIEnv *env, jobject unsafe ATTRIBUTE_UNUSED, jlong src,
302 jlong dst, jlong size) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700303 if (size == 0) {
304 return;
305 }
306 // size is nonnegative and fits into size_t
307 if (size < 0 || size != (jlong)(size_t) size) {
308 ScopedFastNativeObjectAccess soa(env);
309 ThrowIllegalAccessException("wrong number of bytes");
310 }
311 size_t sz = (size_t)size;
312 memcpy(reinterpret_cast<void *>(dst), reinterpret_cast<void *>(src), sz);
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100313}
314
315template<typename T>
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700316static void copyToArray(jlong srcAddr,
317 ObjPtr<mirror::PrimitiveArray<T>> array,
Przemyslaw Szczepaniak903ac272015-07-23 09:30:35 +0100318 size_t array_offset,
319 size_t size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700320 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700321 const T* src = reinterpret_cast<T*>(srcAddr);
322 size_t sz = size / sizeof(T);
323 size_t of = array_offset / sizeof(T);
324 for (size_t i = 0; i < sz; ++i) {
325 array->Set(i + of, *(src + i));
326 }
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100327}
328
329template<typename T>
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700330static void copyFromArray(jlong dstAddr,
331 ObjPtr<mirror::PrimitiveArray<T>> array,
Przemyslaw Szczepaniak903ac272015-07-23 09:30:35 +0100332 size_t array_offset,
333 size_t size)
Andreas Gampebdf7f1c2016-08-30 16:38:47 -0700334 REQUIRES_SHARED(Locks::mutator_lock_) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700335 T* dst = reinterpret_cast<T*>(dstAddr);
336 size_t sz = size / sizeof(T);
337 size_t of = array_offset / sizeof(T);
338 for (size_t i = 0; i < sz; ++i) {
339 *(dst + i) = array->Get(i + of);
340 }
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100341}
342
343static void Unsafe_copyMemoryToPrimitiveArray(JNIEnv *env,
Przemyslaw Szczepaniak6c0ea272015-09-23 08:48:00 +0100344 jobject unsafe ATTRIBUTE_UNUSED,
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100345 jlong srcAddr,
346 jobject dstObj,
347 jlong dstOffset,
348 jlong size) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700349 ScopedObjectAccess soa(env);
350 if (size == 0) {
351 return;
352 }
353 // size is nonnegative and fits into size_t
354 if (size < 0 || size != (jlong)(size_t) size) {
355 ThrowIllegalAccessException("wrong number of bytes");
356 }
357 size_t sz = (size_t)size;
358 size_t dst_offset = (size_t)dstOffset;
359 ObjPtr<mirror::Object> dst = soa.Decode<mirror::Object>(dstObj);
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700360 ObjPtr<mirror::Class> component_type = dst->GetClass()->GetComponentType();
Mathieu Chartier0795f232016-09-27 18:43:30 -0700361 if (component_type->IsPrimitiveByte() || component_type->IsPrimitiveBoolean()) {
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700362 copyToArray(srcAddr, MakeObjPtr(dst->AsByteSizedArray()), dst_offset, sz);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700363 } else if (component_type->IsPrimitiveShort() || component_type->IsPrimitiveChar()) {
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700364 copyToArray(srcAddr, MakeObjPtr(dst->AsShortSizedArray()), dst_offset, sz);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700365 } else if (component_type->IsPrimitiveInt() || component_type->IsPrimitiveFloat()) {
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700366 copyToArray(srcAddr, MakeObjPtr(dst->AsIntArray()), dst_offset, sz);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700367 } else if (component_type->IsPrimitiveLong() || component_type->IsPrimitiveDouble()) {
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700368 copyToArray(srcAddr, MakeObjPtr(dst->AsLongArray()), dst_offset, sz);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700369 } else {
370 ThrowIllegalAccessException("not a primitive array");
371 }
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100372}
373
374static void Unsafe_copyMemoryFromPrimitiveArray(JNIEnv *env,
Przemyslaw Szczepaniak6c0ea272015-09-23 08:48:00 +0100375 jobject unsafe ATTRIBUTE_UNUSED,
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100376 jobject srcObj,
377 jlong srcOffset,
378 jlong dstAddr,
379 jlong size) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700380 ScopedObjectAccess soa(env);
381 if (size == 0) {
382 return;
383 }
384 // size is nonnegative and fits into size_t
385 if (size < 0 || size != (jlong)(size_t) size) {
386 ThrowIllegalAccessException("wrong number of bytes");
387 }
388 size_t sz = (size_t)size;
389 size_t src_offset = (size_t)srcOffset;
390 ObjPtr<mirror::Object> src = soa.Decode<mirror::Object>(srcObj);
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700391 ObjPtr<mirror::Class> component_type = src->GetClass()->GetComponentType();
Mathieu Chartier0795f232016-09-27 18:43:30 -0700392 if (component_type->IsPrimitiveByte() || component_type->IsPrimitiveBoolean()) {
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700393 copyFromArray(dstAddr, MakeObjPtr(src->AsByteSizedArray()), src_offset, sz);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700394 } else if (component_type->IsPrimitiveShort() || component_type->IsPrimitiveChar()) {
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700395 copyFromArray(dstAddr, MakeObjPtr(src->AsShortSizedArray()), src_offset, sz);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700396 } else if (component_type->IsPrimitiveInt() || component_type->IsPrimitiveFloat()) {
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700397 copyFromArray(dstAddr, MakeObjPtr(src->AsIntArray()), src_offset, sz);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700398 } else if (component_type->IsPrimitiveLong() || component_type->IsPrimitiveDouble()) {
Mathieu Chartierbc5a7952016-10-17 15:46:31 -0700399 copyFromArray(dstAddr, MakeObjPtr(src->AsLongArray()), src_offset, sz);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700400 } else {
401 ThrowIllegalAccessException("not a primitive array");
402 }
Piotr Jastrzebskid7fcf6e2015-05-05 12:54:00 +0100403}
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100404static jboolean Unsafe_getBoolean(JNIEnv* env, jobject, jobject javaObj, jlong offset) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700405 ScopedFastNativeObjectAccess soa(env);
406 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
407 return obj->GetFieldBoolean(MemberOffset(offset));
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100408}
409
410static void Unsafe_putBoolean(JNIEnv* env, jobject, jobject javaObj, jlong offset, jboolean newValue) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700411 ScopedFastNativeObjectAccess soa(env);
412 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
413 // JNI must use non transactional mode (SetField8 is non-transactional).
414 obj->SetFieldBoolean<false>(MemberOffset(offset), newValue);
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100415}
416
417static jbyte Unsafe_getByte(JNIEnv* env, jobject, jobject javaObj, jlong offset) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700418 ScopedFastNativeObjectAccess soa(env);
419 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
420 return obj->GetFieldByte(MemberOffset(offset));
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100421}
422
423static void Unsafe_putByte(JNIEnv* env, jobject, jobject javaObj, jlong offset, jbyte newValue) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700424 ScopedFastNativeObjectAccess soa(env);
425 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
426 // JNI must use non transactional mode.
427 obj->SetFieldByte<false>(MemberOffset(offset), newValue);
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100428}
429
430static jchar Unsafe_getChar(JNIEnv* env, jobject, jobject javaObj, jlong offset) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700431 ScopedFastNativeObjectAccess soa(env);
432 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
433 return obj->GetFieldChar(MemberOffset(offset));
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100434}
435
436static void Unsafe_putChar(JNIEnv* env, jobject, jobject javaObj, jlong offset, jchar newValue) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700437 ScopedFastNativeObjectAccess soa(env);
438 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
439 // JNI must use non transactional mode.
440 obj->SetFieldChar<false>(MemberOffset(offset), newValue);
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100441}
442
443static jshort Unsafe_getShort(JNIEnv* env, jobject, jobject javaObj, jlong offset) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700444 ScopedFastNativeObjectAccess soa(env);
445 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
446 return obj->GetFieldShort(MemberOffset(offset));
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100447}
448
449static void Unsafe_putShort(JNIEnv* env, jobject, jobject javaObj, jlong offset, jshort newValue) {
Mathieu Chartier0795f232016-09-27 18:43:30 -0700450 ScopedFastNativeObjectAccess soa(env);
451 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
452 // JNI must use non transactional mode.
453 obj->SetFieldShort<false>(MemberOffset(offset), newValue);
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100454}
455
456static jfloat Unsafe_getFloat(JNIEnv* env, jobject, jobject javaObj, jlong offset) {
457 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700458 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Przemyslaw Szczepaniak5c404222015-08-04 13:19:12 +0100459 union {int32_t val; jfloat converted;} conv;
460 conv.val = obj->GetField32(MemberOffset(offset));
461 return conv.converted;
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100462}
463
464static void Unsafe_putFloat(JNIEnv* env, jobject, jobject javaObj, jlong offset, jfloat newValue) {
465 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700466 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Przemyslaw Szczepaniak5c404222015-08-04 13:19:12 +0100467 union {int32_t converted; jfloat val;} conv;
468 conv.val = newValue;
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100469 // JNI must use non transactional mode.
Przemyslaw Szczepaniak5c404222015-08-04 13:19:12 +0100470 obj->SetField32<false>(MemberOffset(offset), conv.converted);
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100471}
472
473static jdouble Unsafe_getDouble(JNIEnv* env, jobject, jobject javaObj, jlong offset) {
474 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700475 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Przemyslaw Szczepaniak5c404222015-08-04 13:19:12 +0100476 union {int64_t val; jdouble converted;} conv;
477 conv.val = obj->GetField64(MemberOffset(offset));
478 return conv.converted;
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100479}
480
481static void Unsafe_putDouble(JNIEnv* env, jobject, jobject javaObj, jlong offset, jdouble newValue) {
482 ScopedFastNativeObjectAccess soa(env);
Mathieu Chartier0795f232016-09-27 18:43:30 -0700483 ObjPtr<mirror::Object> obj = soa.Decode<mirror::Object>(javaObj);
Przemyslaw Szczepaniak5c404222015-08-04 13:19:12 +0100484 union {int64_t converted; jdouble val;} conv;
485 conv.val = newValue;
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100486 // JNI must use non transactional mode.
Przemyslaw Szczepaniak5c404222015-08-04 13:19:12 +0100487 obj->SetField64<false>(MemberOffset(offset), conv.converted);
Piotr Jastrzebski8e73ea42015-05-07 09:41:00 +0100488}
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -0700489
Igor Murashkin629afab2016-02-19 14:56:43 -0800490static void Unsafe_loadFence(JNIEnv*, jobject) {
491 std::atomic_thread_fence(std::memory_order_acquire);
492}
493
494static void Unsafe_storeFence(JNIEnv*, jobject) {
495 std::atomic_thread_fence(std::memory_order_release);
496}
497
498static void Unsafe_fullFence(JNIEnv*, jobject) {
499 std::atomic_thread_fence(std::memory_order_seq_cst);
500}
501
Elliott Hughes0512f022012-03-15 22:10:52 -0700502static JNINativeMethod gMethods[] = {
Igor Murashkin3b6f4402017-02-16 16:13:17 -0800503 FAST_NATIVE_METHOD(Unsafe, compareAndSwapInt, "(Ljava/lang/Object;JII)Z"),
504 FAST_NATIVE_METHOD(Unsafe, compareAndSwapLong, "(Ljava/lang/Object;JJJ)Z"),
505 FAST_NATIVE_METHOD(Unsafe, compareAndSwapObject, "(Ljava/lang/Object;JLjava/lang/Object;Ljava/lang/Object;)Z"),
506 FAST_NATIVE_METHOD(Unsafe, getIntVolatile, "(Ljava/lang/Object;J)I"),
507 FAST_NATIVE_METHOD(Unsafe, putIntVolatile, "(Ljava/lang/Object;JI)V"),
508 FAST_NATIVE_METHOD(Unsafe, getLongVolatile, "(Ljava/lang/Object;J)J"),
509 FAST_NATIVE_METHOD(Unsafe, putLongVolatile, "(Ljava/lang/Object;JJ)V"),
510 FAST_NATIVE_METHOD(Unsafe, getObjectVolatile, "(Ljava/lang/Object;J)Ljava/lang/Object;"),
511 FAST_NATIVE_METHOD(Unsafe, putObjectVolatile, "(Ljava/lang/Object;JLjava/lang/Object;)V"),
512 FAST_NATIVE_METHOD(Unsafe, getInt, "(Ljava/lang/Object;J)I"),
513 FAST_NATIVE_METHOD(Unsafe, putInt, "(Ljava/lang/Object;JI)V"),
514 FAST_NATIVE_METHOD(Unsafe, putOrderedInt, "(Ljava/lang/Object;JI)V"),
515 FAST_NATIVE_METHOD(Unsafe, getLong, "(Ljava/lang/Object;J)J"),
516 FAST_NATIVE_METHOD(Unsafe, putLong, "(Ljava/lang/Object;JJ)V"),
517 FAST_NATIVE_METHOD(Unsafe, putOrderedLong, "(Ljava/lang/Object;JJ)V"),
518 FAST_NATIVE_METHOD(Unsafe, getObject, "(Ljava/lang/Object;J)Ljava/lang/Object;"),
519 FAST_NATIVE_METHOD(Unsafe, putObject, "(Ljava/lang/Object;JLjava/lang/Object;)V"),
520 FAST_NATIVE_METHOD(Unsafe, putOrderedObject, "(Ljava/lang/Object;JLjava/lang/Object;)V"),
521 FAST_NATIVE_METHOD(Unsafe, getArrayBaseOffsetForComponentType, "(Ljava/lang/Class;)I"),
522 FAST_NATIVE_METHOD(Unsafe, getArrayIndexScaleForComponentType, "(Ljava/lang/Class;)I"),
523 FAST_NATIVE_METHOD(Unsafe, addressSize, "()I"),
524 FAST_NATIVE_METHOD(Unsafe, pageSize, "()I"),
525 FAST_NATIVE_METHOD(Unsafe, allocateMemory, "(J)J"),
526 FAST_NATIVE_METHOD(Unsafe, freeMemory, "(J)V"),
527 FAST_NATIVE_METHOD(Unsafe, setMemory, "(JJB)V"),
528 FAST_NATIVE_METHOD(Unsafe, copyMemory, "(JJJ)V"),
529 FAST_NATIVE_METHOD(Unsafe, copyMemoryToPrimitiveArray, "(JLjava/lang/Object;JJ)V"),
530 FAST_NATIVE_METHOD(Unsafe, copyMemoryFromPrimitiveArray, "(Ljava/lang/Object;JJJ)V"),
531 FAST_NATIVE_METHOD(Unsafe, getBoolean, "(Ljava/lang/Object;J)Z"),
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000532
Igor Murashkin3b6f4402017-02-16 16:13:17 -0800533 FAST_NATIVE_METHOD(Unsafe, getByte, "(Ljava/lang/Object;J)B"),
534 FAST_NATIVE_METHOD(Unsafe, getChar, "(Ljava/lang/Object;J)C"),
535 FAST_NATIVE_METHOD(Unsafe, getShort, "(Ljava/lang/Object;J)S"),
536 FAST_NATIVE_METHOD(Unsafe, getFloat, "(Ljava/lang/Object;J)F"),
537 FAST_NATIVE_METHOD(Unsafe, getDouble, "(Ljava/lang/Object;J)D"),
538 FAST_NATIVE_METHOD(Unsafe, putBoolean, "(Ljava/lang/Object;JZ)V"),
539 FAST_NATIVE_METHOD(Unsafe, putByte, "(Ljava/lang/Object;JB)V"),
540 FAST_NATIVE_METHOD(Unsafe, putChar, "(Ljava/lang/Object;JC)V"),
541 FAST_NATIVE_METHOD(Unsafe, putShort, "(Ljava/lang/Object;JS)V"),
542 FAST_NATIVE_METHOD(Unsafe, putFloat, "(Ljava/lang/Object;JF)V"),
543 FAST_NATIVE_METHOD(Unsafe, putDouble, "(Ljava/lang/Object;JD)V"),
Narayan Kamath0dd8c392016-02-01 13:22:18 +0000544
545 // Each of the getFoo variants are overloaded with a call that operates
546 // directively on a native pointer.
Igor Murashkin3b6f4402017-02-16 16:13:17 -0800547 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, getByte, "(J)B", getByteJ),
548 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, getChar, "(J)C", getCharJ),
549 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, getShort, "(J)S", getShortJ),
550 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, getInt, "(J)I", getIntJ),
551 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, getLong, "(J)J", getLongJ),
552 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, getFloat, "(J)F", getFloatJ),
553 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, getDouble, "(J)D", getDoubleJ),
554 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, putByte, "(JB)V", putByteJB),
555 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, putChar, "(JC)V", putCharJC),
556 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, putShort, "(JS)V", putShortJS),
557 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, putInt, "(JI)V", putIntJI),
558 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, putLong, "(JJ)V", putLongJJ),
559 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, putFloat, "(JF)V", putFloatJF),
560 OVERLOADED_FAST_NATIVE_METHOD(Unsafe, putDouble, "(JD)V", putDoubleJD),
Igor Murashkin629afab2016-02-19 14:56:43 -0800561
562 // CAS
Igor Murashkin3b6f4402017-02-16 16:13:17 -0800563 FAST_NATIVE_METHOD(Unsafe, loadFence, "()V"),
564 FAST_NATIVE_METHOD(Unsafe, storeFence, "()V"),
565 FAST_NATIVE_METHOD(Unsafe, fullFence, "()V"),
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -0700566};
567
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -0700568void register_sun_misc_Unsafe(JNIEnv* env) {
Elliott Hugheseac76672012-05-24 21:56:51 -0700569 REGISTER_NATIVE_METHODS("sun/misc/Unsafe");
Elliott Hughes5ee7a8b2011-09-13 16:40:07 -0700570}
571
572} // namespace art