~ubuntu-branches/ubuntu/trusty/monodevelop/trusty-proposed

« back to all changes in this revision

Viewing changes to external/ikvm/classpath/java/util/concurrent/atomic/AtomicReferenceArray.java

  • Committer: Package Import Robot
  • Author(s): Jo Shields
  • Date: 2013-05-12 09:46:03 UTC
  • mto: This revision was merged to the branch mainline in revision 29.
  • Revision ID: package-import@ubuntu.com-20130512094603-mad323bzcxvmcam0
Tags: upstream-4.0.5+dfsg
ImportĀ upstreamĀ versionĀ 4.0.5+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 
3
 *
 
4
 * This code is free software; you can redistribute it and/or modify it
 
5
 * under the terms of the GNU General Public License version 2 only, as
 
6
 * published by the Free Software Foundation.  Oracle designates this
 
7
 * particular file as subject to the "Classpath" exception as provided
 
8
 * by Oracle in the LICENSE file that accompanied this code.
 
9
 *
 
10
 * This code is distributed in the hope that it will be useful, but WITHOUT
 
11
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 
12
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 
13
 * version 2 for more details (a copy is included in the LICENSE file that
 
14
 * accompanied this code).
 
15
 *
 
16
 * You should have received a copy of the GNU General Public License version
 
17
 * 2 along with this work; if not, write to the Free Software Foundation,
 
18
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 
19
 *
 
20
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 
21
 * or visit www.oracle.com if you need additional information or have any
 
22
 * questions.
 
23
 */
 
24
 
 
25
/*
 
26
 * This file is available under and governed by the GNU General Public
 
27
 * License version 2 only, as published by the Free Software Foundation.
 
28
 * However, the following notice accompanied the original version of this
 
29
 * file:
 
30
 *
 
31
 * Written by Doug Lea with assistance from members of JCP JSR-166
 
32
 * Expert Group and released to the public domain, as explained at
 
33
 * http://creativecommons.org/publicdomain/zero/1.0/
 
34
 */
 
35
 
 
36
package java.util.concurrent.atomic;
 
37
 
 
38
import java.lang.reflect.Array;
 
39
import java.util.Arrays;
 
40
import sun.misc.Unsafe;
 
41
 
 
42
/**
 
43
 * An array of object references in which elements may be updated
 
44
 * atomically.  See the {@link java.util.concurrent.atomic} package
 
45
 * specification for description of the properties of atomic
 
46
 * variables.
 
47
 * @since 1.5
 
48
 * @author Doug Lea
 
49
 * @param <E> The base class of elements held in this array
 
50
 */
 
51
public class AtomicReferenceArray<E> implements java.io.Serializable {
 
52
    private static final long serialVersionUID = -6209656149925076980L;
 
53
 
 
54
    private static final Unsafe unsafe;
 
55
    private static final long arrayFieldOffset;
 
56
    private final Object[] array; // must have exact type Object[]
 
57
 
 
58
    static {
 
59
        try {
 
60
            unsafe = Unsafe.getUnsafe();
 
61
            arrayFieldOffset = unsafe.objectFieldOffset
 
62
                (AtomicReferenceArray.class.getDeclaredField("array"));
 
63
        } catch (Exception e) {
 
64
            throw new Error(e);
 
65
        }
 
66
    }
 
67
 
 
68
    /**
 
69
     * Creates a new AtomicReferenceArray of the given length, with all
 
70
     * elements initially null.
 
71
     *
 
72
     * @param length the length of the array
 
73
     */
 
74
    public AtomicReferenceArray(int length) {
 
75
        array = new Object[length];
 
76
    }
 
77
 
 
78
    /**
 
79
     * Creates a new AtomicReferenceArray with the same length as, and
 
80
     * all elements copied from, the given array.
 
81
     *
 
82
     * @param array the array to copy elements from
 
83
     * @throws NullPointerException if array is null
 
84
     */
 
85
    public AtomicReferenceArray(E[] array) {
 
86
        // Visibility guaranteed by final field guarantees
 
87
        this.array = Arrays.copyOf(array, array.length, Object[].class);
 
88
    }
 
89
 
 
90
    /**
 
91
     * Returns the length of the array.
 
92
     *
 
93
     * @return the length of the array
 
94
     */
 
95
    public final int length() {
 
96
        return array.length;
 
97
    }
 
98
 
 
99
    /**
 
100
     * Gets the current value at position {@code i}.
 
101
     *
 
102
     * @param i the index
 
103
     * @return the current value
 
104
     */
 
105
    public final native E get(int i);
 
106
 
 
107
    /**
 
108
     * Sets the element at position {@code i} to the given value.
 
109
     *
 
110
     * @param i the index
 
111
     * @param newValue the new value
 
112
     */
 
113
    public final native void set(int i, E newValue);
 
114
 
 
115
    /**
 
116
     * Eventually sets the element at position {@code i} to the given value.
 
117
     *
 
118
     * @param i the index
 
119
     * @param newValue the new value
 
120
     * @since 1.6
 
121
     */
 
122
    public final void lazySet(int i, E newValue) {
 
123
        set(i, newValue);
 
124
    }
 
125
 
 
126
 
 
127
    /**
 
128
     * Atomically sets the element at position {@code i} to the given
 
129
     * value and returns the old value.
 
130
     *
 
131
     * @param i the index
 
132
     * @param newValue the new value
 
133
     * @return the previous value
 
134
     */
 
135
    public final E getAndSet(int i, E newValue) {
 
136
        while (true) {
 
137
            E current = get(i);
 
138
            if (compareAndSet(i, current, newValue))
 
139
                return current;
 
140
        }
 
141
    }
 
142
 
 
143
    /**
 
144
     * Atomically sets the element at position {@code i} to the given
 
145
     * updated value if the current value {@code ==} the expected value.
 
146
     *
 
147
     * @param i the index
 
148
     * @param expect the expected value
 
149
     * @param update the new value
 
150
     * @return true if successful. False return indicates that
 
151
     * the actual value was not equal to the expected value.
 
152
     */
 
153
    public final native boolean compareAndSet(int i, E expect, E update);
 
154
 
 
155
    /**
 
156
     * Atomically sets the element at position {@code i} to the given
 
157
     * updated value if the current value {@code ==} the expected value.
 
158
     *
 
159
     * <p>May <a href="package-summary.html#Spurious">fail spuriously</a>
 
160
     * and does not provide ordering guarantees, so is only rarely an
 
161
     * appropriate alternative to {@code compareAndSet}.
 
162
     *
 
163
     * @param i the index
 
164
     * @param expect the expected value
 
165
     * @param update the new value
 
166
     * @return true if successful.
 
167
     */
 
168
    public final boolean weakCompareAndSet(int i, E expect, E update) {
 
169
        return compareAndSet(i, expect, update);
 
170
    }
 
171
 
 
172
    /**
 
173
     * Returns the String representation of the current values of array.
 
174
     * @return the String representation of the current values of array
 
175
     */
 
176
    public String toString() {
 
177
        int iMax = array.length - 1;
 
178
        if (iMax == -1)
 
179
            return "[]";
 
180
 
 
181
        StringBuilder b = new StringBuilder();
 
182
        b.append('[');
 
183
        for (int i = 0; ; i++) {
 
184
            b.append(get(i));
 
185
            if (i == iMax)
 
186
                return b.append(']').toString();
 
187
            b.append(',').append(' ');
 
188
        }
 
189
    }
 
190
 
 
191
    /**
 
192
     * Reconstitutes the instance from a stream (that is, deserializes it).
 
193
     * @param s the stream
 
194
     */
 
195
    private void readObject(java.io.ObjectInputStream s)
 
196
        throws java.io.IOException, ClassNotFoundException {
 
197
        // Note: This must be changed if any additional fields are defined
 
198
        Object a = s.readFields().get("array", null);
 
199
        if (a == null || !a.getClass().isArray())
 
200
            throw new java.io.InvalidObjectException("Not array type");
 
201
        if (a.getClass() != Object[].class)
 
202
            a = Arrays.copyOf((Object[])a, Array.getLength(a), Object[].class);
 
203
        unsafe.putObjectVolatile(this, arrayFieldOffset, a);
 
204
    }
 
205
 
 
206
}