- 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:
jfrijters 2007-06-29 08:48:22 +00:00
Родитель 506e7a6584
Коммит 42d9acd333
4 изменённых файлов: 2242 добавлений и 15 удалений

Просмотреть файл

@ -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&amp;;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&amp;;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&amp;;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&amp;;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();