Ignore:
Timestamp:
09/20/12 21:13:06 (8 years ago)
Author:
BegemoT
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Tests/JAVA/test/src/main/java/test/threads/queue/unstressed/impl/CABSESDMaskedUnrolledQueue.java

    r545 r564  
    2828 */ 
    2929public final class CABSESDMaskedUnrolledQueue<T> implements IQueue<T> { 
    30     private static final boolean USE_TEST_AND_SET = true; 
    31     private static final boolean USE_UNSAFE = false; 
     30        private static final boolean USE_TEST_AND_SET = true; 
     31        private static final boolean USE_UNSAFE = Boolean.getBoolean( "use-unsafe" ); 
    3232 
    33     private static final int PADDING_SIZE = 0;//bytes 
    34     private static final int PADDING_SIZE_IN_REFS = PADDING_SIZE / 4;//assume reference=4bytes 
     33        private static final int PADDING_SIZE = 0;//bytes 
     34        private static final int PADDING_SIZE_IN_REFS = PADDING_SIZE / 4;//assume reference=4bytes 
    3535 
    3636 
    37     public volatile long $i01, $i02, $i03, $i04, $i05, $i06, $i07, $i08; 
    38     public volatile long $j01, $j02, $j03, $j04, $j05, $j06, $j07, $j08; 
     37        public volatile long $i01, $i02, $i03, $i04, $i05, $i06, $i07, $i08; 
     38        public volatile long $j01, $j02, $j03, $j04, $j05, $j06, $j07, $j08; 
    3939 
    40     private final T[] elements; 
    41     private final int mask; 
     40        private final T[] elements; 
     41        private final int mask; 
    4242 
    43     public volatile long $k01, $k02, $k03, $k04, $k05, $k06, $k07, $k08; 
    44     public volatile long $l01, $l02, $l03, $l04, $l05, $l06, $l07, $l08; 
     43        public volatile long $k01, $k02, $k03, $k04, $k05, $k06, $k07, $k08; 
     44        public volatile long $l01, $l02, $l03, $l04, $l05, $l06, $l07, $l08; 
    4545 
    46     private final int length; 
     46        private final int length; 
    4747 
    48     public volatile long $a01, $a02, $a03, $a04, $a05, $a06, $a07, $a08; 
    49     public volatile long $b01, $b02, $b03, $b04, $b05, $b06, $b07, $b08; 
    50     public volatile long headCursor = 0; 
    51     public volatile long $c01, $c02, $c03, $c04, $c05, $c06, $c07, $c08; 
    52     public volatile long $d01, $d02, $d03, $d04, $d05, $d06, $d07, $d08; 
     48        public volatile long $a01, $a02, $a03, $a04, $a05, $a06, $a07, $a08; 
     49        public volatile long $b01, $b02, $b03, $b04, $b05, $b06, $b07, $b08; 
     50        public volatile long headCursor = 0; 
     51        public volatile long $c01, $c02, $c03, $c04, $c05, $c06, $c07, $c08; 
     52        public volatile long $d01, $d02, $d03, $d04, $d05, $d06, $d07, $d08; 
    5353 
    54     public volatile long $e01, $e02, $e03, $e04, $e05, $e06, $e07, $e08; 
    55     public volatile long $f01, $f02, $f03, $f04, $f05, $f06, $f07, $f08; 
    56     public volatile long tailCursor = 0; 
    57     public volatile long $g01, $g02, $g03, $g04, $g05, $g06, $g07, $g08; 
    58     public volatile long $h01, $h02, $h03, $h04, $h05, $h06, $h07, $h08; 
     54        public volatile long $e01, $e02, $e03, $e04, $e05, $e06, $e07, $e08; 
     55        public volatile long $f01, $f02, $f03, $f04, $f05, $f06, $f07, $f08; 
     56        public volatile long tailCursor = 0; 
     57        public volatile long $g01, $g02, $g03, $g04, $g05, $g06, $g07, $g08; 
     58        public volatile long $h01, $h02, $h03, $h04, $h05, $h06, $h07, $h08; 
    5959 
    60     private static final AtomicLongFieldUpdater<CABSESDMaskedUnrolledQueue> tailUpdater = AtomicLongFieldUpdater.newUpdater( 
    61             CABSESDMaskedUnrolledQueue.class, 
    62             "tailCursor" 
    63     ); 
    64     private static final AtomicLongFieldUpdater<CABSESDMaskedUnrolledQueue> headUpdater = AtomicLongFieldUpdater.newUpdater( 
    65             CABSESDMaskedUnrolledQueue.class, 
    66             "headCursor" 
    67     ); 
     60        private static final AtomicLongFieldUpdater<CABSESDMaskedUnrolledQueue> tailUpdater = AtomicLongFieldUpdater.newUpdater( 
     61                        CABSESDMaskedUnrolledQueue.class, 
     62                        "tailCursor" 
     63        ); 
     64        private static final AtomicLongFieldUpdater<CABSESDMaskedUnrolledQueue> headUpdater = AtomicLongFieldUpdater.newUpdater( 
     65                        CABSESDMaskedUnrolledQueue.class, 
     66                        "headCursor" 
     67        ); 
    6868 
    69     private static final Unsafe unsafe; 
    70     private static final long headCursorOffset; 
    71     private static final long tailCursorOffset; 
     69        private static final Unsafe unsafe; 
     70        private static final long headCursorOffset; 
     71        private static final long tailCursorOffset; 
    7272 
    73     static { 
    74         unsafe = UnsafeHelper.unsafe(); 
    75         final Class<CABSESDMaskedUnrolledQueue> clazz = CABSESDMaskedUnrolledQueue.class; 
    76         try { 
    77             final Field headCursorField = clazz.getDeclaredField( "headCursor" ); 
    78             final Field tailCursorField = clazz.getDeclaredField( "tailCursor" ); 
    79             headCursorOffset = unsafe.objectFieldOffset( headCursorField ); 
    80             tailCursorOffset = unsafe.objectFieldOffset( tailCursorField ); 
    81         } catch ( NoSuchFieldException e ) { 
    82             throw new RuntimeException( e ); 
    83         } 
    84         System.out.printf( 
    85                 "%s: useUnsafe: %b, useTAS: %b\n", 
    86                 CABSESDMaskedUnrolledQueue.class.getSimpleName(), 
    87                 USE_UNSAFE, 
    88                 USE_TEST_AND_SET 
    89         ); 
    90     } 
     73        static { 
     74                unsafe = UnsafeHelper.unsafe(); 
     75                final Class<CABSESDMaskedUnrolledQueue> clazz = CABSESDMaskedUnrolledQueue.class; 
     76                try { 
     77                        final Field headCursorField = clazz.getDeclaredField( "headCursor" ); 
     78                        final Field tailCursorField = clazz.getDeclaredField( "tailCursor" ); 
     79                        headCursorOffset = unsafe.objectFieldOffset( headCursorField ); 
     80                        tailCursorOffset = unsafe.objectFieldOffset( tailCursorField ); 
     81                } catch( NoSuchFieldException e ) { 
     82                        throw new RuntimeException( e ); 
     83                } 
     84                System.out.printf( 
     85                                "%s: useUnsafe: %b, useTAS: %b\n", 
     86                                CABSESDMaskedUnrolledQueue.class.getSimpleName(), 
     87                                USE_UNSAFE, 
     88                                USE_TEST_AND_SET 
     89                ); 
     90        } 
    9191 
    92     @SuppressWarnings( "unchecked" ) 
    93     public CABSESDMaskedUnrolledQueue( final int size ) { 
    94         if ( Integer.bitCount( size ) != 1 ) { 
    95             throw new IllegalArgumentException( "bufferSize must be a power of 2" ); 
    96         } 
     92        @SuppressWarnings( "unchecked" ) 
     93        public CABSESDMaskedUnrolledQueue( final int size ) { 
     94                if( Integer.bitCount( size ) != 1 ) { 
     95                        throw new IllegalArgumentException( "bufferSize must be a power of 2" ); 
     96                } 
    9797 
    98         length = size; 
    99         mask = size - 1; 
    100         elements = ( T[] ) new Object[size + 2 * PADDING_SIZE_IN_REFS]; 
     98                length = size; 
     99                mask = size - 1; 
     100                elements = ( T[] ) new Object[size + 2 * PADDING_SIZE_IN_REFS]; 
    101101 
    102         preventPaddingElimination(); 
    103     } 
     102                preventPaddingElimination(); 
     103        } 
    104104 
    105     public void enqueue( final T item ) { 
    106         final long tail = tailCursor; 
     105        public void enqueue( final T item ) { 
     106                final long tail = tailCursor; 
    107107 
    108         final long target = tail - length; 
    109         while ( target == headCursor ) { 
     108                final long target = tail - length; 
     109                while( target == headCursor ) { 
    110110 
    111         } 
     111                } 
    112112 
    113         final int index = ( int ) ( tail & mask ) + PADDING_SIZE_IN_REFS; 
    114         if ( USE_TEST_AND_SET ) { 
    115             if ( elements[index] != item ) { 
    116                 elements[index] = item; 
    117             } 
    118         } else { 
    119             elements[index] = item; 
    120         } 
     113                final int index = ( int ) ( tail & mask ) + PADDING_SIZE_IN_REFS; 
     114                if( USE_TEST_AND_SET ) { 
     115                        if( elements[index] != item ) { 
     116                                elements[index] = item; 
     117                        } 
     118                } else { 
     119                        elements[index] = item; 
     120                } 
    121121 
    122         if ( USE_UNSAFE ) { 
    123             unsafe.putOrderedLong( this, tailCursorOffset, tail + 1 ); 
    124         } else { 
    125             tailUpdater.lazySet( this, tail + 1 ); 
    126         } 
    127     } 
     122                if( USE_UNSAFE ) { 
     123                        unsafe.putOrderedLong( this, tailCursorOffset, tail + 1 ); 
     124                } else { 
     125                        tailUpdater.lazySet( this, tail + 1 ); 
     126                } 
     127        } 
    128128 
    129     public T dequeue() { 
    130         final long head = headCursor; 
    131         while ( head == tailCursor ) { 
     129        public T dequeue() { 
     130                final long head = headCursor; 
     131                while( head == tailCursor ) { 
    132132 
    133         } 
     133                } 
    134134 
    135         final int index = ( int ) ( head & mask ) + PADDING_SIZE_IN_REFS; 
    136         final T item = elements[index]; 
     135                final int index = ( int ) ( head & mask ) + PADDING_SIZE_IN_REFS; 
     136                final T item = elements[index]; 
    137137 
    138         if ( USE_UNSAFE ) { 
    139             unsafe.putOrderedLong( this, headCursorOffset, head + 1 ); 
    140         } else { 
    141             headUpdater.lazySet( this, head + 1 ); 
    142         } 
    143         return item; 
    144     } 
     138                if( USE_UNSAFE ) { 
     139                        unsafe.putOrderedLong( this, headCursorOffset, head + 1 ); 
     140                } else { 
     141                        headUpdater.lazySet( this, head + 1 ); 
     142                } 
     143                return item; 
     144        } 
    145145 
    146     @Override 
    147     public int size() { 
    148         return ( int ) ( tailCursor - headCursor ); 
    149     } 
     146        @Override 
     147        public int size() { 
     148                return ( int ) ( tailCursor - headCursor ); 
     149        } 
    150150 
    151     public long preventPaddingElimination() { 
    152         try { 
    153             final Field[] fields = this.getClass().getFields(); 
    154             long sum = 0; 
    155             for ( final Field field : fields ) { 
    156                 if ( field.getName().startsWith( "$" ) ) { 
    157                     sum += ( ( Number ) field.get( this ) ).longValue(); 
    158                 } 
    159             } 
    160             return sum; 
    161         } catch ( IllegalAccessException e ) { 
    162             throw Throwables.propagate( e ); 
    163         } 
    164     } 
     151        public long preventPaddingElimination() { 
     152                try { 
     153                        final Field[] fields = this.getClass().getFields(); 
     154                        long sum = 0; 
     155                        for( final Field field : fields ) { 
     156                                if( field.getName().startsWith( "$" ) ) { 
     157                                        sum += ( ( Number ) field.get( this ) ).longValue(); 
     158                                } 
     159                        } 
     160                        return sum; 
     161                } catch( IllegalAccessException e ) { 
     162                        throw Throwables.propagate( e ); 
     163                } 
     164        } 
    165165 
    166     @SuppressWarnings( "unchecked" ) 
    167     public static <T> IBoundedQueueFactory<T, CABSESDMaskedQueue<T>> factory() { 
    168         return FACTORY; 
    169     } 
     166        @SuppressWarnings( "unchecked" ) 
     167        public static <T> IBoundedQueueFactory<T, CABSESDMaskedQueue<T>> factory() { 
     168                return FACTORY; 
     169        } 
    170170 
    171     public static final IBoundedQueueFactory FACTORY = new IBoundedQueueFactory<Object, CABSESDMaskedUnrolledQueue<Object>>() { 
    172         @Override 
    173         public CABSESDMaskedUnrolledQueue<Object> create( final int size ) { 
    174             return new CABSESDMaskedUnrolledQueue<Object>( size ); 
    175         } 
     171        public static final IBoundedQueueFactory FACTORY = new IBoundedQueueFactory<Object, CABSESDMaskedUnrolledQueue<Object>>() { 
     172                @Override 
     173                public CABSESDMaskedUnrolledQueue<Object> create( final int size ) { 
     174                        return new CABSESDMaskedUnrolledQueue<Object>( size ); 
     175                } 
    176176 
    177         @Override 
    178         public String toString() { 
    179             return "CABSESDMaskedQueueUnrolledFactory[TAS=" + USE_TEST_AND_SET + "][unsafe=" + USE_UNSAFE + "]"; 
    180         } 
    181     }; 
     177                @Override 
     178                public String toString() { 
     179                        return "CABSESDMaskedQueueUnrolledFactory[TAS=" + USE_TEST_AND_SET + "][unsafe=" + USE_UNSAFE + "]"; 
     180                } 
     181        }; 
    182182 
    183183} 
Note: See TracChangeset for help on using the changeset viewer.