ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/jsr166y/LinkedTransferQueue.java
(Generate patch)

Comparing jsr166/src/jsr166y/LinkedTransferQueue.java (file contents):
Revision 1.25 by jsr166, Fri Jul 24 23:48:26 2009 UTC vs.
Revision 1.28 by jsr166, Sun Jul 26 17:33:37 2009 UTC

# Line 5 | Line 5
5   */
6  
7   package jsr166y;
8 +
9   import java.util.concurrent.*;
10 < import java.util.concurrent.locks.*;
11 < import java.util.concurrent.atomic.*;
12 < import java.util.*;
13 < import java.io.*;
10 >
11 > import java.util.AbstractQueue;
12 > import java.util.Collection;
13 > import java.util.Iterator;
14 > import java.util.NoSuchElementException;
15 > import java.util.concurrent.locks.LockSupport;
16 > import java.util.concurrent.atomic.AtomicReference;
17 > import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
18  
19   /**
20   * An unbounded {@linkplain TransferQueue} based on linked nodes.
# Line 794 | Line 799 | public class LinkedTransferQueue<E> exte
799                                   new PaddedAtomicReference<Node<E>>(null));
800      }
801  
802 <    // Unsafe mechanics for jsr166y 3rd party package.
802 >    // Unsafe mechanics
803 >
804 >    private static final sun.misc.Unsafe UNSAFE = getUnsafe();
805 >    private static final long headOffset =
806 >        objectFieldOffset("head", LinkedTransferQueue.class);
807 >    private static final long tailOffset =
808 >        objectFieldOffset("tail", LinkedTransferQueue.class);
809 >    private static final long cleanMeOffset =
810 >        objectFieldOffset("cleanMe", LinkedTransferQueue.class);
811 >
812 >    private static long objectFieldOffset(String field, Class<?> klazz) {
813 >        try {
814 >            return UNSAFE.objectFieldOffset(klazz.getDeclaredField(field));
815 >        } catch (NoSuchFieldException e) {
816 >            // Convert Exception to corresponding Error
817 >            NoSuchFieldError error = new NoSuchFieldError(field);
818 >            error.initCause(e);
819 >            throw error;
820 >        }
821 >    }
822 >
823 >    /**
824 >     * Returns a sun.misc.Unsafe.  Suitable for use in a 3rd party package.
825 >     * Replace with a simple call to Unsafe.getUnsafe when integrating
826 >     * into a jdk.
827 >     *
828 >     * @return a sun.misc.Unsafe
829 >     */
830      private static sun.misc.Unsafe getUnsafe() {
831          try {
832              return sun.misc.Unsafe.getUnsafe();
833          } catch (SecurityException se) {
834              try {
835                  return java.security.AccessController.doPrivileged
836 <                    (new java.security.PrivilegedExceptionAction<sun.misc.Unsafe>() {
836 >                    (new java.security
837 >                     .PrivilegedExceptionAction<sun.misc.Unsafe>() {
838                          public sun.misc.Unsafe run() throws Exception {
839 <                            return getUnsafeByReflection();
839 >                            java.lang.reflect.Field f = sun.misc
840 >                                .Unsafe.class.getDeclaredField("theUnsafe");
841 >                            f.setAccessible(true);
842 >                            return (sun.misc.Unsafe) f.get(null);
843                          }});
844              } catch (java.security.PrivilegedActionException e) {
845                  throw new RuntimeException("Could not initialize intrinsics",
# Line 811 | Line 847 | public class LinkedTransferQueue<E> exte
847              }
848          }
849      }
814
815    private static sun.misc.Unsafe getUnsafeByReflection()
816            throws NoSuchFieldException, IllegalAccessException {
817        java.lang.reflect.Field f =
818            sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
819        f.setAccessible(true);
820        return (sun.misc.Unsafe) f.get(null);
821    }
822
823    private static long fieldOffset(String fieldName, Class<?> klazz) {
824        try {
825            return UNSAFE.objectFieldOffset(klazz.getDeclaredField(fieldName));
826        } catch (NoSuchFieldException e) {
827            // Convert Exception to Error
828            NoSuchFieldError error = new NoSuchFieldError(fieldName);
829            error.initCause(e);
830            throw error;
831        }
832    }
833
834    private static final sun.misc.Unsafe UNSAFE = getUnsafe();
835    static final long headOffset =
836        fieldOffset("head", LinkedTransferQueue.class);
837    static final long tailOffset =
838        fieldOffset("tail", LinkedTransferQueue.class);
839    static final long cleanMeOffset =
840        fieldOffset("cleanMe", LinkedTransferQueue.class);
841
850   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines