1 /*
2 * Copyright 2009 Red Hat, Inc.
3 *
4 * Red Hat licenses this file to you under the Apache License, version 2.0
5 * (the "License"); you may not use this file except in compliance with the
6 * License. You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations
14 * under the License.
15 */
16 package org.jboss.netty.util.internal;
17
18 import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
19 import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
20
21 /**
22 * @author <a href="http://www.jboss.org/netty/">The Netty Project</a>
23 * @author <a href="http://gleamynode.net/">Trustin Lee</a>
24 * @version $Rev: 2080 $, $Date: 2010-01-26 18:04:19 +0900 (Tue, 26 Jan 2010) $
25 */
26 class AtomicFieldUpdaterUtil {
27
28 private static final boolean AVAILABLE;
29
30 static final class Node {
31 volatile Node next;
32 Node() {
33 super();
34 }
35 }
36
37 static {
38 boolean available = false;
39 try {
40 AtomicReferenceFieldUpdater<Node, Node> tmp =
41 AtomicReferenceFieldUpdater.newUpdater(
42 Node.class, Node.class, "next");
43
44 // Test if AtomicReferenceFieldUpdater is really working.
45 Node testNode = new Node();
46 tmp.set(testNode, testNode);
47 if (testNode.next != testNode) {
48 // Not set as expected - fall back to the safe mode.
49 throw new Exception();
50 }
51 available = true;
52 } catch (Throwable t) {
53 // Running in a restricted environment with a security manager.
54 }
55 AVAILABLE = available;
56 }
57
58 static <T, V> AtomicReferenceFieldUpdater<T,V> newRefUpdater(Class<T> tclass, Class<V> vclass, String fieldName) {
59 if (AVAILABLE) {
60 return AtomicReferenceFieldUpdater.newUpdater(tclass, vclass, fieldName);
61 } else {
62 return null;
63 }
64 }
65
66 static <T> AtomicIntegerFieldUpdater<T> newIntUpdater(Class<T> tclass, String fieldName) {
67 if (AVAILABLE) {
68 return AtomicIntegerFieldUpdater.newUpdater(tclass, fieldName);
69 } else {
70 return null;
71 }
72 }
73
74 static boolean isAvailable() {
75 return AVAILABLE;
76 }
77
78 private AtomicFieldUpdaterUtil() {
79 // Unused
80 }
81 }