refactor: Move Unsafe to reflection class

This commit is contained in:
NotMyFault 2021-10-18 22:01:54 +02:00
parent c7a490fa03
commit f1e8a1a29a
No known key found for this signature in database
GPG Key ID: 158F5701A6AAD00C
4 changed files with 15 additions and 35 deletions

View File

@ -8,8 +8,8 @@ import com.fastasyncworldedit.core.FaweCache;
import com.fastasyncworldedit.core.configuration.Settings; import com.fastasyncworldedit.core.configuration.Settings;
import com.fastasyncworldedit.core.math.BitArrayUnstretched; import com.fastasyncworldedit.core.math.BitArrayUnstretched;
import com.fastasyncworldedit.core.util.MathMan; import com.fastasyncworldedit.core.util.MathMan;
import com.fastasyncworldedit.core.util.ReflectionUtils;
import com.fastasyncworldedit.core.util.TaskManager; import com.fastasyncworldedit.core.util.TaskManager;
import com.fastasyncworldedit.core.util.UnsafeUtility;
import com.mojang.datafixers.util.Either; import com.mojang.datafixers.util.Either;
import com.sk89q.worldedit.bukkit.adapter.Refraction; import com.sk89q.worldedit.bukkit.adapter.Refraction;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
@ -119,7 +119,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter {
getVisibleChunkIfPresent.setAccessible(true); getVisibleChunkIfPresent.setAccessible(true);
methodGetVisibleChunk = MethodHandles.lookup().unreflect(getVisibleChunkIfPresent); methodGetVisibleChunk = MethodHandles.lookup().unreflect(getVisibleChunkIfPresent);
Unsafe unsafe = UnsafeUtility.getUNSAFE(); Unsafe unsafe = ReflectionUtils.getUnsafe();
fieldLock = PalettedContainer.class.getDeclaredField(Refraction.pickName("lock", "m")); fieldLock = PalettedContainer.class.getDeclaredField(Refraction.pickName("lock", "m"));
fieldLockOffset = unsafe.objectFieldOffset(fieldLock); fieldLockOffset = unsafe.objectFieldOffset(fieldLock);
@ -160,7 +160,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter {
) { ) {
long offset = ((long) layer << CHUNKSECTION_SHIFT) + CHUNKSECTION_BASE; long offset = ((long) layer << CHUNKSECTION_SHIFT) + CHUNKSECTION_BASE;
if (layer >= 0 && layer < sections.length) { if (layer >= 0 && layer < sections.length) {
return UnsafeUtility.getUNSAFE().compareAndSwapObject(sections, offset, expected, value); return ReflectionUtils.getUnsafe().compareAndSwapObject(sections, offset, expected, value);
} }
return false; return false;
} }
@ -169,7 +169,7 @@ public final class PaperweightPlatformAdapter extends NMSAdapter {
//todo there has to be a better way to do this. Maybe using a() in DataPaletteBlock which acquires the lock in NMS? //todo there has to be a better way to do this. Maybe using a() in DataPaletteBlock which acquires the lock in NMS?
try { try {
synchronized (section) { synchronized (section) {
Unsafe unsafe = UnsafeUtility.getUNSAFE(); Unsafe unsafe = ReflectionUtils.getUnsafe();
PalettedContainer<net.minecraft.world.level.block.state.BlockState> blocks = section.getStates(); PalettedContainer<net.minecraft.world.level.block.state.BlockState> blocks = section.getStates();
Semaphore currentLock = (Semaphore) unsafe.getObject(blocks, fieldLockOffset); Semaphore currentLock = (Semaphore) unsafe.getObject(blocks, fieldLockOffset);
if (currentLock instanceof DelegateSemaphore) { if (currentLock instanceof DelegateSemaphore) {

View File

@ -6,7 +6,7 @@ import com.fastasyncworldedit.core.internal.exception.FaweClipboardVersionMismat
import com.fastasyncworldedit.core.jnbt.streamer.IntValueReader; import com.fastasyncworldedit.core.jnbt.streamer.IntValueReader;
import com.fastasyncworldedit.core.math.IntTriple; import com.fastasyncworldedit.core.math.IntTriple;
import com.fastasyncworldedit.core.util.MainUtil; import com.fastasyncworldedit.core.util.MainUtil;
import com.fastasyncworldedit.core.util.UnsafeUtility; import com.fastasyncworldedit.core.util.ReflectionUtils;
import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.IntTag; import com.sk89q.jnbt.IntTag;
import com.sk89q.jnbt.Tag; import com.sk89q.jnbt.Tag;
@ -332,7 +332,7 @@ public class DiskOptimizedClipboard extends LinearClipboard implements Closeable
if (cb == null || !cb.isDirect()) { if (cb == null || !cb.isDirect()) {
return; return;
} }
UnsafeUtility.getUNSAFE().invokeCleaner(cb); ReflectionUtils.getUnsafe().invokeCleaner(cb);
} }
@Override @Override

View File

@ -12,6 +12,9 @@ import java.lang.reflect.Modifier;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
/**
* This is an internal class not meant to be used outside the FAWE internals.
*/
public class ReflectionUtils { public class ReflectionUtils {
private static Unsafe UNSAFE; private static Unsafe UNSAFE;
@ -134,5 +137,11 @@ public class ReflectionUtils {
UNSAFE.putObject(base, UNSAFE.objectFieldOffset(field), value); UNSAFE.putObject(base, UNSAFE.objectFieldOffset(field), value);
} }
/**
* @return an instance of {@link Unsafe}
*/
public static Unsafe getUnsafe() {
return UNSAFE;
}
} }

View File

@ -1,29 +0,0 @@
package com.fastasyncworldedit.core.util;
import sun.misc.Unsafe;
import java.lang.reflect.Field;
/**
* This is an internal class not meant to be used outside the FAWE internals.
* @hidden
*/
public class UnsafeUtility {
private static final Unsafe UNSAFE;
static {
try {
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
UNSAFE = (Unsafe) theUnsafe.get(null);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new ExceptionInInitializerError("Cannot access Unsafe");
}
}
public static Unsafe getUNSAFE() {
return UNSAFE;
}
}