-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathunsafe.cpp
556 lines (464 loc) · 20.9 KB
/
unsafe.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
// Copyright (C) 2018 Cornell University
// This file implements the native methods in sun.misc.Unsafe.
//
// Normally we are able to reuse Java native method implementations from the
// JDK, but the methods in sun.misc.Unsafe are really just markers for
// JVM intrinsics, and do not exist in a VM-independent way.
// So we re-implement them here.
#include "unsafe.h"
#include "class.h"
#include "rep.h"
#include "stack_trace.h"
#include <cstdio>
#include <cstdlib>
#include <jni.h>
#include <string.h>
// GCC built-in compare-and-swap.
#define CAS(ptr, e, x) __sync_val_compare_and_swap(ptr, e, x)
template <typename T>
static jboolean JavaCompareAndSwap(jobject obj, jlong offset, T e, T x) {
auto raw_ptr = reinterpret_cast<char *>(obj) + offset;
auto ptr = reinterpret_cast<T *>(raw_ptr);
T prev = CAS(ptr, e, x);
return prev == e;
}
[[noreturn]] static void UnsafeUnimplemented(const char *name) {
fprintf(stderr,
"- - - - - - - - - - - - - - - - - - - - - - - - - - - -\n"
"The following sun.misc.Unsafe method is unimplemented:\n"
" %s\n"
"It is defined in " __FILE__ ".\n"
"Aborting for now.\n"
"- - - - - - - - - - - - - - - - - - - - - - - - - - - -\n",
name);
DumpStackTrace();
abort();
}
static void WarnUnsafeUnimplemented(const char *name) {
// fprintf(stderr,
// "WARNING: sun.misc.Unsafe method %s is unimplemented, "
// "but will not abort.\n", name);
}
extern "C" {
void Java_sun_misc_Unsafe_registerNatives(JNIEnv *env, jclass obj) {
// Since we define all the native methods here with the proper names,
// there's no need to register them explicitly.
}
jint Java_sun_misc_Unsafe_getInt__Ljava_lang_Object_2J(JNIEnv *env,
jobject unsafeObj,
jobject obj,
jlong offset) {
return *(reinterpret_cast<jint *>(reinterpret_cast<char *>(obj) + offset));
}
void Java_sun_misc_Unsafe_putInt__Ljava_lang_Object_2JI(
JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jint value) {
*(reinterpret_cast<jint *>(reinterpret_cast<char *>(obj) + offset)) = value;
}
extern "C" {
jobject Polyglot_jlang_runtime_Factory_autoBoxInt__I(jint);
}
jobject Java_sun_misc_Unsafe_getObject(JNIEnv *env, jobject unsafeObj,
jobject obj, jlong offset) {
// dw475 TODO autobox primative types (need to inspect object field) (may
// not have to)
return *(
reinterpret_cast<jobject *>(reinterpret_cast<char *>(obj) + offset));
}
void Java_sun_misc_Unsafe_putObject(JNIEnv *env, jobject unsafeObj, jobject obj,
jlong offset, jobject value) {
*(reinterpret_cast<jobject *>(reinterpret_cast<char *>(obj) + offset)) =
value;
}
jboolean Java_sun_misc_Unsafe_getBoolean(JNIEnv *env, jobject unsafeObj,
jobject obj, jlong offset) {
return *(
reinterpret_cast<jboolean *>(reinterpret_cast<char *>(obj) + offset));
}
void Java_sun_misc_Unsafe_putBoolean(JNIEnv *env, jobject unsafeObj,
jobject obj, jlong offset,
jboolean value) {
*(reinterpret_cast<jboolean *>(reinterpret_cast<char *>(obj) + offset)) =
value;
}
jbyte Java_sun_misc_Unsafe_getByte__Ljava_lang_Object_2J(JNIEnv *env,
jobject unsafeObj,
jobject obj,
jlong offset) {
return *(reinterpret_cast<jbyte *>(reinterpret_cast<char *>(obj) + offset));
}
void Java_sun_misc_Unsafe_putByte__Ljava_lang_Object_2JB(
JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jbyte value) {
*(reinterpret_cast<jbyte *>(reinterpret_cast<char *>(obj) + offset)) =
value;
}
jshort Java_sun_misc_Unsafe_getShort__Ljava_lang_Object_2J(JNIEnv *env,
jobject unsafeObj,
jobject obj,
jlong offset) {
return *(
reinterpret_cast<jshort *>(reinterpret_cast<char *>(obj) + offset));
}
void Java_sun_misc_Unsafe_putShort__Ljava_lang_Object_2JS(
JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jshort value) {
*(reinterpret_cast<jshort *>(reinterpret_cast<char *>(obj) + offset)) =
value;
}
jchar Java_sun_misc_Unsafe_getChar__Ljava_lang_Object_2J(JNIEnv *env,
jobject unsafeObj,
jobject obj,
jlong offset) {
return *(reinterpret_cast<jchar *>(reinterpret_cast<char *>(obj) + offset));
}
void Java_sun_misc_Unsafe_putChar__Ljava_lang_Object_2JC(
JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jchar value) {
*(reinterpret_cast<jchar *>(reinterpret_cast<char *>(obj) + offset)) =
value;
}
jlong Java_sun_misc_Unsafe_getLong__Ljava_lang_Object_2J(JNIEnv *env,
jobject unsafeObj,
jobject obj,
jlong offset) {
return *(reinterpret_cast<jlong *>(reinterpret_cast<char *>(obj) + offset));
}
void Java_sun_misc_Unsafe_putLong__Ljava_lang_Object_2JJ(
JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jlong value) {
*(reinterpret_cast<jlong *>(reinterpret_cast<char *>(obj) + offset)) =
value;
}
jfloat Java_sun_misc_Unsafe_getFloat__Ljava_lang_Object_2J(JNIEnv *env,
jobject unsafeObj,
jobject obj,
jlong offset) {
return *(
reinterpret_cast<jfloat *>(reinterpret_cast<char *>(obj) + offset));
}
void Java_sun_misc_Unsafe_putFloat__Ljava_lang_Object_2JF(
JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jfloat value) {
*(reinterpret_cast<jfloat *>(reinterpret_cast<char *>(obj) + offset)) =
value;
}
jdouble Java_sun_misc_Unsafe_getDouble__Ljava_lang_Object_2J(JNIEnv *env,
jobject unsafeObj,
jobject obj,
jlong offset) {
return *(
reinterpret_cast<jdouble *>(reinterpret_cast<char *>(obj) + offset));
}
void Java_sun_misc_Unsafe_putDouble__Ljava_lang_Object_2JD(
JNIEnv *env, jobject unsafeObj, jobject obj, jlong offset, jdouble value) {
*(reinterpret_cast<jdouble *>(reinterpret_cast<char *>(obj) + offset)) =
value;
}
jbyte Java_sun_misc_Unsafe_getByte__J(JNIEnv *env, jobject unsafe, jlong addr) {
jbyte *ptr = (jbyte *)addr;
return *ptr;
}
void Java_sun_misc_Unsafe_putByte__JB(JNIEnv *env, jobject unsafe, jlong addr,
jbyte val) {
jbyte *ptr = (jbyte *)addr;
if (ptr != NULL) {
*ptr = val;
}
return;
}
jshort Java_sun_misc_Unsafe_getShort__J(JNIEnv *env, jobject, jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getShort__J");
}
void Java_sun_misc_Unsafe_putShort__JS(JNIEnv *env, jobject, jlong, jshort) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putShort__JS");
}
jchar Java_sun_misc_Unsafe_getChar__J(JNIEnv *env, jobject, jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getChar__J");
}
void Java_sun_misc_Unsafe_putChar__JC(JNIEnv *env, jobject, jlong, jchar) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putChar__JC");
}
jint Java_sun_misc_Unsafe_getInt__J(JNIEnv *env, jobject, jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getInt__J");
}
void Java_sun_misc_Unsafe_putInt__JI(JNIEnv *env, jobject, jlong, jint) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putInt__JI");
}
jlong Java_sun_misc_Unsafe_getLong__J(JNIEnv *env, jobject, jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getLong__J");
}
void Java_sun_misc_Unsafe_putLong__JJ(JNIEnv *env, jobject unsafe, jlong addr,
jlong val) {
jlong *ptr = (jlong *)addr;
if (ptr != NULL) {
*ptr = val;
}
return;
}
jfloat Java_sun_misc_Unsafe_getFloat__J(JNIEnv *env, jobject, jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getFloat__J");
}
void Java_sun_misc_Unsafe_putFloat__JF(JNIEnv *env, jobject, jlong, jfloat) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putFloat__JF");
}
jdouble Java_sun_misc_Unsafe_getDouble__J(JNIEnv *env, jobject, jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getDouble__J");
}
void Java_sun_misc_Unsafe_putDouble__JD(JNIEnv *env, jobject, jlong, jdouble) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putDouble__JD");
}
jlong Java_sun_misc_Unsafe_getAddress(JNIEnv *env, jobject, jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getAddress");
}
void Java_sun_misc_Unsafe_putAddress(JNIEnv *env, jobject, jlong, jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putAddress");
}
jlong Java_sun_misc_Unsafe_allocateMemory(JNIEnv *env, jobject unsafe,
jlong size) {
if (size < 0) {
return 0; // TODO throw IllegalArgumentException instead!
}
void *ptr = malloc(size); // TODO check that I might need to align this?
if (ptr == NULL) {
return NULL; // TODO throw OutOfMemoryException
} else {
return (jlong)ptr;
}
}
jlong Java_sun_misc_Unsafe_reallocateMemory(JNIEnv *env, jobject unsafe,
jlong ptr_old, jlong size) {
if (size < 0) {
return 0; // TODO throw IllegalArgumentException instead!
}
void *ptr = realloc((void *)ptr_old,
size); // TODO check that I might need to align this?
if (ptr == NULL) {
return NULL; // TODO throw OutOfMemoryException
} else {
return (jlong)ptr;
}
}
void Java_sun_misc_Unsafe_setMemory(JNIEnv *env, jobject, jobject, jlong, jlong,
jbyte) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_setMemory");
}
void Java_sun_misc_Unsafe_copyMemory(JNIEnv *env, jobject, jobject, jlong,
jobject, jlong, jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_copyMemory");
}
void Java_sun_misc_Unsafe_freeMemory(JNIEnv *env, jobject unsafe, jlong ptr) {
free((void *)ptr);
return;
}
jlong Java_sun_misc_Unsafe_staticFieldOffset(JNIEnv *env, jobject unsafeObj,
jobject fieldObj) {
jlong staticoff =
Java_sun_misc_Unsafe_objectFieldOffset(env, unsafeObj, fieldObj);
return staticoff;
}
// always constant once we figure them out
unsigned int fieldSlotOffset = -1;
unsigned int fieldClazzOffset = -1;
jlong Java_sun_misc_Unsafe_objectFieldOffset(JNIEnv *env, jobject unsafeObj,
jobject fieldObj) {
int slot = 0;
if (fieldSlotOffset == -1) {
const JavaClassInfo *info =
GetJavaClassInfo(Unwrap(fieldObj)->Cdv()->Class()->Wrap());
for (int i = 0; i < info->num_fields; i++) {
if (strcmp(info->fields[i].name, "slot") == 0) {
fieldSlotOffset = info->fields[i].offset;
} else if (strcmp(info->fields[i].name, "clazz") == 0) {
fieldClazzOffset = info->fields[i].offset;
}
}
}
slot = *((jint *)(((char *)fieldObj) + fieldSlotOffset));
jclass ofClass = *((jclass *)(((char *)fieldObj) + fieldClazzOffset));
const JavaClassInfo *info = GetJavaClassInfo(ofClass);
if (slot >= 0) {
return info->fields[slot].offset;
} else {
return (jlong)info->static_fields[-slot - 1].ptr;
}
}
jobject Java_sun_misc_Unsafe_staticFieldBase(JNIEnv *env, jobject unsafeObj,
jobject fieldObj) {
// UnsafeUnimplemented("Java_sun_misc_Unsafe_staticFieldBase");
// WARNING: Assume the address of static field is within 32bit offset range
// of the fieldObj since sun.misc.Unsafe.fieldOffset(field) cast
// the offset from long to int.
return nullptr;
}
jboolean Java_sun_misc_Unsafe_shouldBeInitialized(JNIEnv *env, jobject,
jclass) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_shouldBeInitialized");
}
void Java_sun_misc_Unsafe_ensureClassInitialized(JNIEnv *env, jobject unsafeObj,
jclass cls) {
// dw475 TODO make sure this is correct
// check if class is loaded and load it if not
if (GetJavaClassInfo(cls) == NULL) {
printf("!!!!CRITICAL!!!!\nFound an instance of not loaded class\n");
UnsafeUnimplemented("Java_sun_misc_Unsafe_ensureClassInitialized");
}
}
jint Java_sun_misc_Unsafe_arrayBaseOffset(JNIEnv *env, jobject unsafe,
jclass cls) {
jarray arr = nullptr;
auto ptr = Unwrap(arr)->Data();
auto offset = reinterpret_cast<intptr_t>(ptr);
return static_cast<jint>(offset);
}
jint Java_sun_misc_Unsafe_arrayIndexScale(JNIEnv *env, jobject, jclass cls) {
if (!isArrayClass(cls)) {
return -1;
} // TODO what is correct behavior?
jclass compClass = GetComponentClass(cls);
return arrayRepSize(compClass);
}
jint Java_sun_misc_Unsafe_addressSize(JNIEnv *env, jobject) {
return sizeof(intptr_t);
}
jint Java_sun_misc_Unsafe_pageSize(JNIEnv *env, jobject) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_pageSize");
}
jclass
Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BIILjava_lang_ClassLoader_2Ljava_security_ProtectionDomain_2(
JNIEnv *env, jobject, jstring, jbyteArray, jint, jint, jobject, jobject) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_"
"3BIILjava_lang_ClassLoader_2Ljava_security_"
"ProtectionDomain_2");
}
jclass Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BII(
JNIEnv *env, jobject, jstring, jbyteArray, jint, jint) {
UnsafeUnimplemented(
"Java_sun_misc_Unsafe_defineClass__Ljava_lang_String_2_3BII");
}
jclass Java_sun_misc_Unsafe_defineAnonymousClass(JNIEnv *env, jobject, jclass,
jbyteArray, jobjectArray) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_defineAnonymousClass");
}
jobject Java_sun_misc_Unsafe_allocateInstance(JNIEnv *env, jobject, jclass) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_allocateInstance");
}
void Java_sun_misc_Unsafe_monitorEnter(JNIEnv *env, jobject, jobject) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_monitorEnter");
}
void Java_sun_misc_Unsafe_monitorExit(JNIEnv *env, jobject, jobject) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_monitorExit");
}
jboolean Java_sun_misc_Unsafe_tryMonitorEnter(JNIEnv *env, jobject, jobject) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_tryMonitorEnter");
}
void Java_sun_misc_Unsafe_throwException(JNIEnv *env, jobject, jthrowable) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_throwException");
}
jboolean Java_sun_misc_Unsafe_compareAndSwapObject(JNIEnv *env, jobject unsafe,
jobject obj, jlong offset,
jobject e, jobject x) {
return JavaCompareAndSwap(obj, offset, e, x);
}
jboolean Java_sun_misc_Unsafe_compareAndSwapInt(JNIEnv *env, jobject unsafe,
jobject obj, jlong offset,
jint e, jint x) {
return JavaCompareAndSwap(obj, offset, e, x);
}
jboolean Java_sun_misc_Unsafe_compareAndSwapLong(JNIEnv *env, jobject unsafe,
jobject obj, jlong offset,
jlong e, jlong x) {
return JavaCompareAndSwap(obj, offset, e, x);
}
jobject Java_sun_misc_Unsafe_getObjectVolatile(JNIEnv *env, jobject unsafeObj,
jobject obj, jlong offset) {
// TODO do right thing w.r.t memory model and thread ordering
return Java_sun_misc_Unsafe_getObject(env, unsafeObj, obj, offset);
}
void Java_sun_misc_Unsafe_putObjectVolatile(JNIEnv *env, jobject, jobject,
jlong, jobject) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putObjectVolatile");
}
jint Java_sun_misc_Unsafe_getIntVolatile(JNIEnv *env, jobject, jobject, jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getIntVolatile");
}
void Java_sun_misc_Unsafe_putIntVolatile(JNIEnv *env, jobject, jobject, jlong,
jint) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putIntVolatile");
}
jboolean Java_sun_misc_Unsafe_getBooleanVolatile(JNIEnv *env, jobject, jobject,
jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getBooleanVolatile");
}
void Java_sun_misc_Unsafe_putBooleanVolatile(JNIEnv *env, jobject, jobject,
jlong, jboolean) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putBooleanVolatile");
}
jbyte Java_sun_misc_Unsafe_getByteVolatile(JNIEnv *env, jobject, jobject,
jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getByteVolatile");
}
void Java_sun_misc_Unsafe_putByteVolatile(JNIEnv *env, jobject, jobject, jlong,
jbyte) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putByteVolatile");
}
jshort Java_sun_misc_Unsafe_getShortVolatile(JNIEnv *env, jobject, jobject,
jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getShortVolatile");
}
void Java_sun_misc_Unsafe_putShortVolatile(JNIEnv *env, jobject, jobject, jlong,
jshort) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putShortVolatile");
}
jchar Java_sun_misc_Unsafe_getCharVolatile(JNIEnv *env, jobject, jobject,
jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getCharVolatile");
}
void Java_sun_misc_Unsafe_putCharVolatile(JNIEnv *env, jobject, jobject, jlong,
jchar) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putCharVolatile");
}
jlong Java_sun_misc_Unsafe_getLongVolatile(JNIEnv *env, jobject, jobject,
jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getLongVolatile");
}
void Java_sun_misc_Unsafe_putLongVolatile(JNIEnv *env, jobject, jobject, jlong,
jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putLongVolatile");
}
jfloat Java_sun_misc_Unsafe_getFloatVolatile(JNIEnv *env, jobject, jobject,
jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getFloatVolatile");
}
void Java_sun_misc_Unsafe_putFloatVolatile(JNIEnv *env, jobject, jobject, jlong,
jfloat) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putFloatVolatile");
}
jdouble Java_sun_misc_Unsafe_getDoubleVolatile(JNIEnv *env, jobject, jobject,
jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getDoubleVolatile");
}
void Java_sun_misc_Unsafe_putDoubleVolatile(JNIEnv *env, jobject, jobject,
jlong, jdouble) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putDoubleVolatile");
}
void Java_sun_misc_Unsafe_putOrderedObject(JNIEnv *env, jobject unsafeObj,
jobject obj, jlong offset,
jobject value) {
// TODO do the right memory model thing as specified in Unsafe.java
// w.r.t. thread ordering
return Java_sun_misc_Unsafe_putObject(env, unsafeObj, obj, offset, value);
}
void Java_sun_misc_Unsafe_putOrderedInt(JNIEnv *env, jobject, jobject, jlong,
jint) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putOrderedInt");
}
void Java_sun_misc_Unsafe_putOrderedLong(JNIEnv *env, jobject, jobject, jlong,
jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_putOrderedLong");
}
void Java_sun_misc_Unsafe_unpark(JNIEnv *env, jobject, jobject) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_unpark");
}
void Java_sun_misc_Unsafe_park(JNIEnv *env, jobject, jboolean, jlong) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_park");
}
jint Java_sun_misc_Unsafe_getLoadAverage(JNIEnv *env, jobject, jdoubleArray,
jint) {
UnsafeUnimplemented("Java_sun_misc_Unsafe_getLoadAverage");
}
} // extern "C"