зеркало из 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/VMThread.java
|
||||
java/lang/ref/Reference.java
|
||||
java/lang/reflect/ReflectHelper.java
|
||||
java/nio/channels/VMChannels.java
|
||||
java/util/concurrent/locks/AbstractQueuedSynchronizer.java
|
||||
java/util/concurrent/locks/LockSupport.java
|
||||
java/util/jar/JarEntry.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/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/AbstractQueuedSynchronizer.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/ReadWriteLock.java
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1202,6 +1202,56 @@
|
|||
</body>
|
||||
</method>
|
||||
</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">
|
||||
<method name="cmpxchgParkState" sig="(Ljava.lang.Thread;II)I">
|
||||
<body>
|
||||
|
|
|
@ -24,25 +24,16 @@
|
|||
|
||||
package sun.misc;
|
||||
|
||||
import cli.System.Reflection.BindingFlags;
|
||||
import cli.System.Reflection.FieldInfo;
|
||||
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.ReflectHelper;
|
||||
import java.util.ArrayList;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
import sun.reflect.ReflectionFactory;
|
||||
|
||||
public final class Unsafe
|
||||
{
|
||||
public static final int INVALID_FIELD_OFFSET = -1;
|
||||
private static final Unsafe instance = new Unsafe();
|
||||
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() {}
|
||||
|
||||
|
@ -63,10 +54,7 @@ public final class Unsafe
|
|||
|
||||
public int fieldOffset(Field original)
|
||||
{
|
||||
Field copy = factory.copyField(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));
|
||||
Field copy = ReflectHelper.copyFieldAndMakeAccessible(original);
|
||||
synchronized(fields)
|
||||
{
|
||||
int id = fields.size();
|
||||
|
|
Загрузка…
Ссылка в новой задаче