зеркало из https://github.com/mono/ikvm-fork.git
- Imported a modified version of AbstractQueuedSynchronizer that is more efficient and doesn't use reflection & unsafe to reduce initialization order dependencies.
- Changed unsafe to use more efficient internal helper class to copy Field and make it accessible (this also reduces initialization order dependencies).
This commit is contained in:
Родитель
506e7a6584
Коммит
42d9acd333
|
@ -4418,7 +4418,9 @@ java/lang/ProcessImpl.java
|
||||||
java/lang/StringHelper.java
|
java/lang/StringHelper.java
|
||||||
java/lang/VMThread.java
|
java/lang/VMThread.java
|
||||||
java/lang/ref/Reference.java
|
java/lang/ref/Reference.java
|
||||||
|
java/lang/reflect/ReflectHelper.java
|
||||||
java/nio/channels/VMChannels.java
|
java/nio/channels/VMChannels.java
|
||||||
|
java/util/concurrent/locks/AbstractQueuedSynchronizer.java
|
||||||
java/util/concurrent/locks/LockSupport.java
|
java/util/concurrent/locks/LockSupport.java
|
||||||
java/util/jar/JarEntry.java
|
java/util/jar/JarEntry.java
|
||||||
sun/misc/FileURLMapper.java
|
sun/misc/FileURLMapper.java
|
||||||
|
@ -5203,7 +5205,6 @@ sun/reflect/ReflectionFactory.java
|
||||||
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/atomic/AtomicStampedReference.java
|
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/atomic/AtomicStampedReference.java
|
||||||
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/locks/AbstractOwnableSynchronizer.java
|
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/locks/AbstractOwnableSynchronizer.java
|
||||||
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java
|
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java
|
||||||
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java
|
|
||||||
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/locks/Condition.java
|
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/locks/Condition.java
|
||||||
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/locks/Lock.java
|
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/locks/Lock.java
|
||||||
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/locks/ReadWriteLock.java
|
../../openjdk-b13/j2se/src/share/classes/java/util/concurrent/locks/ReadWriteLock.java
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1202,6 +1202,56 @@
|
||||||
</body>
|
</body>
|
||||||
</method>
|
</method>
|
||||||
</class>
|
</class>
|
||||||
|
<class name="java.util.concurrent.locks.AbstractQueuedSynchronizer">
|
||||||
|
<method name="compareAndSetState" sig="(II)Z">
|
||||||
|
<body>
|
||||||
|
<ldarg_0 />
|
||||||
|
<ldflda class="java.util.concurrent.locks.AbstractQueuedSynchronizer" name="state" sig="I" />
|
||||||
|
<ldarg_2 />
|
||||||
|
<ldarg_1 />
|
||||||
|
<call type="System.Threading.Interlocked" name="CompareExchange" sig="System.Int32&;System.Int32;System.Int32" />
|
||||||
|
<ldarg_1 />
|
||||||
|
<ceq />
|
||||||
|
<ret />
|
||||||
|
</body>
|
||||||
|
</method>
|
||||||
|
<method name="compareAndSetHead" sig="(Ljava.util.concurrent.locks.AbstractQueuedSynchronizer$Node;)Z">
|
||||||
|
<body>
|
||||||
|
<ldarg_0 />
|
||||||
|
<ldflda class="java.util.concurrent.locks.AbstractQueuedSynchronizer" name="head" sig="Ljava.lang.Object;" />
|
||||||
|
<ldarg_1 />
|
||||||
|
<ldnull />
|
||||||
|
<call type="System.Threading.Interlocked" name="CompareExchange" sig="System.Object&;System.Object;System.Object" />
|
||||||
|
<ldnull />
|
||||||
|
<ceq />
|
||||||
|
<ret />
|
||||||
|
</body>
|
||||||
|
</method>
|
||||||
|
<method name="compareAndSetTail" sig="(Ljava.util.concurrent.locks.AbstractQueuedSynchronizer$Node;Ljava.util.concurrent.locks.AbstractQueuedSynchronizer$Node;)Z">
|
||||||
|
<body>
|
||||||
|
<ldarg_0 />
|
||||||
|
<ldflda class="java.util.concurrent.locks.AbstractQueuedSynchronizer" name="tail" sig="Ljava.lang.Object;" />
|
||||||
|
<ldarg_2 />
|
||||||
|
<ldarg_1 />
|
||||||
|
<call type="System.Threading.Interlocked" name="CompareExchange" sig="System.Object&;System.Object;System.Object" />
|
||||||
|
<ldarg_1 />
|
||||||
|
<ceq />
|
||||||
|
<ret />
|
||||||
|
</body>
|
||||||
|
</method>
|
||||||
|
<method name="compareAndSetWaitStatus" sig="(Ljava.util.concurrent.locks.AbstractQueuedSynchronizer$Node;II)Z">
|
||||||
|
<body>
|
||||||
|
<ldarg_0 />
|
||||||
|
<ldflda class="java.util.concurrent.locks.AbstractQueuedSynchronizer$Node" name="waitStatus" sig="I" />
|
||||||
|
<ldarg_2 />
|
||||||
|
<ldarg_1 />
|
||||||
|
<call type="System.Threading.Interlocked" name="CompareExchange" sig="System.Int32&;System.Int32;System.Int32" />
|
||||||
|
<ldarg_1 />
|
||||||
|
<ceq />
|
||||||
|
<ret />
|
||||||
|
</body>
|
||||||
|
</method>
|
||||||
|
</class>
|
||||||
<class name="java.util.concurrent.locks.LockSupport">
|
<class name="java.util.concurrent.locks.LockSupport">
|
||||||
<method name="cmpxchgParkState" sig="(Ljava.lang.Thread;II)I">
|
<method name="cmpxchgParkState" sig="(Ljava.lang.Thread;II)I">
|
||||||
<body>
|
<body>
|
||||||
|
|
|
@ -24,25 +24,16 @@
|
||||||
|
|
||||||
package sun.misc;
|
package sun.misc;
|
||||||
|
|
||||||
import cli.System.Reflection.BindingFlags;
|
|
||||||
import cli.System.Reflection.FieldInfo;
|
|
||||||
import gnu.classpath.VMStackWalker;
|
import gnu.classpath.VMStackWalker;
|
||||||
import ikvm.lang.CIL;
|
|
||||||
import ikvm.runtime.Util;
|
|
||||||
import java.lang.reflect.AccessibleObject;
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.ReflectHelper;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.security.AccessController;
|
|
||||||
import java.security.PrivilegedAction;
|
|
||||||
import sun.reflect.ReflectionFactory;
|
|
||||||
|
|
||||||
public final class Unsafe
|
public final class Unsafe
|
||||||
{
|
{
|
||||||
public static final int INVALID_FIELD_OFFSET = -1;
|
public static final int INVALID_FIELD_OFFSET = -1;
|
||||||
private static final Unsafe instance = new Unsafe();
|
private static final Unsafe instance = new Unsafe();
|
||||||
private static final ArrayList<Field> fields = new ArrayList<Field>();
|
private static final ArrayList<Field> fields = new ArrayList<Field>();
|
||||||
private static final ReflectionFactory factory = (ReflectionFactory)AccessController.doPrivileged(new ReflectionFactory.GetReflectionFactoryAction());
|
|
||||||
private static final FieldInfo accessibleField = Util.getInstanceTypeFromClass(AccessibleObject.class).GetField("override", BindingFlags.wrap(BindingFlags.Instance | BindingFlags.NonPublic));
|
|
||||||
|
|
||||||
private Unsafe() {}
|
private Unsafe() {}
|
||||||
|
|
||||||
|
@ -63,10 +54,7 @@ public final class Unsafe
|
||||||
|
|
||||||
public int fieldOffset(Field original)
|
public int fieldOffset(Field original)
|
||||||
{
|
{
|
||||||
Field copy = factory.copyField(original);
|
Field copy = ReflectHelper.copyFieldAndMakeAccessible(original);
|
||||||
// we use .NET reflection to directly set the override field (equivalent to calling setAccessible(true)),
|
|
||||||
// because a broken Mauve security manager prevents us from using AccessController.doPrivileged().
|
|
||||||
accessibleField.SetValue(copy, CIL.box_boolean(true));
|
|
||||||
synchronized(fields)
|
synchronized(fields)
|
||||||
{
|
{
|
||||||
int id = fields.size();
|
int id = fields.size();
|
||||||
|
|
Загрузка…
Ссылка в новой задаче