提交 503c18aa 编写于 作者: L lana

Merge

......@@ -38,7 +38,7 @@ FILES_java = \
com/sun/nio/sctp/SctpMultiChannel.java \
com/sun/nio/sctp/SctpServerChannel.java \
com/sun/nio/sctp/SctpSocketOption.java \
com/sun/nio/sctp/SctpStandardSocketOption.java \
com/sun/nio/sctp/SctpStandardSocketOptions.java \
com/sun/nio/sctp/SendFailedNotification.java \
com/sun/nio/sctp/ShutdownNotification.java \
\
......
......@@ -49,6 +49,7 @@ SUNWprivate_1.1 {
Java_sun_management_Flag_setStringValue;
Java_sun_management_GarbageCollectorImpl_getCollectionCount;
Java_sun_management_GarbageCollectorImpl_getCollectionTime;
Java_sun_management_GarbageCollectorImpl_setNotificationEnabled;
Java_sun_management_GcInfoBuilder_fillGcAttributeInfo;
Java_sun_management_GcInfoBuilder_getLastGcInfo0;
Java_sun_management_GcInfoBuilder_getNumGcExtAttributes;
......
......@@ -71,7 +71,7 @@ FILES_src = \
java/nio/charset/CoderMalfunctionError.java \
java/nio/charset/CodingErrorAction.java \
java/nio/charset/MalformedInputException.java \
java/nio/charset/StandardCharset.java \
java/nio/charset/StandardCharsets.java \
java/nio/charset/UnmappableCharacterException.java \
\
java/nio/charset/spi/CharsetProvider.java \
......@@ -116,7 +116,7 @@ FILES_src = \
java/nio/file/SimpleFileVisitor.java \
java/nio/file/StandardCopyOption.java \
java/nio/file/StandardOpenOption.java \
java/nio/file/StandardWatchEventKind.java \
java/nio/file/StandardWatchEventKinds.java \
java/nio/file/TempFileHelper.java \
java/nio/file/WatchEvent.java \
java/nio/file/WatchKey.java \
......
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.management;
import javax.management.Notification;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataView;
import javax.management.openmbean.CompositeType;
import java.util.Collection;
import java.util.Collections;
import sun.management.GarbageCollectionNotifInfoCompositeData;
/**
* The information about a garbage collection
*
* <p>
* A garbage collection notification is emitted by {@link GarbageCollectorMXBean}
* when the Java virtual machine completes a garbage collection action
* The notification emitted will contain the garbage collection notification
* information about the status of the memory:
* <u1>
* <li>The name of the garbage collector used perform the collection.</li>
* <li>The action performed by the garbage collector.</li>
* <li>The cause of the garbage collection action.</li>
* <li>A {@link GcInfo} object containing some statistics about the GC cycle
(start time, end time) and the memory usage before and after
the GC cycle.</li>
* </u1>
*
* <p>
* A {@link CompositeData CompositeData} representing
* the {@code GarbageCollectionNotificationInfo} object
* is stored in the
* {@linkplain javax.management.Notification#setUserData userdata}
* of a {@linkplain javax.management.Notification notification}.
* The {@link #from from} method is provided to convert from
* a {@code CompositeData} to a {@code GarbageCollectionNotificationInfo}
* object. For example:
*
* <blockquote><pre>
* Notification notif;
*
* // receive the notification emitted by a GarbageCollectorMXBean and set to notif
* ...
*
* String notifType = notif.getType();
* if (notifType.equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) {
* // retrieve the garbage collection notification information
* CompositeData cd = (CompositeData) notif.getUserData();
* GarbageCollectionNotificationInfo info = GarbageCollectionNotificationInfo.from(cd);
* ....
* }
* </pre></blockquote>
*
* <p>
* The type of the notification emitted by a {@code GarbageCollectorMXBean} is:
* <ul>
* <li>A {@linkplain #GARBAGE_COLLECTION_NOTIFICATION garbage collection notification}.
* <br>Used by every notification emitted by the garbage collector, the details about
* the notification are provided in the {@linkplain #getGcAction action} String
* <p></li>
* </ul>
**/
public class GarbageCollectionNotificationInfo implements CompositeDataView {
private final String gcName;
private final String gcAction;
private final String gcCause;
private final GcInfo gcInfo;
private final CompositeData cdata;
/**
* Notification type denoting that
* the Java virtual machine has completed a garbage collection cycle.
* This notification is emitted by a {@link GarbageCollectorMXBean}.
* The value of this notification type is
* {@code com.sun.management.gc.notification}.
*/
public static final String GARBAGE_COLLECTION_NOTIFICATION =
"com.sun.management.gc.notification";
/**
* Constructs a {@code GarbageCollectionNotificationInfo} object.
*
* @param gcName The name of the garbage collector used to perform the collection
* @param gcAction The name of the action performed by the garbage collector
* @param gcCause The cause the garbage collection action
* @param gcInfo a GcInfo object providing statistics about the GC cycle
*/
public GarbageCollectionNotificationInfo(String gcName,
String gcAction,
String gcCause,
GcInfo gcInfo) {
if (gcName == null) {
throw new NullPointerException("Null gcName");
}
if (gcAction == null) {
throw new NullPointerException("Null gcAction");
}
if (gcCause == null) {
throw new NullPointerException("Null gcCause");
}
this.gcName = gcName;
this.gcAction = gcAction;
this.gcCause = gcCause;
this.gcInfo = gcInfo;
this.cdata = new GarbageCollectionNotifInfoCompositeData(this);
}
GarbageCollectionNotificationInfo(CompositeData cd) {
GarbageCollectionNotifInfoCompositeData.validateCompositeData(cd);
this.gcName = GarbageCollectionNotifInfoCompositeData.getGcName(cd);
this.gcAction = GarbageCollectionNotifInfoCompositeData.getGcAction(cd);
this.gcCause = GarbageCollectionNotifInfoCompositeData.getGcCause(cd);
this.gcInfo = GarbageCollectionNotifInfoCompositeData.getGcInfo(cd);
this.cdata = cd;
}
/**
* Returns the name of the garbage collector used to perform the collection
*
* @return the name of the garbage collector used to perform the collection
*/
public String getGcName() {
return gcName;
}
/**
* Returns the action of the performed by the garbage collector
*
* @return the the action of the performed by the garbage collector
*/
public String getGcAction() {
return gcAction;
}
/**
* Returns the cause the garbage collection
*
* @return the the cause the garbage collection
*/
public String getGcCause() {
return gcCause;
}
/**
* Returns the GC information related to the last garbage collection
*
* @return the GC information related to the
* last garbage collection
*/
public GcInfo getGcInfo() {
return gcInfo;
}
/**
* Returns a {@code GarbageCollectionNotificationInfo} object represented by the
* given {@code CompositeData}.
* The given {@code CompositeData} must contain
* the following attributes:
* <blockquote>
* <table border>
* <tr>
* <th align=left>Attribute Name</th>
* <th align=left>Type</th>
* </tr>
* <tr>
* <td>gcName</td>
* <td>{@code java.lang.String}</td>
* </tr>
* <tr>
* <td>gcAction</td>
* <td>{@code java.lang.String}</td>
* </tr>
* <tr>
* <td>gcCause</td>
* <td>{@code java.lang.String}</td>
* </tr>
* <tr>
* <td>gcInfo</td>
* <td>{@code javax.management.openmbean.CompositeData}</td>
* </tr>
* </table>
* </blockquote>
*
* @param cd {@code CompositeData} representing a
* {@code GarbageCollectionNotificationInfo}
*
* @throws IllegalArgumentException if {@code cd} does not
* represent a {@code GarbaageCollectionNotificationInfo} object.
*
* @return a {@code GarbageCollectionNotificationInfo} object represented
* by {@code cd} if {@code cd} is not {@code null};
* {@code null} otherwise.
*/
public static GarbageCollectionNotificationInfo from(CompositeData cd) {
if (cd == null) {
return null;
}
if (cd instanceof GarbageCollectionNotifInfoCompositeData) {
return ((GarbageCollectionNotifInfoCompositeData) cd).getGarbageCollectionNotifInfo();
} else {
return new GarbageCollectionNotificationInfo(cd);
}
}
public CompositeData toCompositeData(CompositeType ct) {
return cdata;
}
}
......@@ -179,7 +179,7 @@ public abstract class MessageInfo {
* completely received. For messages being sent {@code true} indicates that
* the message is complete, {@code false} indicates that the message is not
* complete. How the send channel interprets this value depends on the value
* of its {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE
* of its {@link SctpStandardSocketOptions#SCTP_EXPLICIT_COMPLETE
* SCTP_EXPLICIT_COMPLETE} socket option.
*
* @return {@code true} if, and only if, the message is complete
......@@ -192,7 +192,7 @@ public abstract class MessageInfo {
* <P> For messages being sent {@code true} indicates that
* the message is complete, {@code false} indicates that the message is not
* complete. How the send channel interprets this value depends on the value
* of its {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE
* of its {@link SctpStandardSocketOptions#SCTP_EXPLICIT_COMPLETE
* SCTP_EXPLICIT_COMPLETE} socket option.
*
* @param complete
......
......@@ -65,55 +65,55 @@ import java.nio.channels.SelectionKey;
* <th>Description</th>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_DISABLE_FRAGMENTS
* <td> {@link SctpStandardSocketOptions#SCTP_DISABLE_FRAGMENTS
* SCTP_DISABLE_FRAGMENTS} </td>
* <td> Enables or disables message fragmentation </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE
* <td> {@link SctpStandardSocketOptions#SCTP_EXPLICIT_COMPLETE
* SCTP_EXPLICIT_COMPLETE} </td>
* <td> Enables or disables explicit message completion </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE
* <td> {@link SctpStandardSocketOptions#SCTP_FRAGMENT_INTERLEAVE
* SCTP_FRAGMENT_INTERLEAVE} </td>
* <td> Controls how the presentation of messages occur for the message
* receiver </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS
* <td> {@link SctpStandardSocketOptions#SCTP_INIT_MAXSTREAMS
* SCTP_INIT_MAXSTREAMS} </td>
* <td> The maximum number of streams requested by the local endpoint during
* association initialization </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_NODELAY SCTP_NODELAY} </td>
* <td> {@link SctpStandardSocketOptions#SCTP_NODELAY SCTP_NODELAY} </td>
* <td> Enables or disable a Nagle-like algorithm </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_PRIMARY_ADDR
* <td> {@link SctpStandardSocketOptions#SCTP_PRIMARY_ADDR
* SCTP_PRIMARY_ADDR} </td>
* <td> Requests that the local SCTP stack use the given peer address as the
* association primary </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_SET_PEER_PRIMARY_ADDR
* <td> {@link SctpStandardSocketOptions#SCTP_SET_PEER_PRIMARY_ADDR
* SCTP_SET_PEER_PRIMARY_ADDR} </td>
* <td> Requests that the peer mark the enclosed address as the association
* primary </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SO_SNDBUF
* <td> {@link SctpStandardSocketOptions#SO_SNDBUF
* SO_SNDBUF} </td>
* <td> The size of the socket send buffer </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SO_RCVBUF
* <td> {@link SctpStandardSocketOptions#SO_RCVBUF
* SO_RCVBUF} </td>
* <td> The size of the socket receive buffer </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SO_LINGER
* <td> {@link SctpStandardSocketOptions#SO_LINGER
* SO_LINGER} </td>
* <td> Linger on close if data is present (when configured in blocking mode
* only) </td>
......@@ -449,7 +449,7 @@ public abstract class SctpChannel
* <P> This is a convience method and is equivalent to evaluating the
* following expression:
* <blockquote><pre>
* setOption(SctpStandardSocketOption.SCTP_INIT_MAXSTREAMS, SctpStandardSocketOption.InitMaxStreams.create(maxInStreams, maxOutStreams))
* setOption(SctpStandardSocketOptions.SCTP_INIT_MAXSTREAMS, SctpStandardSocketOption.InitMaxStreams.create(maxInStreams, maxOutStreams))
* .connect(remote);
* </pre></blockquote>
*
......@@ -651,7 +651,7 @@ public abstract class SctpChannel
* @throws IOException
* If an I/O error occurs
*
* @see SctpStandardSocketOption
* @see SctpStandardSocketOptions
*/
public abstract <T> T getOption(SctpSocketOption<T> name)
throws IOException;
......@@ -680,7 +680,7 @@ public abstract class SctpChannel
* @throws IOException
* If an I/O error occurs
*
* @see SctpStandardSocketOption
* @see SctpStandardSocketOptions
*/
public abstract <T> SctpChannel setOption(SctpSocketOption<T> name, T value)
throws IOException;
......@@ -731,7 +731,7 @@ public abstract class SctpChannel
* MessageInfo} will return {@code false}, and more invocations of this
* method will be necessary to completely consume the messgae. Only
* one message at a time will be partially delivered in any stream. The
* socket option {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE
* socket option {@link SctpStandardSocketOptions#SCTP_FRAGMENT_INTERLEAVE
* SCTP_FRAGMENT_INTERLEAVE} controls various aspects of what interlacing of
* messages occurs.
*
......@@ -804,7 +804,7 @@ public abstract class SctpChannel
* and sufficient room becomes available, then the remaining bytes in the
* given byte buffer are transmitted as a single message. Sending a message
* is atomic unless explicit message completion {@link
* SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}
* SctpStandardSocketOptions#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}
* socket option is enabled on this channel's socket.
*
* <P> The message is transferred from the byte buffer as if by a regular
......
......@@ -69,55 +69,55 @@ import java.nio.channels.SelectionKey;
* <th>Description</th>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_DISABLE_FRAGMENTS
* <td> {@link SctpStandardSocketOptions#SCTP_DISABLE_FRAGMENTS
* SCTP_DISABLE_FRAGMENTS} </td>
* <td> Enables or disables message fragmentation </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE
* <td> {@link SctpStandardSocketOptions#SCTP_EXPLICIT_COMPLETE
* SCTP_EXPLICIT_COMPLETE} </td>
* <td> Enables or disables explicit message completion </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE
* <td> {@link SctpStandardSocketOptions#SCTP_FRAGMENT_INTERLEAVE
* SCTP_FRAGMENT_INTERLEAVE} </td>
* <td> Controls how the presentation of messages occur for the message
* receiver </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS
* <td> {@link SctpStandardSocketOptions#SCTP_INIT_MAXSTREAMS
* SCTP_INIT_MAXSTREAMS} </td>
* <td> The maximum number of streams requested by the local endpoint during
* association initialization </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_NODELAY SCTP_NODELAY} </td>
* <td> {@link SctpStandardSocketOptions#SCTP_NODELAY SCTP_NODELAY} </td>
* <td> Enables or disable a Nagle-like algorithm </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_PRIMARY_ADDR
* <td> {@link SctpStandardSocketOptions#SCTP_PRIMARY_ADDR
* SCTP_PRIMARY_ADDR} </td>
* <td> Requests that the local SCTP stack use the given peer address as the
* association primary </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_SET_PEER_PRIMARY_ADDR
* <td> {@link SctpStandardSocketOptions#SCTP_SET_PEER_PRIMARY_ADDR
* SCTP_SET_PEER_PRIMARY_ADDR} </td>
* <td> Requests that the peer mark the enclosed address as the association
* primary </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SO_SNDBUF
* <td> {@link SctpStandardSocketOptions#SO_SNDBUF
* SO_SNDBUF} </td>
* <td> The size of the socket send buffer </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SO_RCVBUF
* <td> {@link SctpStandardSocketOptions#SO_RCVBUF
* SO_RCVBUF} </td>
* <td> The size of the socket receive buffer </td>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SO_LINGER
* <td> {@link SctpStandardSocketOptions#SO_LINGER
* SO_LINGER} </td>
* <td> Linger on close if data is present (when configured in blocking mode
* only) </td>
......@@ -450,7 +450,7 @@ public abstract class SctpMultiChannel
* @throws IOException
* If an I/O error occurs
*
* @see SctpStandardSocketOption
* @see SctpStandardSocketOptions
*/
public abstract <T> T getOption(SctpSocketOption<T> name,
Association association)
......@@ -489,7 +489,7 @@ public abstract class SctpMultiChannel
* @throws IOException
* If an I/O error occurs
*
* @see SctpStandardSocketOption
* @see SctpStandardSocketOptions
*/
public abstract <T> SctpMultiChannel setOption(SctpSocketOption<T> name,
T value,
......@@ -542,7 +542,7 @@ public abstract class SctpMultiChannel
* MessageInfo} will return {@code false}, and more invocations of this
* method will be necessary to completely consume the messgae. Only
* one message at a time will be partially delivered in any stream. The
* socket option {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE
* socket option {@link SctpStandardSocketOptions#SCTP_FRAGMENT_INTERLEAVE
* SCTP_FRAGMENT_INTERLEAVE} controls various aspects of what interlacing of
* messages occurs.
*
......@@ -635,14 +635,14 @@ public abstract class SctpMultiChannel
* underlying output buffer, then the remaining bytes in the given byte
* buffer are transmitted as a single message. Sending a message
* is atomic unless explicit message completion {@link
* SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}
* SctpStandardSocketOptions#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}
* socket option is enabled on this channel's socket.
*
* <P> If this channel is in non-blocking mode, there is sufficient room
* in the underlying output buffer, and an implicit association setup is
* required, then the remaining bytes in the given byte buffer are
* transmitted as a single message, subject to {@link
* SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}.
* SctpStandardSocketOptions#SCTP_EXPLICIT_COMPLETE SCTP_EXPLICIT_COMPLETE}.
* If for any reason the message cannot
* be delivered an {@link AssociationChangeNotification association
* changed} notification is put on the SCTP stack with its {@code event} parameter set
......
......@@ -53,7 +53,7 @@ import java.nio.channels.spi.AbstractSelectableChannel;
* <th>Description</th>
* </tr>
* <tr>
* <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS
* <td> {@link SctpStandardSocketOptions#SCTP_INIT_MAXSTREAMS
* SCTP_INIT_MAXSTREAMS} </td>
* <td> The maximum number of streams requested by the local endpoint during
* association initialization </td>
......@@ -360,7 +360,7 @@ public abstract class SctpServerChannel
* @throws IOException
* If an I/O error occurs
*
* @see SctpStandardSocketOption
* @see SctpStandardSocketOptions
*/
public abstract <T> T getOption(SctpSocketOption<T> name) throws IOException;
......@@ -388,7 +388,7 @@ public abstract class SctpServerChannel
* @throws IOException
* If an I/O error occurs
*
* @see SctpStandardSocketOption
* @see SctpStandardSocketOptions
*/
public abstract <T> SctpServerChannel setOption(SctpSocketOption<T> name,
T value)
......
......@@ -33,6 +33,6 @@ import java.net.SocketOption;
*
* @since 1.7
*
* @see SctpStandardSocketOption
* @see SctpStandardSocketOptions
*/
public interface SctpSocketOption<T> extends SocketOption<T> { }
......@@ -34,8 +34,8 @@ import sun.nio.ch.SctpStdSocketOption;
*
* @since 1.7
*/
public class SctpStandardSocketOption {
private SctpStandardSocketOption() {}
public class SctpStandardSocketOptions {
private SctpStandardSocketOptions() {}
/**
* Enables or disables message fragmentation.
*
......@@ -127,7 +127,7 @@ public class SctpStandardSocketOption {
* association initialization.
*
* <P> The value of this socket option is an {@link
* SctpStandardSocketOption.InitMaxStreams InitMaxStreams}, that represents
* SctpStandardSocketOptions.InitMaxStreams InitMaxStreams}, that represents
* the maximum number of inbound and outbound streams that an association
* on the channel is prepared to support.
*
......@@ -157,9 +157,9 @@ public class SctpStandardSocketOption {
* the endpoints default value.
*/
public static final SctpSocketOption
<SctpStandardSocketOption.InitMaxStreams> SCTP_INIT_MAXSTREAMS =
new SctpStdSocketOption<SctpStandardSocketOption.InitMaxStreams>(
"SCTP_INIT_MAXSTREAMS", SctpStandardSocketOption.InitMaxStreams.class);
<SctpStandardSocketOptions.InitMaxStreams> SCTP_INIT_MAXSTREAMS =
new SctpStdSocketOption<SctpStandardSocketOptions.InitMaxStreams>(
"SCTP_INIT_MAXSTREAMS", SctpStandardSocketOptions.InitMaxStreams.class);
/**
* Enables or disables a Nagle-like algorithm.
......@@ -310,7 +310,7 @@ public class SctpStandardSocketOption {
* This class is used to set the maximum number of inbound/outbound streams
* used by the local endpoint during association initialization. An
* instance of this class is used to set the {@link
* SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS SCTP_INIT_MAXSTREAMS}
* SctpStandardSocketOptions#SCTP_INIT_MAXSTREAMS SCTP_INIT_MAXSTREAMS}
* socket option.
*
* @since 1.7
......
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -32,7 +32,7 @@ import java.lang.annotation.*;
* constructor does not perform potentially unsafe operations on its
* varargs parameter. Applying this annotation to a method or
* constructor suppresses unchecked warnings about a
* <i>non-reifiable</i> variable-arity (vararg) type and suppresses
* <i>non-reifiable</i> variable arity (vararg) type and suppresses
* unchecked warnings about parameterized array creation at call
* sites.
*
......@@ -41,11 +41,10 @@ import java.lang.annotation.*;
* additional usage restrictions on this annotation type; it is a
* compile-time error if a method or constructor declaration is
* annotated with a {@code @SafeVarargs} annotation, and either:
* <ul>
* <li> the declaration is a fixed-arity method or constructor
* <li> the declaration is a fixed arity method or constructor
*
* <li> the declaration is a variable-arity method that is neither
* <li> the declaration is a variable arity method that is neither
* {@code static} nor {@code final}.
*
* </ul>
......@@ -55,15 +54,28 @@ import java.lang.annotation.*;
*
* <ul>
*
* <li> The variable-arity parameter has a reifiable element type,
* <li> The variable arity parameter has a reifiable element type,
* which includes primitive types, {@code Object}, and {@code String}.
* (The unchecked warnings this annotation type suppresses already do
* not occur for a reifiable element type.)
*
* <li> The body of the method or constructor declaration performs
* potentially unsafe operations, such as an assignment to an element
* of the variable-arity parameter's array that generates an unchecked
* warning.
* of the variable arity parameter's array that generates an unchecked
* warning. Some unsafe operations do not trigger an unchecked
* warning. For example, the aliasing in
*
* <blockquote><pre>
* &#64;SafeVarargs // Not actually safe!
* static void m(List&lt;String&gt;... stringLists) {
* Object[] array = stringLists;
* List&lt;Integer&gt; tmpList = Arrays.asList(42);
* array[0] = tmpList; // Semantically invalid, but compiles without warnings
* String s = stringLists[0].get(0); // Oh no, ClassCastException at runtime!
* }
* </pre></blockquote>
*
* leads to a {@code ClassCastException} at runtime.
*
* <p>Future versions of the platform may mandate compiler errors for
* such unsafe operations.
......
......@@ -336,7 +336,10 @@ public class Throwable implements Serializable {
* Disabling of suppression should only occur in exceptional
* circumstances where special requirements exist, such as a
* virtual machine reusing exception objects under low-memory
* situations.
* situations. Circumstances where a given exception object is
* repeatedly caught and rethrown, such as to implement control
* flow between two sub-systems, is another situation where
* immutable throwable objects would be appropriate.
*
* @param message the detail message.
* @param cause the cause. (A {@code null} value is permitted,
......@@ -423,6 +426,18 @@ public class Throwable implements Serializable {
* {@link #Throwable(String,Throwable)}, this method cannot be called
* even once.
*
* <p>An example of using this method on a legacy throwable type
* without other support for setting the cause is:
*
* <pre>
* try {
* lowLevelOp();
* } catch (LowLevelException le) {
* throw (HighLevelException)
* new HighLevelException().initCause(le); // Legacy constructor
* }
* </pre>
*
* @param cause the cause (which is saved for later retrieval by the
* {@link #getCause()} method). (A {@code null} value is
* permitted, and indicates that the cause is nonexistent or
......@@ -788,7 +803,8 @@ public class Throwable implements Serializable {
* this throwable is permitted to return a zero-length array from this
* method. Generally speaking, the array returned by this method will
* contain one element for every frame that would be printed by
* {@code printStackTrace}.
* {@code printStackTrace}. Writes to the returned array do not
* affect future calls to this method.
*
* @return an array of stack trace elements representing the stack trace
* pertaining to this throwable.
......@@ -971,8 +987,8 @@ public class Throwable implements Serializable {
/**
* Appends the specified exception to the exceptions that were
* suppressed in order to deliver this exception. This method is
* typically called (automatically and implicitly) by the {@code
* try}-with-resources statement.
* thread-safe and typically called (automatically and implicitly)
* by the {@code try}-with-resources statement.
*
* <p>The suppression behavior is enabled <em>unless</em> disabled
* {@linkplain #Throwable(String, Throwable, boolean, boolean) via
......@@ -1043,7 +1059,9 @@ public class Throwable implements Serializable {
*
* If no exceptions were suppressed or {@linkplain
* #Throwable(String, Throwable, boolean, boolean) suppression is
* disabled}, an empty array is returned.
* disabled}, an empty array is returned. This method is
* thread-safe. Writes to the returned array do not affect future
* calls to this method.
*
* @return an array containing all of the exceptions that were
* suppressed to deliver this exception.
......
......@@ -38,7 +38,7 @@ package java.net;
*
* @since 1.7
*
* @see StandardSocketOption
* @see StandardSocketOptions
*/
public interface SocketOption<T> {
......
......@@ -38,8 +38,8 @@ package java.net;
* @since 1.7
*/
public final class StandardSocketOption {
private StandardSocketOption() { }
public final class StandardSocketOptions {
private StandardSocketOptions() { }
// -- SOL_SOCKET --
......
......@@ -58,11 +58,11 @@ import java.io.IOException;
* <th>Description</th>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_RCVBUF SO_RCVBUF} </td>
* <td> {@link java.net.StandardSocketOptions#SO_RCVBUF SO_RCVBUF} </td>
* <td> The size of the socket receive buffer </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_REUSEADDR SO_REUSEADDR} </td>
* <td> {@link java.net.StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} </td>
* <td> Re-use address </td>
* </tr>
* </table>
......
......@@ -68,23 +68,23 @@ import java.nio.ByteBuffer;
* <th>Description</th>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_SNDBUF SO_SNDBUF} </td>
* <td> {@link java.net.StandardSocketOptions#SO_SNDBUF SO_SNDBUF} </td>
* <td> The size of the socket send buffer </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_RCVBUF SO_RCVBUF} </td>
* <td> {@link java.net.StandardSocketOptions#SO_RCVBUF SO_RCVBUF} </td>
* <td> The size of the socket receive buffer </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_KEEPALIVE SO_KEEPALIVE} </td>
* <td> {@link java.net.StandardSocketOptions#SO_KEEPALIVE SO_KEEPALIVE} </td>
* <td> Keep connection alive </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_REUSEADDR SO_REUSEADDR} </td>
* <td> {@link java.net.StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} </td>
* <td> Re-use address </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#TCP_NODELAY TCP_NODELAY} </td>
* <td> {@link java.net.StandardSocketOptions#TCP_NODELAY TCP_NODELAY} </td>
* <td> Disable the Nagle algorithm </td>
* </tr>
* </table>
......
......@@ -63,37 +63,37 @@ import java.nio.channels.spi.SelectorProvider;
* <th>Description</th>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_SNDBUF SO_SNDBUF} </td>
* <td> {@link java.net.StandardSocketOptions#SO_SNDBUF SO_SNDBUF} </td>
* <td> The size of the socket send buffer </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_RCVBUF SO_RCVBUF} </td>
* <td> {@link java.net.StandardSocketOptions#SO_RCVBUF SO_RCVBUF} </td>
* <td> The size of the socket receive buffer </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_REUSEADDR SO_REUSEADDR} </td>
* <td> {@link java.net.StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} </td>
* <td> Re-use address </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_BROADCAST SO_BROADCAST} </td>
* <td> {@link java.net.StandardSocketOptions#SO_BROADCAST SO_BROADCAST} </td>
* <td> Allow transmission of broadcast datagrams </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#IP_TOS IP_TOS} </td>
* <td> {@link java.net.StandardSocketOptions#IP_TOS IP_TOS} </td>
* <td> The Type of Service (ToS) octet in the Internet Protocol (IP) header </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#IP_MULTICAST_IF IP_MULTICAST_IF} </td>
* <td> {@link java.net.StandardSocketOptions#IP_MULTICAST_IF IP_MULTICAST_IF} </td>
* <td> The network interface for Internet Protocol (IP) multicast datagrams </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#IP_MULTICAST_TTL
* <td> {@link java.net.StandardSocketOptions#IP_MULTICAST_TTL
* IP_MULTICAST_TTL} </td>
* <td> The <em>time-to-live</em> for Internet Protocol (IP) multicast
* datagrams </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#IP_MULTICAST_LOOP
* <td> {@link java.net.StandardSocketOptions#IP_MULTICAST_LOOP
* IP_MULTICAST_LOOP} </td>
* <td> Loopback for Internet Protocol (IP) multicast datagrams </td>
* </tr>
......
......@@ -30,7 +30,7 @@ import java.net.NetworkInterface;
import java.io.IOException;
import java.net.ProtocolFamily; // javadoc
import java.net.StandardProtocolFamily; // javadoc
import java.net.StandardSocketOption; // javadoc
import java.net.StandardSocketOptions; // javadoc
/**
* A network channel that supports Internet Protocol (IP) multicasting.
......@@ -93,7 +93,7 @@ import java.net.StandardSocketOption; // javadoc
* a specific address, rather than the wildcard address then it is implementation
* specific if multicast datagrams are received by the socket. </p></li>
*
* <li><p> The {@link StandardSocketOption#SO_REUSEADDR SO_REUSEADDR} option should be
* <li><p> The {@link StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} option should be
* enabled prior to {@link NetworkChannel#bind binding} the socket. This is
* required to allow multiple members of the group to bind to the same
* address. </p></li>
......@@ -107,9 +107,9 @@ import java.net.StandardSocketOption; // javadoc
* NetworkInterface ni = NetworkInterface.getByName("hme0");
*
* DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)
* .setOption(StandardSocketOption.SO_REUSEADDR, true)
* .setOption(StandardSocketOptions.SO_REUSEADDR, true)
* .bind(new InetSocketAddress(5000))
* .setOption(StandardSocketOption.IP_MULTICAST_IF, ni);
* .setOption(StandardSocketOptions.IP_MULTICAST_IF, ni);
*
* InetAddress group = InetAddress.getByName("225.4.5.6");
*
......
......@@ -124,7 +124,7 @@ public interface NetworkChannel
* @throws IOException
* If an I/O error occurs
*
* @see java.net.StandardSocketOption
* @see java.net.StandardSocketOptions
*/
<T> NetworkChannel setOption(SocketOption<T> name, T value) throws IOException;
......@@ -144,7 +144,7 @@ public interface NetworkChannel
* @throws IOException
* If an I/O error occurs
*
* @see java.net.StandardSocketOption
* @see java.net.StandardSocketOptions
*/
<T> T getOption(SocketOption<T> name) throws IOException;
......
......@@ -52,11 +52,11 @@ import java.nio.channels.spi.SelectorProvider;
* <th>Description</th>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_RCVBUF SO_RCVBUF} </td>
* <td> {@link java.net.StandardSocketOptions#SO_RCVBUF SO_RCVBUF} </td>
* <td> The size of the socket receive buffer </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_REUSEADDR SO_REUSEADDR} </td>
* <td> {@link java.net.StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} </td>
* <td> Re-use address </td>
* </tr>
* </table>
......
......@@ -72,28 +72,28 @@ import java.nio.channels.spi.SelectorProvider;
* <th>Description</th>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_SNDBUF SO_SNDBUF} </td>
* <td> {@link java.net.StandardSocketOptions#SO_SNDBUF SO_SNDBUF} </td>
* <td> The size of the socket send buffer </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_RCVBUF SO_RCVBUF} </td>
* <td> {@link java.net.StandardSocketOptions#SO_RCVBUF SO_RCVBUF} </td>
* <td> The size of the socket receive buffer </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_KEEPALIVE SO_KEEPALIVE} </td>
* <td> {@link java.net.StandardSocketOptions#SO_KEEPALIVE SO_KEEPALIVE} </td>
* <td> Keep connection alive </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_REUSEADDR SO_REUSEADDR} </td>
* <td> {@link java.net.StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} </td>
* <td> Re-use address </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#SO_LINGER SO_LINGER} </td>
* <td> {@link java.net.StandardSocketOptions#SO_LINGER SO_LINGER} </td>
* <td> Linger on close if data is present (when configured in blocking mode
* only) </td>
* </tr>
* <tr>
* <td> {@link java.net.StandardSocketOption#TCP_NODELAY TCP_NODELAY} </td>
* <td> {@link java.net.StandardSocketOptions#TCP_NODELAY TCP_NODELAY} </td>
* <td> Disable the Nagle algorithm </td>
* </tr>
* </table>
......
......@@ -215,7 +215,7 @@ import sun.security.action.GetPropertyAction;
* determined during virtual-machine startup and typically depends upon the
* locale and charset being used by the underlying operating system. </p>
*
* <p>The {@link StandardCharset} class defines constants for each of the
* <p>The {@link StandardCharsets} class defines constants for each of the
* standard charsets.
*
* <h4>Terminology</h4>
......
......@@ -32,10 +32,10 @@ package java.nio.charset;
* @see <a href="Charset#standard">Standard Charsets</a>
* @since 1.7
*/
public final class StandardCharset {
public final class StandardCharsets {
private StandardCharset() {
throw new AssertionError("No java.nio.charset.StandardCharset instances for you!");
private StandardCharsets() {
throw new AssertionError("No java.nio.charset.StandardCharsets instances for you!");
}
/**
* Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the
......
......@@ -72,7 +72,7 @@ import java.util.Iterator;
* directory and is UTF-8 encoded.
* <pre>
* Path path = FileSystems.getDefault().getPath("logs", "access.log");
* BufferReader reader = Files.newBufferedReader(path, StandardCharset.UTF_8);
* BufferReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);
* </pre>
*
* <a name="interop"><h4>Interoperability</h4></a>
......@@ -609,11 +609,11 @@ public interface Path
* directory can be watched. The {@code events} parameter is the events to
* register and may contain the following events:
* <ul>
* <li>{@link StandardWatchEventKind#ENTRY_CREATE ENTRY_CREATE} -
* <li>{@link StandardWatchEventKinds#ENTRY_CREATE ENTRY_CREATE} -
* entry created or moved into the directory</li>
* <li>{@link StandardWatchEventKind#ENTRY_DELETE ENTRY_DELETE} -
* <li>{@link StandardWatchEventKinds#ENTRY_DELETE ENTRY_DELETE} -
* entry deleted or moved out of the directory</li>
* <li>{@link StandardWatchEventKind#ENTRY_MODIFY ENTRY_MODIFY} -
* <li>{@link StandardWatchEventKinds#ENTRY_MODIFY ENTRY_MODIFY} -
* entry in directory was modified</li>
* </ul>
*
......@@ -622,7 +622,7 @@ public interface Path
* that locates the directory entry that is created, deleted, or modified.
*
* <p> The set of events may include additional implementation specific
* event that are not defined by the enum {@link StandardWatchEventKind}
* event that are not defined by the enum {@link StandardWatchEventKinds}
*
* <p> The {@code modifiers} parameter specifies <em>modifiers</em> that
* qualify how the directory is registered. This release does not define any
......
......@@ -31,8 +31,8 @@ package java.nio.file;
* @since 1.7
*/
public final class StandardWatchEventKind {
private StandardWatchEventKind() { }
public final class StandardWatchEventKinds {
private StandardWatchEventKinds() { }
/**
* A special event to indicate that events may have been lost or
......@@ -44,8 +44,8 @@ public final class StandardWatchEventKind {
*
* @see WatchService
*/
public static final WatchEvent.Kind<Void> OVERFLOW =
new StdWatchEventKind<Void>("OVERFLOW", Void.class);
public static final WatchEvent.Kind<Object> OVERFLOW =
new StdWatchEventKind<Object>("OVERFLOW", Object.class);
/**
* Directory entry created.
......
......@@ -50,7 +50,7 @@ public interface WatchEvent<T> {
* An event kind, for the purposes of identification.
*
* @since 1.7
* @see StandardWatchEventKind
* @see StandardWatchEventKinds
*/
public static interface Kind<T> {
/**
......@@ -98,9 +98,9 @@ public interface WatchEvent<T> {
/**
* Returns the context for the event.
*
* <p> In the case of {@link StandardWatchEventKind#ENTRY_CREATE ENTRY_CREATE},
* {@link StandardWatchEventKind#ENTRY_DELETE ENTRY_DELETE}, and {@link
* StandardWatchEventKind#ENTRY_MODIFY ENTRY_MODIFY} events the context is
* <p> In the case of {@link StandardWatchEventKinds#ENTRY_CREATE ENTRY_CREATE},
* {@link StandardWatchEventKinds#ENTRY_DELETE ENTRY_DELETE}, and {@link
* StandardWatchEventKinds#ENTRY_MODIFY ENTRY_MODIFY} events the context is
* a {@code Path} that is the {@link Path#relativize relative} path between
* the directory registered with the watch service, and the entry that is
* created, deleted, or modified.
......
......@@ -68,7 +68,7 @@ import java.util.concurrent.TimeUnit;
* of events that it may accumulate. Where an implementation <em>knowingly</em>
* discards events then it arranges for the key's {@link WatchKey#pollEvents
* pollEvents} method to return an element with an event type of {@link
* StandardWatchEventKind#OVERFLOW OVERFLOW}. This event can be used by the
* StandardWatchEventKinds#OVERFLOW OVERFLOW}. This event can be used by the
* consumer as a trigger to re-examine the state of the object.
*
* <p> When an event is reported to indicate that a file in a watched directory
......@@ -87,7 +87,7 @@ import java.util.concurrent.TimeUnit;
* are detected, their timeliness, and whether their ordering is preserved are
* highly implementation specific. For example, when a file in a watched
* directory is modified then it may result in a single {@link
* StandardWatchEventKind#ENTRY_MODIFY ENTRY_MODIFY} event in some
* StandardWatchEventKinds#ENTRY_MODIFY ENTRY_MODIFY} event in some
* implementations but several events in other implementations. Short-lived
* files (meaning files that are deleted very quickly after they are created)
* may not be detected by primitive implementations that periodically poll the
......
......@@ -53,7 +53,7 @@ public interface Watchable {
* those specified by the {@code events} and {@code modifiers} parameters.
* Changing the event set does not cause pending events for the object to be
* discarded. Objects are automatically registered for the {@link
* StandardWatchEventKind#OVERFLOW OVERFLOW} event. This event is not
* StandardWatchEventKinds#OVERFLOW OVERFLOW} event. This event is not
* required to be present in the array of events.
*
* <p> Otherwise the file system object has not yet been registered with the
......
......@@ -89,7 +89,7 @@ public class BatchUpdateException extends SQLException {
* The <code>cause</code> is not initialized, and may subsequently be
* initialized by a call to the
* {@link Throwable#initCause(java.lang.Throwable)} method. The vendor code
* is intialized to 0.
* is initialized to 0.
* <p>
*
* @param reason a description of the exception
......@@ -188,7 +188,7 @@ public class BatchUpdateException extends SQLException {
* @since 1.6
*/
public BatchUpdateException(Throwable cause) {
this(null, null, 0, null, cause);
this((cause == null ? null : cause.toString()), null, 0, null, cause);
}
/**
......@@ -214,7 +214,7 @@ public class BatchUpdateException extends SQLException {
* @since 1.6
*/
public BatchUpdateException(int []updateCounts , Throwable cause) {
this(null, null, 0, updateCounts, cause);
this((cause == null ? null : cause.toString()), null, 0, updateCounts, cause);
}
/**
......
......@@ -826,7 +826,7 @@ import sun.misc.FormattedFloatingDecimal;
*
* <li> <a href="#dndec"><b>Float and Double</b></a>
*
* <li> <a href="#dndec"><b>BigDecimal</b></a>
* <li> <a href="#dnbdec"><b>BigDecimal</b></a>
*
* </ol>
*
......@@ -1362,7 +1362,7 @@ import sun.misc.FormattedFloatingDecimal;
* precision is not provided, then all of the digits as returned by {@link
* Double#toHexString(double)} will be output.
*
* <p><a name="dndec"><b> BigDecimal </b></a>
* <p><a name="dnbdec"><b> BigDecimal </b></a>
*
* <p> The following conversions may be applied {@link java.math.BigDecimal
* BigDecimal}.
......@@ -1372,7 +1372,7 @@ import sun.misc.FormattedFloatingDecimal;
* <tr><td valign="top"> {@code 'e'}
* <td valign="top"> <tt>'&#92;u0065'</tt>
* <td> Requires the output to be formatted using <a
* name="scientific">computerized scientific notation</a>. The <a
* name="bscientific">computerized scientific notation</a>. The <a
* href="#l10n algorithm">localization algorithm</a> is applied.
*
* <p> The formatting of the magnitude <i>m</i> depends upon its value.
......@@ -1427,11 +1427,11 @@ import sun.misc.FormattedFloatingDecimal;
*
* <p> If <i>m</i> is greater than or equal to 10<sup>-4</sup> but less
* than 10<sup>precision</sup> then it is represented in <i><a
* href="#decimal">decimal format</a></i>.
* href="#bdecimal">decimal format</a></i>.
*
* <p> If <i>m</i> is less than 10<sup>-4</sup> or greater than or equal to
* 10<sup>precision</sup>, then it is represented in <i><a
* href="#scientific">computerized scientific notation</a></i>.
* href="#bscientific">computerized scientific notation</a></i>.
*
* <p> The total number of significant digits in <i>m</i> is equal to the
* precision. If the precision is not specified, then the default value is
......@@ -1447,7 +1447,7 @@ import sun.misc.FormattedFloatingDecimal;
*
* <tr><td valign="top"> {@code 'f'}
* <td valign="top"> <tt>'&#92;u0066'</tt>
* <td> Requires the output to be formatted using <a name="decimal">decimal
* <td> Requires the output to be formatted using <a name="bdecimal">decimal
* format</a>. The <a href="#l10n algorithm">localization algorithm</a> is
* applied.
*
......
......@@ -159,7 +159,7 @@ import java.util.concurrent.locks.LockSupport;
* void runTasks(List<Runnable> tasks) {
* final Phaser phaser = new Phaser(1); // "1" to register self
* // create and start threads
* for (Runnable task : tasks) {
* for (final Runnable task : tasks) {
* phaser.register();
* new Thread() {
* public void run() {
......
......@@ -275,10 +275,14 @@ public class LockSupport {
* snapshot -- the thread may have since unblocked or blocked on a
* different blocker object.
*
* @param t the thread
* @return the blocker
* @throws NullPointerException if argument is null
* @since 1.6
*/
public static Object getBlocker(Thread t) {
if (t == null)
throw new NullPointerException();
return unsafe.getObjectVolatile(t, parkBlockerOffset);
}
......
/*
* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -342,12 +342,35 @@ public class LogManager {
// already been created with the given name it is returned.
// Otherwise a new logger instance is created and registered
// in the LogManager global namespace.
// This method will always return a non-null Logger object.
// Synchronization is not required here. All synchronization for
// adding a new Logger object is handled by addLogger().
Logger demandLogger(String name) {
Logger result = getLogger(name);
if (result == null) {
result = new Logger(name, null);
addLogger(result);
result = getLogger(name);
// only allocate the new logger once
Logger newLogger = new Logger(name, null);
do {
if (addLogger(newLogger)) {
// We successfully added the new Logger that we
// created above so return it without refetching.
return newLogger;
}
// We didn't add the new Logger that we created above
// because another thread added a Logger with the same
// name after our null check above and before our call
// to addLogger(). We have to refetch the Logger because
// addLogger() returns a boolean instead of the Logger
// reference itself. However, if the thread that created
// the other Logger is not holding a strong reference to
// the other Logger, then it is possible for the other
// Logger to be GC'ed after we saw it in addLogger() and
// before we can refetch it. If it has been GC'ed then
// we'll just loop around and try again.
result = getLogger(name);
} while (result == null);
}
return result;
}
......
......@@ -310,7 +310,20 @@ public class Logger {
* @return a suitable Logger
* @throws NullPointerException if the name is null.
*/
public static synchronized Logger getLogger(String name) {
// Synchronization is not required here. All synchronization for
// adding a new Logger object is handled by LogManager.addLogger().
public static Logger getLogger(String name) {
// This method is intentionally not a wrapper around a call
// to getLogger(name, resourceBundleName). If it were then
// this sequence:
//
// getLogger("Foo", "resourceBundleForFoo");
// getLogger("Foo");
//
// would throw an IllegalArgumentException in the second call
// because the wrapper would result in an attempt to replace
// the existing "resourceBundleForFoo" with null.
LogManager manager = LogManager.getLogManager();
return manager.demandLogger(name);
}
......@@ -355,7 +368,10 @@ public class Logger {
* a different resource bundle name.
* @throws NullPointerException if the name is null.
*/
public static synchronized Logger getLogger(String name, String resourceBundleName) {
// Synchronization is not required here. All synchronization for
// adding a new Logger object is handled by LogManager.addLogger().
public static Logger getLogger(String name, String resourceBundleName) {
LogManager manager = LogManager.getLogManager();
Logger result = manager.demandLogger(name);
if (result.resourceBundleName == null) {
......@@ -417,7 +433,10 @@ public class Logger {
* @throws MissingResourceException if the resourceBundleName is non-null and
* no corresponding resource can be found.
*/
public static synchronized Logger getAnonymousLogger(String resourceBundleName) {
// Synchronization is not required here. All synchronization for
// adding a new anonymous Logger object is handled by doSetParent().
public static Logger getAnonymousLogger(String resourceBundleName) {
LogManager manager = LogManager.getLogManager();
// cleanup some Loggers that have been GC'ed
manager.drainLoggerRefQueueBounded();
......
......@@ -213,7 +213,7 @@ import java.util.Arrays;
* <td headers="matches">A character in the Greek&nbsp;block (<a href="#ubc">block</a>)</td></tr>
* <tr><td valign="top" headers="construct unicode"><tt>\p{Lu}</tt></td>
* <td headers="matches">An uppercase letter (<a href="#ucc">category</a>)</td></tr>
* <tr><td valign="top" headers="construct unicode"><tt>\p{isAlphabetic}</tt></td>
* <tr><td valign="top" headers="construct unicode"><tt>\p{IsAlphabetic}</tt></td>
* <td headers="matches">An alphabetic character (<a href="#ubpc">binary property</a>)</td></tr>
* <tr><td valign="top" headers="construct unicode"><tt>\p{Sc}</tt></td>
* <td headers="matches">A currency symbol</td></tr>
......
......@@ -28,7 +28,7 @@ package java.util.zip;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharset;
import java.nio.charset.StandardCharsets;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CoderResult;
......@@ -107,7 +107,7 @@ final class ZipCoder {
if (isUTF8)
return getBytes(s);
if (utf8 == null)
utf8 = new ZipCoder(StandardCharset.UTF_8);
utf8 = new ZipCoder(StandardCharsets.UTF_8);
return utf8.getBytes(s);
}
......@@ -116,7 +116,7 @@ final class ZipCoder {
if (isUTF8)
return toString(ba, len);
if (utf8 == null)
utf8 = new ZipCoder(StandardCharset.UTF_8);
utf8 = new ZipCoder(StandardCharsets.UTF_8);
return utf8.toString(ba, len);
}
......@@ -132,7 +132,7 @@ final class ZipCoder {
private ZipCoder(Charset cs) {
this.cs = cs;
this.isUTF8 = cs.name().equals(StandardCharset.UTF_8.name());
this.isUTF8 = cs.name().equals(StandardCharsets.UTF_8.name());
}
static ZipCoder get(Charset charset) {
......
......@@ -31,7 +31,7 @@ import java.io.IOException;
import java.io.EOFException;
import java.io.File;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Enumeration;
......@@ -141,7 +141,7 @@ class ZipFile implements ZipConstants, Closeable {
* @since 1.3
*/
public ZipFile(File file, int mode) throws IOException {
this(file, mode, StandardCharset.UTF_8);
this(file, mode, StandardCharsets.UTF_8);
}
/**
......
......@@ -30,7 +30,7 @@ import java.io.IOException;
import java.io.EOFException;
import java.io.PushbackInputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharset;
import java.nio.charset.StandardCharsets;
import static java.util.zip.ZipConstants64.*;
/**
......@@ -76,7 +76,7 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants {
* @param in the actual input stream
*/
public ZipInputStream(InputStream in) {
this(in, StandardCharset.UTF_8);
this(in, StandardCharsets.UTF_8);
}
/**
......
......@@ -28,7 +28,7 @@ package java.util.zip;
import java.io.OutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharset;
import java.nio.charset.StandardCharsets;
import java.util.Vector;
import java.util.HashSet;
import static java.util.zip.ZipConstants64.*;
......@@ -101,7 +101,7 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants {
* @param out the actual output stream
*/
public ZipOutputStream(OutputStream out) {
this(out, StandardCharset.UTF_8);
this(out, StandardCharsets.UTF_8);
}
/**
......
......@@ -2,7 +2,7 @@
<head>
<title>javax.management.loading package</title>
<!--
Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
......@@ -68,7 +68,7 @@ questions.
<p id="spec">
@see <a href="{@docRoot}/../technotes/guides/jmx/">
Java SE 6 Platform documentation on JMX technology</a>,
Java Platform documentation on JMX technology</a>,
in particular the
<a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
JMX Specification, version 1.4(pdf).</a>
......
......@@ -2,7 +2,7 @@
<head>
<title>javax.management.modelmbean package</title>
<!--
Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
......@@ -116,7 +116,7 @@ mbs.invoke(mapName, "get", new Object[] {"key"}, new String[] {Object.class.getN
<li>See the <i>JMX 1.4 Specification</i>
PDF document available from the
<a href="{@docRoot}/../technotes/guides/jmx/">
Java SE 6 Platform documentation on JMX</a>
Java Platform documentation on JMX technology</a>
</ul>
@since 1.5
......
......@@ -2,7 +2,7 @@
<head>
<title>javax.management.monitor package</title>
<!--
Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
......@@ -184,7 +184,7 @@ questions.
</ul>
<p id="spec">
@see <a href="{@docRoot}/../technotes/guides/jmx/">
Java SE 6 Platform documentation on JMX technology</a>,
Java Platform documentation on JMX technology</a>,
in particular the
<a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
JMX Specification, version 1.4(pdf).</a>
......
......@@ -2,7 +2,7 @@
<head>
<title>javax.management.openmbean package</title>
<!--
Copyright (c) 2001, 2007, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
......@@ -143,7 +143,7 @@ questions.
</ul>
@see <a href="{@docRoot}/../technotes/guides/jmx/">
Java SE 6 Platform documentation on JMX technology</a>,
Java Platform documentation on JMX technology</a>,
in particular the
<a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
JMX Specification, version 1.4</a>
......
......@@ -2,7 +2,7 @@
<head>
<title>javax.management package</title>
<!--
Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
......@@ -391,7 +391,7 @@ questions.
<p id="spec">
@see <a href="{@docRoot}/../technotes/guides/jmx/index.html">
Java SE 6 Platform documentation on JMX technology</a>
Java Platform documentation on JMX technology</a>
in particular the
<a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
JMX Specification, version 1.4(pdf).</a>
......
......@@ -2,7 +2,7 @@
<head>
<title>javax.management.relation package</title>
<!--
Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
......@@ -137,7 +137,7 @@ Set&lt;ObjectName&gt; dependentASet = dependentAMap.keySet();
</pre>
@see <a href="{@docRoot}/../technotes/guides/jmx/">
Java SE 6 Platform documentation on JMX technology</a>,
Java Platform documentation on JMX technology</a>,
in particular the
<a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
JMX Specification, version 1.4</a>
......
......@@ -2,7 +2,7 @@
<head>
<title>JMX<sup><font size="-2">TM</font></sup> Remote API.</title>
<!--
Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved.
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it
......@@ -195,7 +195,7 @@ rmi://192.18.1.9 username 1
@see <a href="{@docRoot}/../technotes/guides/jmx/">
Java SE 6 Platform documentation on JMX technology</a>,
Java Platform documentation on JMX technology</a>,
in particular the
<a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
JMX Specification, version 1.4</a>
......
......@@ -26,6 +26,7 @@
package javax.management.timer;
import static com.sun.jmx.defaults.JmxProperties.TIMER_LOGGER;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
......@@ -1003,7 +1004,10 @@ public class Timer extends NotificationBroadcasterSupport
Integer notifID;
Date date;
for (Object[] obj : timerTable.values()) {
ArrayList<Object[]> values =
new ArrayList<Object[]>(timerTable.values());
for (Object[] obj : values) {
// Retrieve the timer notification and the date notification.
//
......
......@@ -26,7 +26,7 @@ package sun.awt;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.StandardCharset;
import java.nio.charset.StandardCharsets;
import sun.nio.cs.HistoricallyNamedCharset;
public class FontDescriptor implements Cloneable {
......@@ -105,8 +105,8 @@ public class FontDescriptor implements Cloneable {
if (useUnicode && unicodeEncoder == null) {
try {
this.unicodeEncoder = isLE?
StandardCharset.UTF_16LE.newEncoder():
StandardCharset.UTF_16BE.newEncoder();
StandardCharsets.UTF_16LE.newEncoder():
StandardCharsets.UTF_16BE.newEncoder();
} catch (IllegalArgumentException x) {}
}
return useUnicode;
......
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.management;
import com.sun.management.GarbageCollectionNotificationInfo;
import com.sun.management.GcInfo;
import java.lang.reflect.Method;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.OpenDataException;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.SimpleType;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.lang.reflect.Field;
import java.util.HashMap;
/**
* A CompositeData for GarbageCollectionNotificationInfo for the local management support.
* This class avoids the performance penalty paid to the
* construction of a CompositeData use in the local case.
*/
public class GarbageCollectionNotifInfoCompositeData extends LazyCompositeData {
private final GarbageCollectionNotificationInfo gcNotifInfo;
public GarbageCollectionNotifInfoCompositeData(GarbageCollectionNotificationInfo info) {
this.gcNotifInfo = info;
}
public GarbageCollectionNotificationInfo getGarbageCollectionNotifInfo() {
return gcNotifInfo;
}
public static CompositeData toCompositeData(GarbageCollectionNotificationInfo info) {
GarbageCollectionNotifInfoCompositeData gcnicd =
new GarbageCollectionNotifInfoCompositeData(info);
return gcnicd.getCompositeData();
}
private CompositeType getCompositeTypeByBuilder() {
final GcInfoBuilder builder = AccessController.doPrivileged (new PrivilegedAction<GcInfoBuilder>() {
public GcInfoBuilder run() {
try {
Class cl = Class.forName("com.sun.management.GcInfo");
Field f = cl.getDeclaredField("builder");
f.setAccessible(true);
return (GcInfoBuilder)f.get(gcNotifInfo.getGcInfo());
} catch(ClassNotFoundException e) {
return null;
} catch(NoSuchFieldException e) {
return null;
} catch(IllegalAccessException e) {
return null;
}
}
});
CompositeType gict = null;
synchronized(compositeTypeByBuilder) {
gict = compositeTypeByBuilder.get(builder);
if(gict == null) {
OpenType[] gcNotifInfoItemTypes = new OpenType[] {
SimpleType.STRING,
SimpleType.STRING,
SimpleType.STRING,
builder.getGcInfoCompositeType(),
};
try {
final String typeName =
"sun.management.GarbageCollectionNotifInfoCompositeType";
gict = new CompositeType(typeName,
"CompositeType for GC notification info",
gcNotifInfoItemNames,
gcNotifInfoItemNames,
gcNotifInfoItemTypes);
compositeTypeByBuilder.put(builder,gict);
} catch (OpenDataException e) {
// shouldn't reach here
throw Util.newException(e);
}
}
}
return gict;
}
protected CompositeData getCompositeData() {
// CONTENTS OF THIS ARRAY MUST BE SYNCHRONIZED WITH
// gcNotifInfoItemNames!
final Object[] gcNotifInfoItemValues;
gcNotifInfoItemValues = new Object[] {
gcNotifInfo.getGcName(),
gcNotifInfo.getGcAction(),
gcNotifInfo.getGcCause(),
GcInfoCompositeData.toCompositeData(gcNotifInfo.getGcInfo())
};
CompositeType gict = getCompositeTypeByBuilder();
try {
return new CompositeDataSupport(gict,
gcNotifInfoItemNames,
gcNotifInfoItemValues);
} catch (OpenDataException e) {
// Should never reach here
throw new AssertionError(e);
}
}
// private static MappedMXBeanType gcInfoMapType;
private static final String GC_NAME = "gcName";
private static final String GC_ACTION = "gcAction";
private static final String GC_CAUSE = "gcCause";
private static final String GC_INFO = "gcInfo";
private static final String[] gcNotifInfoItemNames = {
GC_NAME,
GC_ACTION,
GC_CAUSE,
GC_INFO
};
private static HashMap<GcInfoBuilder,CompositeType> compositeTypeByBuilder =
new HashMap<GcInfoBuilder,CompositeType>();
public static String getGcName(CompositeData cd) {
String gcname = getString(cd, GC_NAME);
if (gcname == null) {
throw new IllegalArgumentException("Invalid composite data: " +
"Attribute " + GC_NAME + " has null value");
}
return gcname;
}
public static String getGcAction(CompositeData cd) {
String gcaction = getString(cd, GC_ACTION);
if (gcaction == null) {
throw new IllegalArgumentException("Invalid composite data: " +
"Attribute " + GC_ACTION + " has null value");
}
return gcaction;
}
public static String getGcCause(CompositeData cd) {
String gccause = getString(cd, GC_CAUSE);
if (gccause == null) {
throw new IllegalArgumentException("Invalid composite data: " +
"Attribute " + GC_CAUSE + " has null value");
}
return gccause;
}
public static GcInfo getGcInfo(CompositeData cd) {
CompositeData gcInfoData = (CompositeData) cd.get(GC_INFO);
return GcInfo.from(gcInfoData);
}
/** Validate if the input CompositeData has the expected
* CompositeType (i.e. contain all attributes with expected
* names and types).
*/
public static void validateCompositeData(CompositeData cd) {
if (cd == null) {
throw new NullPointerException("Null CompositeData");
}
if (!isTypeMatched( getBaseGcNotifInfoCompositeType(), cd.getCompositeType())) {
throw new IllegalArgumentException(
"Unexpected composite type for GarbageCollectionNotificationInfo");
}
}
// This is only used for validation.
private static CompositeType baseGcNotifInfoCompositeType = null;
private static synchronized CompositeType getBaseGcNotifInfoCompositeType() {
if (baseGcNotifInfoCompositeType == null) {
try {
OpenType[] baseGcNotifInfoItemTypes = new OpenType[] {
SimpleType.STRING,
SimpleType.STRING,
SimpleType.STRING,
GcInfoCompositeData.getBaseGcInfoCompositeType()
};
baseGcNotifInfoCompositeType =
new CompositeType("sun.management.BaseGarbageCollectionNotifInfoCompositeType",
"CompositeType for Base GarbageCollectionNotificationInfo",
gcNotifInfoItemNames,
gcNotifInfoItemNames,
baseGcNotifInfoItemTypes);
} catch (OpenDataException e) {
// shouldn't reach here
throw Util.newException(e);
}
}
return baseGcNotifInfoCompositeType;
}
private static final long serialVersionUID = -1805123446483771292L;
}
/*
* Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -26,6 +26,7 @@
package sun.management;
import com.sun.management.GarbageCollectorMXBean;
import com.sun.management.GarbageCollectionNotificationInfo;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryUsage;
......@@ -35,9 +36,15 @@ import javax.management.openmbean.CompositeData;
import javax.management.MBeanInfo;
import javax.management.MBeanAttributeInfo;
import javax.management.ObjectName;
import javax.management.MBeanNotificationInfo;
import javax.management.Notification;
import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import javax.management.ListenerNotFoundException;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
/**
* Implementation class for the garbage collector.
......@@ -78,19 +85,111 @@ class GarbageCollectorImpl extends MemoryManagerImpl
// Sun JDK extension
private GcInfoBuilder gcInfoBuilder;
private synchronized GcInfoBuilder getGcInfoBuilder() {
if(gcInfoBuilder == null) {
gcInfoBuilder = new GcInfoBuilder(this, getAllPoolNames());
}
return gcInfoBuilder;
}
public GcInfo getLastGcInfo() {
GcInfo info = getGcInfoBuilder().getLastGcInfo();
return info;
}
private final static String notifName =
"javax.management.Notification";
private final static String[] gcNotifTypes = {
GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION
};
private MBeanNotificationInfo[] notifInfo = null;
public MBeanNotificationInfo[] getNotificationInfo() {
synchronized (this) {
if (gcInfoBuilder == null) {
gcInfoBuilder = new GcInfoBuilder(this, getAllPoolNames());
if (notifInfo == null) {
notifInfo = new MBeanNotificationInfo[1];
notifInfo[0] = new MBeanNotificationInfo(gcNotifTypes,
notifName,
"GC Notification");
}
}
return notifInfo;
}
GcInfo info = gcInfoBuilder.getLastGcInfo();
return info;
private static long seqNumber = 0;
private static long getNextSeqNumber() {
return ++seqNumber;
}
void createGCNotification(long timestamp,
String gcName,
String gcAction,
String gcCause,
GcInfo gcInfo) {
if (!hasListeners()) {
return;
}
Notification notif = new Notification(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION,
getObjectName(),
getNextSeqNumber(),
timestamp,
gcName);
GarbageCollectionNotificationInfo info =
new GarbageCollectionNotificationInfo(gcName,
gcAction,
gcCause,
gcInfo);
CompositeData cd =
GarbageCollectionNotifInfoCompositeData.toCompositeData(info);
notif.setUserData(cd);
sendNotification(notif);
}
public synchronized void addNotificationListener(NotificationListener listener,
NotificationFilter filter,
Object handback)
{
boolean before = hasListeners();
super.addNotificationListener(listener, filter, handback);
boolean after = hasListeners();
if (!before && after) {
setNotificationEnabled(this, true);
}
}
public synchronized void removeNotificationListener(NotificationListener listener)
throws ListenerNotFoundException {
boolean before = hasListeners();
super.removeNotificationListener(listener);
boolean after = hasListeners();
if (before && !after) {
setNotificationEnabled(this,false);
}
}
public synchronized void removeNotificationListener(NotificationListener listener,
NotificationFilter filter,
Object handback)
throws ListenerNotFoundException
{
boolean before = hasListeners();
super.removeNotificationListener(listener,filter,handback);
boolean after = hasListeners();
if (before && !after) {
setNotificationEnabled(this,false);
}
}
public ObjectName getObjectName() {
return Util.newObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE, getName());
}
native void setNotificationEnabled(GarbageCollectorMXBean gc,
boolean enabled);
}
/*
* Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -27,6 +27,7 @@ package sun.management;
import java.lang.management.MemoryUsage;
import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.Map;
import java.util.HashMap;
......@@ -41,6 +42,9 @@ import javax.management.openmbean.SimpleType;
import javax.management.openmbean.OpenType;
import javax.management.openmbean.OpenDataException;
import com.sun.management.GcInfo;
import com.sun.management.GarbageCollectionNotificationInfo;
import java.security.AccessController;
import java.security.PrivilegedAction;
/**
* A CompositeData for GcInfo for the local management support.
......@@ -64,6 +68,44 @@ public class GcInfoCompositeData extends LazyCompositeData {
return info;
}
public static CompositeData toCompositeData(final GcInfo info) {
final GcInfoBuilder builder = AccessController.doPrivileged (new PrivilegedAction<GcInfoBuilder>() {
public GcInfoBuilder run() {
try {
Class cl = Class.forName("com.sun.management.GcInfo");
Field f = cl.getDeclaredField("builder");
f.setAccessible(true);
return (GcInfoBuilder)f.get(info);
} catch(ClassNotFoundException e) {
return null;
} catch(NoSuchFieldException e) {
return null;
} catch(IllegalAccessException e) {
return null;
}
}
});
final Object[] extAttr = AccessController.doPrivileged (new PrivilegedAction<Object[]>() {
public Object[] run() {
try {
Class cl = Class.forName("com.sun.management.GcInfo");
Field f = cl.getDeclaredField("extAttributes");
f.setAccessible(true);
return (Object[])f.get(info);
} catch(ClassNotFoundException e) {
return null;
} catch(NoSuchFieldException e) {
return null;
} catch(IllegalAccessException e) {
return null;
}
}
});
GcInfoCompositeData gcicd =
new GcInfoCompositeData(info,builder,extAttr);
return gcicd.getCompositeData();
}
protected CompositeData getCompositeData() {
// CONTENTS OF THIS ARRAY MUST BE SYNCHRONIZED WITH
// baseGcInfoItemNames!
......@@ -115,7 +157,6 @@ public class GcInfoCompositeData extends LazyCompositeData {
}
}
private static final String ID = "id";
private static final String START_TIME = "startTime";
private static final String END_TIME = "endTime";
......@@ -231,7 +272,7 @@ public class GcInfoCompositeData extends LazyCompositeData {
// This is only used for validation.
private static CompositeType baseGcInfoCompositeType = null;
private static synchronized CompositeType getBaseGcInfoCompositeType() {
static synchronized CompositeType getBaseGcInfoCompositeType() {
if (baseGcInfoCompositeType == null) {
try {
baseGcInfoCompositeType =
......
/*
* Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -29,6 +29,7 @@ import java.lang.management.ManagementFactory;
import java.lang.management.MemoryManagerMXBean;
import java.lang.management.MemoryPoolMXBean;
import javax.management.MBeanNotificationInfo;
import javax.management.ObjectName;
/**
......@@ -38,7 +39,8 @@ import javax.management.ObjectName;
* ManagementFactory.getMemoryManagerMXBeans() returns a list
* of instances of this class.
*/
class MemoryManagerImpl implements MemoryManagerMXBean {
class MemoryManagerImpl extends NotificationEmitterSupport
implements MemoryManagerMXBean {
private final String name;
private final boolean isValid;
......@@ -76,6 +78,16 @@ class MemoryManagerImpl implements MemoryManagerMXBean {
}
private native MemoryPoolMXBean[] getMemoryPools0();
private MBeanNotificationInfo[] notifInfo = null;
public MBeanNotificationInfo[] getNotificationInfo() {
synchronized (this) {
if(notifInfo == null) {
notifInfo = new MBeanNotificationInfo[0];
}
}
return notifInfo;
}
public ObjectName getObjectName() {
return Util.newObjectName(ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE, getName());
}
......
......@@ -45,6 +45,7 @@ public interface VMManagement {
public boolean isSynchronizerUsageSupported();
public boolean isThreadAllocatedMemorySupported();
public boolean isThreadAllocatedMemoryEnabled();
public boolean isGcNotificationSupported();
// Class Loading Subsystem
public long getTotalClassCount();
......
......@@ -56,6 +56,8 @@ class VMManagementImpl implements VMManagement {
private static boolean objectMonitorUsageSupport;
private static boolean synchronizerUsageSupport;
private static boolean threadAllocatedMemorySupport;
private static boolean gcNotificationSupport;
static {
version = getVersion0();
......@@ -100,6 +102,10 @@ class VMManagementImpl implements VMManagement {
return threadAllocatedMemorySupport;
}
public boolean isGcNotificationSupported() {
return gcNotificationSupport;
}
public native boolean isThreadContentionMonitoringEnabled();
public native boolean isThreadCpuTimeEnabled();
public native boolean isThreadAllocatedMemoryEnabled();
......
......@@ -28,7 +28,7 @@ package sun.nio.ch;
import java.nio.channels.*;
import java.net.SocketAddress;
import java.net.SocketOption;
import java.net.StandardSocketOption;
import java.net.StandardSocketOptions;
import java.net.InetSocketAddress;
import java.io.FileDescriptor;
import java.io.IOException;
......@@ -214,8 +214,8 @@ abstract class AsynchronousServerSocketChannelImpl
private static Set<SocketOption<?>> defaultOptions() {
HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(2);
set.add(StandardSocketOption.SO_RCVBUF);
set.add(StandardSocketOption.SO_REUSEADDR);
set.add(StandardSocketOptions.SO_RCVBUF);
set.add(StandardSocketOptions.SO_REUSEADDR);
return Collections.unmodifiableSet(set);
}
}
......
......@@ -28,7 +28,7 @@ package sun.nio.ch;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.net.SocketOption;
import java.net.StandardSocketOption;
import java.net.StandardSocketOptions;
import java.net.SocketAddress;
import java.net.InetSocketAddress;
import java.io.IOException;
......@@ -483,11 +483,11 @@ abstract class AsynchronousSocketChannelImpl
private static Set<SocketOption<?>> defaultOptions() {
HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(5);
set.add(StandardSocketOption.SO_SNDBUF);
set.add(StandardSocketOption.SO_RCVBUF);
set.add(StandardSocketOption.SO_KEEPALIVE);
set.add(StandardSocketOption.SO_REUSEADDR);
set.add(StandardSocketOption.TCP_NODELAY);
set.add(StandardSocketOptions.SO_SNDBUF);
set.add(StandardSocketOptions.SO_RCVBUF);
set.add(StandardSocketOptions.SO_KEEPALIVE);
set.add(StandardSocketOptions.SO_REUSEADDR);
set.add(StandardSocketOptions.TCP_NODELAY);
return Collections.unmodifiableSet(set);
}
}
......
......@@ -188,7 +188,7 @@ class DatagramChannelImpl
synchronized (stateLock) {
ensureOpen();
if (name == StandardSocketOption.IP_TOS) {
if (name == StandardSocketOptions.IP_TOS) {
// IPv4 only; no-op for IPv6
if (family == StandardProtocolFamily.INET) {
Net.setSocketOption(fd, family, name, value);
......@@ -196,15 +196,15 @@ class DatagramChannelImpl
return this;
}
if (name == StandardSocketOption.IP_MULTICAST_TTL ||
name == StandardSocketOption.IP_MULTICAST_LOOP)
if (name == StandardSocketOptions.IP_MULTICAST_TTL ||
name == StandardSocketOptions.IP_MULTICAST_LOOP)
{
// options are protocol dependent
Net.setSocketOption(fd, family, name, value);
return this;
}
if (name == StandardSocketOption.IP_MULTICAST_IF) {
if (name == StandardSocketOptions.IP_MULTICAST_IF) {
if (value == null)
throw new IllegalArgumentException("Cannot set IP_MULTICAST_IF to 'null'");
NetworkInterface interf = (NetworkInterface)value;
......@@ -243,7 +243,7 @@ class DatagramChannelImpl
synchronized (stateLock) {
ensureOpen();
if (name == StandardSocketOption.IP_TOS) {
if (name == StandardSocketOptions.IP_TOS) {
// IPv4 only; always return 0 on IPv6
if (family == StandardProtocolFamily.INET) {
return (T) Net.getSocketOption(fd, family, name);
......@@ -252,13 +252,13 @@ class DatagramChannelImpl
}
}
if (name == StandardSocketOption.IP_MULTICAST_TTL ||
name == StandardSocketOption.IP_MULTICAST_LOOP)
if (name == StandardSocketOptions.IP_MULTICAST_TTL ||
name == StandardSocketOptions.IP_MULTICAST_LOOP)
{
return (T) Net.getSocketOption(fd, family, name);
}
if (name == StandardSocketOption.IP_MULTICAST_IF) {
if (name == StandardSocketOptions.IP_MULTICAST_IF) {
if (family == StandardProtocolFamily.INET) {
int address = Net.getInterface4(fd);
if (address == 0)
......@@ -291,14 +291,14 @@ class DatagramChannelImpl
private static Set<SocketOption<?>> defaultOptions() {
HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(8);
set.add(StandardSocketOption.SO_SNDBUF);
set.add(StandardSocketOption.SO_RCVBUF);
set.add(StandardSocketOption.SO_REUSEADDR);
set.add(StandardSocketOption.SO_BROADCAST);
set.add(StandardSocketOption.IP_TOS);
set.add(StandardSocketOption.IP_MULTICAST_IF);
set.add(StandardSocketOption.IP_MULTICAST_TTL);
set.add(StandardSocketOption.IP_MULTICAST_LOOP);
set.add(StandardSocketOptions.SO_SNDBUF);
set.add(StandardSocketOptions.SO_RCVBUF);
set.add(StandardSocketOptions.SO_REUSEADDR);
set.add(StandardSocketOptions.SO_BROADCAST);
set.add(StandardSocketOptions.IP_TOS);
set.add(StandardSocketOptions.IP_MULTICAST_IF);
set.add(StandardSocketOptions.IP_MULTICAST_TTL);
set.add(StandardSocketOptions.IP_MULTICAST_LOOP);
return Collections.unmodifiableSet(set);
}
}
......
......@@ -312,46 +312,46 @@ public class DatagramSocketAdaptor
public void setSendBufferSize(int size) throws SocketException {
if (size <= 0)
throw new IllegalArgumentException("Invalid send size");
setIntOption(StandardSocketOption.SO_SNDBUF, size);
setIntOption(StandardSocketOptions.SO_SNDBUF, size);
}
public int getSendBufferSize() throws SocketException {
return getIntOption(StandardSocketOption.SO_SNDBUF);
return getIntOption(StandardSocketOptions.SO_SNDBUF);
}
public void setReceiveBufferSize(int size) throws SocketException {
if (size <= 0)
throw new IllegalArgumentException("Invalid receive size");
setIntOption(StandardSocketOption.SO_RCVBUF, size);
setIntOption(StandardSocketOptions.SO_RCVBUF, size);
}
public int getReceiveBufferSize() throws SocketException {
return getIntOption(StandardSocketOption.SO_RCVBUF);
return getIntOption(StandardSocketOptions.SO_RCVBUF);
}
public void setReuseAddress(boolean on) throws SocketException {
setBooleanOption(StandardSocketOption.SO_REUSEADDR, on);
setBooleanOption(StandardSocketOptions.SO_REUSEADDR, on);
}
public boolean getReuseAddress() throws SocketException {
return getBooleanOption(StandardSocketOption.SO_REUSEADDR);
return getBooleanOption(StandardSocketOptions.SO_REUSEADDR);
}
public void setBroadcast(boolean on) throws SocketException {
setBooleanOption(StandardSocketOption.SO_BROADCAST, on);
setBooleanOption(StandardSocketOptions.SO_BROADCAST, on);
}
public boolean getBroadcast() throws SocketException {
return getBooleanOption(StandardSocketOption.SO_BROADCAST);
return getBooleanOption(StandardSocketOptions.SO_BROADCAST);
}
public void setTrafficClass(int tc) throws SocketException {
setIntOption(StandardSocketOption.IP_TOS, tc);
setIntOption(StandardSocketOptions.IP_TOS, tc);
}
public int getTrafficClass() throws SocketException {
return getIntOption(StandardSocketOption.IP_TOS);
return getIntOption(StandardSocketOptions.IP_TOS);
}
public void close() {
......
......@@ -29,7 +29,7 @@ import java.net.SocketOption;
/**
* Defines socket options that are supported by the implementation
* but not defined in StandardSocketOption.
* but not defined in StandardSocketOptions.
*/
class ExtendedSocketOption {
......
......@@ -96,11 +96,16 @@ class NativeThreadSet {
break;
}
waitingToEmpty = true;
boolean interrupted = false;
while (used > 0) {
try {
wait();
} catch (InterruptedException ignore) { }
} catch (InterruptedException e) {
interrupted = true;
}
}
if (interrupted)
Thread.currentThread().interrupt();
}
}
}
......@@ -237,26 +237,26 @@ class Net { // package-private
throw new AssertionError("Should not reach here");
// special handling
if (name == StandardSocketOption.SO_RCVBUF ||
name == StandardSocketOption.SO_SNDBUF)
if (name == StandardSocketOptions.SO_RCVBUF ||
name == StandardSocketOptions.SO_SNDBUF)
{
int i = ((Integer)value).intValue();
if (i < 0)
throw new IllegalArgumentException("Invalid send/receive buffer size");
}
if (name == StandardSocketOption.SO_LINGER) {
if (name == StandardSocketOptions.SO_LINGER) {
int i = ((Integer)value).intValue();
if (i < 0)
value = Integer.valueOf(-1);
if (i > 65535)
value = Integer.valueOf(65535);
}
if (name == StandardSocketOption.IP_TOS) {
if (name == StandardSocketOptions.IP_TOS) {
int i = ((Integer)value).intValue();
if (i < 0 || i > 255)
throw new IllegalArgumentException("Invalid IP_TOS value");
}
if (name == StandardSocketOption.IP_MULTICAST_TTL) {
if (name == StandardSocketOptions.IP_MULTICAST_TTL) {
int i = ((Integer)value).intValue();
if (i < 0 || i > 255)
throw new IllegalArgumentException("Invalid TTL/hop value");
......
......@@ -169,7 +169,7 @@ public class ServerSocketAdaptor // package-private
public void setReuseAddress(boolean on) throws SocketException {
try {
ssc.setOption(StandardSocketOption.SO_REUSEADDR, on);
ssc.setOption(StandardSocketOptions.SO_REUSEADDR, on);
} catch (IOException x) {
Net.translateToSocketException(x);
}
......@@ -177,7 +177,7 @@ public class ServerSocketAdaptor // package-private
public boolean getReuseAddress() throws SocketException {
try {
return ssc.getOption(StandardSocketOption.SO_REUSEADDR).booleanValue();
return ssc.getOption(StandardSocketOptions.SO_REUSEADDR).booleanValue();
} catch (IOException x) {
Net.translateToSocketException(x);
return false; // Never happens
......@@ -197,7 +197,7 @@ public class ServerSocketAdaptor // package-private
if (size <= 0)
throw new IllegalArgumentException("size cannot be 0 or negative");
try {
ssc.setOption(StandardSocketOption.SO_RCVBUF, size);
ssc.setOption(StandardSocketOptions.SO_RCVBUF, size);
} catch (IOException x) {
Net.translateToSocketException(x);
}
......@@ -205,7 +205,7 @@ public class ServerSocketAdaptor // package-private
public int getReceiveBufferSize() throws SocketException {
try {
return ssc.getOption(StandardSocketOption.SO_RCVBUF).intValue();
return ssc.getOption(StandardSocketOptions.SO_RCVBUF).intValue();
} catch (IOException x) {
Net.translateToSocketException(x);
return -1; // Never happens
......
......@@ -160,8 +160,8 @@ class ServerSocketChannelImpl
private static Set<SocketOption<?>> defaultOptions() {
HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(2);
set.add(StandardSocketOption.SO_RCVBUF);
set.add(StandardSocketOption.SO_REUSEADDR);
set.add(StandardSocketOptions.SO_RCVBUF);
set.add(StandardSocketOptions.SO_REUSEADDR);
return Collections.unmodifiableSet(set);
}
}
......
......@@ -318,21 +318,21 @@ public class SocketAdaptor
}
public void setTcpNoDelay(boolean on) throws SocketException {
setBooleanOption(StandardSocketOption.TCP_NODELAY, on);
setBooleanOption(StandardSocketOptions.TCP_NODELAY, on);
}
public boolean getTcpNoDelay() throws SocketException {
return getBooleanOption(StandardSocketOption.TCP_NODELAY);
return getBooleanOption(StandardSocketOptions.TCP_NODELAY);
}
public void setSoLinger(boolean on, int linger) throws SocketException {
if (!on)
linger = -1;
setIntOption(StandardSocketOption.SO_LINGER, linger);
setIntOption(StandardSocketOptions.SO_LINGER, linger);
}
public int getSoLinger() throws SocketException {
return getIntOption(StandardSocketOption.SO_LINGER);
return getIntOption(StandardSocketOptions.SO_LINGER);
}
public void sendUrgentData(int data) throws IOException {
......@@ -366,46 +366,46 @@ public class SocketAdaptor
// size 0 valid for SocketChannel, invalid for Socket
if (size <= 0)
throw new IllegalArgumentException("Invalid send size");
setIntOption(StandardSocketOption.SO_SNDBUF, size);
setIntOption(StandardSocketOptions.SO_SNDBUF, size);
}
public int getSendBufferSize() throws SocketException {
return getIntOption(StandardSocketOption.SO_SNDBUF);
return getIntOption(StandardSocketOptions.SO_SNDBUF);
}
public void setReceiveBufferSize(int size) throws SocketException {
// size 0 valid for SocketChannel, invalid for Socket
if (size <= 0)
throw new IllegalArgumentException("Invalid receive size");
setIntOption(StandardSocketOption.SO_RCVBUF, size);
setIntOption(StandardSocketOptions.SO_RCVBUF, size);
}
public int getReceiveBufferSize() throws SocketException {
return getIntOption(StandardSocketOption.SO_RCVBUF);
return getIntOption(StandardSocketOptions.SO_RCVBUF);
}
public void setKeepAlive(boolean on) throws SocketException {
setBooleanOption(StandardSocketOption.SO_KEEPALIVE, on);
setBooleanOption(StandardSocketOptions.SO_KEEPALIVE, on);
}
public boolean getKeepAlive() throws SocketException {
return getBooleanOption(StandardSocketOption.SO_KEEPALIVE);
return getBooleanOption(StandardSocketOptions.SO_KEEPALIVE);
}
public void setTrafficClass(int tc) throws SocketException {
setIntOption(StandardSocketOption.IP_TOS, tc);
setIntOption(StandardSocketOptions.IP_TOS, tc);
}
public int getTrafficClass() throws SocketException {
return getIntOption(StandardSocketOption.IP_TOS);
return getIntOption(StandardSocketOptions.IP_TOS);
}
public void setReuseAddress(boolean on) throws SocketException {
setBooleanOption(StandardSocketOption.SO_REUSEADDR, on);
setBooleanOption(StandardSocketOptions.SO_REUSEADDR, on);
}
public boolean getReuseAddress() throws SocketException {
return getBooleanOption(StandardSocketOption.SO_REUSEADDR);
return getBooleanOption(StandardSocketOptions.SO_REUSEADDR);
}
public void close() throws IOException {
......
......@@ -170,7 +170,7 @@ class SocketChannelImpl
throw new ClosedChannelException();
// special handling for IP_TOS: no-op when IPv6
if (name == StandardSocketOption.IP_TOS) {
if (name == StandardSocketOptions.IP_TOS) {
if (!Net.isIPv6Available())
Net.setSocketOption(fd, StandardProtocolFamily.INET, name, value);
return this;
......@@ -197,7 +197,7 @@ class SocketChannelImpl
throw new ClosedChannelException();
// special handling for IP_TOS: always return 0 when IPv6
if (name == StandardSocketOption.IP_TOS) {
if (name == StandardSocketOptions.IP_TOS) {
return (Net.isIPv6Available()) ? (T) Integer.valueOf(0) :
(T) Net.getSocketOption(fd, StandardProtocolFamily.INET, name);
}
......@@ -212,14 +212,14 @@ class SocketChannelImpl
private static Set<SocketOption<?>> defaultOptions() {
HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(8);
set.add(StandardSocketOption.SO_SNDBUF);
set.add(StandardSocketOption.SO_RCVBUF);
set.add(StandardSocketOption.SO_KEEPALIVE);
set.add(StandardSocketOption.SO_REUSEADDR);
set.add(StandardSocketOption.SO_LINGER);
set.add(StandardSocketOption.TCP_NODELAY);
set.add(StandardSocketOptions.SO_SNDBUF);
set.add(StandardSocketOptions.SO_RCVBUF);
set.add(StandardSocketOptions.SO_KEEPALIVE);
set.add(StandardSocketOptions.SO_REUSEADDR);
set.add(StandardSocketOptions.SO_LINGER);
set.add(StandardSocketOptions.TCP_NODELAY);
// additional options required by socket adaptor
set.add(StandardSocketOption.IP_TOS);
set.add(StandardSocketOptions.IP_TOS);
set.add(ExtendedSocketOption.SO_OOBINLINE);
return Collections.unmodifiableSet(set);
}
......
......@@ -105,16 +105,16 @@ abstract class AbstractPoller implements Runnable {
Set<WatchEvent.Kind<?>> eventSet = new HashSet<>(events.length);
for (WatchEvent.Kind<?> event: events) {
// standard events
if (event == StandardWatchEventKind.ENTRY_CREATE ||
event == StandardWatchEventKind.ENTRY_MODIFY ||
event == StandardWatchEventKind.ENTRY_DELETE)
if (event == StandardWatchEventKinds.ENTRY_CREATE ||
event == StandardWatchEventKinds.ENTRY_MODIFY ||
event == StandardWatchEventKinds.ENTRY_DELETE)
{
eventSet.add(event);
continue;
}
// OVERFLOW is ignored
if (event == StandardWatchEventKind.OVERFLOW) {
if (event == StandardWatchEventKinds.OVERFLOW) {
if (events.length == 1)
throw new IllegalArgumentException("No events to register");
continue;
......
......@@ -42,8 +42,8 @@ abstract class AbstractWatchKey implements WatchKey {
/**
* Special event to signal overflow
*/
static final Event<Void> OVERFLOW_EVENT =
new Event<Void>(StandardWatchEventKind.OVERFLOW, null);
static final Event<Object> OVERFLOW_EVENT =
new Event<Object>(StandardWatchEventKinds.OVERFLOW, null);
/**
* Possible key states
......@@ -103,14 +103,14 @@ abstract class AbstractWatchKey implements WatchKey {
*/
@SuppressWarnings("unchecked")
final void signalEvent(WatchEvent.Kind<?> kind, Object context) {
boolean isModify = (kind == StandardWatchEventKind.ENTRY_MODIFY);
boolean isModify = (kind == StandardWatchEventKinds.ENTRY_MODIFY);
synchronized (this) {
int size = events.size();
if (size > 0) {
// if the previous event is an OVERFLOW event or this is a
// repeated event then we simply increment the counter
WatchEvent<?> prev = events.get(size-1);
if ((prev.kind() == StandardWatchEventKind.OVERFLOW) ||
if ((prev.kind() == StandardWatchEventKinds.OVERFLOW) ||
((kind == prev.kind() &&
Objects.equals(context, prev.context()))))
{
......@@ -124,7 +124,7 @@ abstract class AbstractWatchKey implements WatchKey {
if (isModify) {
WatchEvent<?> ev = lastModifyEvents.get(context);
if (ev != null) {
assert ev.kind() == StandardWatchEventKind.ENTRY_MODIFY;
assert ev.kind() == StandardWatchEventKinds.ENTRY_MODIFY;
((Event<?>)ev).increment();
return;
}
......@@ -138,7 +138,7 @@ abstract class AbstractWatchKey implements WatchKey {
// if the list has reached the limit then drop pending events
// and queue an OVERFLOW event
if (size >= MAX_EVENT_LIST_SIZE) {
kind = StandardWatchEventKind.OVERFLOW;
kind = StandardWatchEventKinds.OVERFLOW;
isModify = false;
context = null;
}
......@@ -149,7 +149,7 @@ abstract class AbstractWatchKey implements WatchKey {
new Event<Object>((WatchEvent.Kind<Object>)kind, context);
if (isModify) {
lastModifyEvents.put(context, ev);
} else if (kind == StandardWatchEventKind.OVERFLOW) {
} else if (kind == StandardWatchEventKinds.OVERFLOW) {
// drop all pending events
events.clear();
lastModifyEvents.clear();
......
......@@ -80,16 +80,16 @@ class PollingWatchService
new HashSet<WatchEvent.Kind<?>>(events.length);
for (WatchEvent.Kind<?> event: events) {
// standard events
if (event == StandardWatchEventKind.ENTRY_CREATE ||
event == StandardWatchEventKind.ENTRY_MODIFY ||
event == StandardWatchEventKind.ENTRY_DELETE)
if (event == StandardWatchEventKinds.ENTRY_CREATE ||
event == StandardWatchEventKinds.ENTRY_MODIFY ||
event == StandardWatchEventKinds.ENTRY_DELETE)
{
eventSet.add(event);
continue;
}
// OVERFLOW is ignored
if (event == StandardWatchEventKind.OVERFLOW) {
if (event == StandardWatchEventKinds.OVERFLOW) {
if (events.length == 1)
throw new IllegalArgumentException("No events to register");
continue;
......@@ -355,16 +355,16 @@ class PollingWatchService
new CacheEntry(lastModified, tickCount));
// queue ENTRY_CREATE if event enabled
if (events.contains(StandardWatchEventKind.ENTRY_CREATE)) {
signalEvent(StandardWatchEventKind.ENTRY_CREATE, entry.getFileName());
if (events.contains(StandardWatchEventKinds.ENTRY_CREATE)) {
signalEvent(StandardWatchEventKinds.ENTRY_CREATE, entry.getFileName());
continue;
} else {
// if ENTRY_CREATE is not enabled and ENTRY_MODIFY is
// enabled then queue event to avoid missing out on
// modifications to the file immediately after it is
// created.
if (events.contains(StandardWatchEventKind.ENTRY_MODIFY)) {
signalEvent(StandardWatchEventKind.ENTRY_MODIFY, entry.getFileName());
if (events.contains(StandardWatchEventKinds.ENTRY_MODIFY)) {
signalEvent(StandardWatchEventKinds.ENTRY_MODIFY, entry.getFileName());
}
}
continue;
......@@ -372,8 +372,8 @@ class PollingWatchService
// check if file has changed
if (e.lastModified != lastModified) {
if (events.contains(StandardWatchEventKind.ENTRY_MODIFY)) {
signalEvent(StandardWatchEventKind.ENTRY_MODIFY,
if (events.contains(StandardWatchEventKinds.ENTRY_MODIFY)) {
signalEvent(StandardWatchEventKinds.ENTRY_MODIFY,
entry.getFileName());
}
}
......@@ -403,8 +403,8 @@ class PollingWatchService
Path name = mapEntry.getKey();
// remove from map and queue delete event (if enabled)
i.remove();
if (events.contains(StandardWatchEventKind.ENTRY_DELETE)) {
signalEvent(StandardWatchEventKind.ENTRY_DELETE, name);
if (events.contains(StandardWatchEventKinds.ENTRY_DELETE)) {
signalEvent(StandardWatchEventKinds.ENTRY_DELETE, name);
}
}
}
......
......@@ -24,22 +24,10 @@
*/
/*
* ===========================================================================
* IBM Confidential
* OCO Source Materials
* Licensed Materials - Property of IBM
*
* (C) Copyright IBM Corp. 1999 All Rights Reserved.
*
* The source code for this program is not published or otherwise divested of
* its trade secrets, irrespective of what has been deposited with the U.S.
* Copyright Office.
*
* Copyright 1997 The Open Group Research Institute. All rights reserved.
* ===========================================================================
*
*/
package sun.security.jgss.spi;
import org.ietf.jgss.*;
......
......@@ -62,7 +62,7 @@ final class JsseJce {
// Flag indicating whether EC crypto is available.
// If null, then we have not checked yet.
// If yes, then all the EC based crypto we need is available.
private static volatile Boolean ecAvailable;
private static Boolean ecAvailable;
// Flag indicating whether Kerberos crypto is available.
// If true, then all the Kerberos-based crypto we need is available.
......@@ -190,7 +190,7 @@ final class JsseJce {
// no instantiation of this class
}
static boolean isEcAvailable() {
synchronized static boolean isEcAvailable() {
if (ecAvailable == null) {
try {
JsseJce.getSignature(SIGNATURE_ECDSA);
......@@ -206,7 +206,7 @@ final class JsseJce {
return ecAvailable;
}
static void clearEcAvailable() {
synchronized static void clearEcAvailable() {
ecAvailable = null;
}
......
......@@ -27,17 +27,7 @@
*/
/*
* IBM Confidential
* OCO Source Materials
*
* IBM Java(tm)2 SDK, Standard Edition, v 1.2
*
* (C) Copyright IBM Corp. 1999
*
* The source code for this program is not published or otherwise divested of
* its trade secrets, irrespective of what has been deposited with the U.S.
* Copyright office.
*
* (C) Copyright IBM Corp. 1999 All Rights Reserved.
*/
/*
......
......@@ -48,7 +48,7 @@ enum {
JMM_VERSION_1_0 = 0x20010000,
JMM_VERSION_1_1 = 0x20010100, // JDK 6
JMM_VERSION_1_2 = 0x20010200, // JDK 7
JMM_VERSION = 0x20010200
JMM_VERSION = 0x20010201
};
typedef struct {
......@@ -293,6 +293,9 @@ typedef struct jmmInterface_1_ {
jlongArray ids,
jboolean lockedMonitors,
jboolean lockedSynchronizers);
void (JNICALL *SetGCNotificationEnabled) (JNIEnv *env,
jobject mgr,
jboolean enabled);
} JmmInterface;
#ifdef __cplusplus
......
/*
* Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -36,3 +36,17 @@ JNIEXPORT jlong JNICALL Java_sun_management_GarbageCollectorImpl_getCollectionTi
(JNIEnv *env, jobject mgr) {
return jmm_interface->GetLongAttribute(env, mgr, JMM_GC_TIME_MS);
}
JNIEXPORT void JNICALL Java_sun_management_GarbageCollectorImpl_setNotificationEnabled
(JNIEnv *env, jobject dummy, jobject gc,jboolean enabled) {
if (gc == NULL) {
JNU_ThrowNullPointerException(env, "Invalid GarbageCollectorMBean");
return;
}
if((jmm_version > JMM_VERSION_1_2)
|| (jmm_version == JMM_VERSION_1_2 && ((jmm_version&0xFF)>=1))) {
jmm_interface->SetGCNotificationEnabled(env, gc, enabled);
}
}
......@@ -95,6 +95,13 @@ Java_sun_management_VMManagementImpl_initOptionalSupportFields
value = mos.isThreadAllocatedMemorySupported;
setStaticBooleanField(env, cls, "threadAllocatedMemorySupport", value);
if ((jmm_version > JMM_VERSION_1_2) ||
(jmm_version == JMM_VERSION_1_2 && ((jmm_version&0xFF) >= 1))) {
setStaticBooleanField(env, cls, "gcNotificationSupport", JNI_TRUE);
} else {
setStaticBooleanField(env, cls, "gcNotificationSupport", JNI_FALSE);
}
}
JNIEXPORT jobjectArray JNICALL
......
......@@ -63,7 +63,7 @@ int main(int argc, const char* argv[]) {
out("// AUTOMATICALLY GENERATED FILE - DO NOT EDIT ");
out("package sun.nio.ch; ");
out("import java.net.SocketOption; ");
out("import java.net.StandardSocketOption; ");
out("import java.net.StandardSocketOptions; ");
out("import java.net.ProtocolFamily; ");
out("import java.net.StandardProtocolFamily; ");
out("import java.util.Map; ");
......@@ -73,7 +73,7 @@ int main(int argc, const char* argv[]) {
out(" private static class RegistryKey { ");
out(" private final SocketOption<?> name; ");
out(" private final ProtocolFamily family; ");
out(" RegistryKey(SocketOption<?> name, ProtocolFamily family) { ");
out(" RegistryKey(SocketOption<?> name, ProtocolFamily family) { ");
out(" this.name = name; ");
out(" this.family = family; ");
out(" } ");
......@@ -95,23 +95,23 @@ int main(int argc, const char* argv[]) {
out(" Map<RegistryKey,OptionKey> map = ");
out(" new HashMap<RegistryKey,OptionKey>(); ");
emit_unspec("StandardSocketOption.SO_BROADCAST", SOL_SOCKET, SO_BROADCAST);
emit_unspec("StandardSocketOption.SO_KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE);
emit_unspec("StandardSocketOption.SO_LINGER", SOL_SOCKET, SO_LINGER);
emit_unspec("StandardSocketOption.SO_SNDBUF", SOL_SOCKET, SO_SNDBUF);
emit_unspec("StandardSocketOption.SO_RCVBUF", SOL_SOCKET, SO_RCVBUF);
emit_unspec("StandardSocketOption.SO_REUSEADDR", SOL_SOCKET, SO_REUSEADDR);
emit_unspec("StandardSocketOption.TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY);
emit_unspec("StandardSocketOptions.SO_BROADCAST", SOL_SOCKET, SO_BROADCAST);
emit_unspec("StandardSocketOptions.SO_KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE);
emit_unspec("StandardSocketOptions.SO_LINGER", SOL_SOCKET, SO_LINGER);
emit_unspec("StandardSocketOptions.SO_SNDBUF", SOL_SOCKET, SO_SNDBUF);
emit_unspec("StandardSocketOptions.SO_RCVBUF", SOL_SOCKET, SO_RCVBUF);
emit_unspec("StandardSocketOptions.SO_REUSEADDR", SOL_SOCKET, SO_REUSEADDR);
emit_unspec("StandardSocketOptions.TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY);
emit_inet("StandardSocketOption.IP_TOS", IPPROTO_IP, IP_TOS);
emit_inet("StandardSocketOption.IP_MULTICAST_IF", IPPROTO_IP, IP_MULTICAST_IF);
emit_inet("StandardSocketOption.IP_MULTICAST_TTL", IPPROTO_IP, IP_MULTICAST_TTL);
emit_inet("StandardSocketOption.IP_MULTICAST_LOOP", IPPROTO_IP, IP_MULTICAST_LOOP);
emit_inet("StandardSocketOptions.IP_TOS", IPPROTO_IP, IP_TOS);
emit_inet("StandardSocketOptions.IP_MULTICAST_IF", IPPROTO_IP, IP_MULTICAST_IF);
emit_inet("StandardSocketOptions.IP_MULTICAST_TTL", IPPROTO_IP, IP_MULTICAST_TTL);
emit_inet("StandardSocketOptions.IP_MULTICAST_LOOP", IPPROTO_IP, IP_MULTICAST_LOOP);
#ifdef AF_INET6
emit_inet6("StandardSocketOption.IP_MULTICAST_IF", IPPROTO_IPV6, IPV6_MULTICAST_IF);
emit_inet6("StandardSocketOption.IP_MULTICAST_TTL", IPPROTO_IPV6, IPV6_MULTICAST_HOPS);
emit_inet6("StandardSocketOption.IP_MULTICAST_LOOP", IPPROTO_IPV6, IPV6_MULTICAST_LOOP);
emit_inet6("StandardSocketOptions.IP_MULTICAST_IF", IPPROTO_IPV6, IPV6_MULTICAST_IF);
emit_inet6("StandardSocketOptions.IP_MULTICAST_TTL", IPPROTO_IPV6, IPV6_MULTICAST_HOPS);
emit_inet6("StandardSocketOptions.IP_MULTICAST_LOOP", IPPROTO_IPV6, IPV6_MULTICAST_LOOP);
#endif
emit_unspec("ExtendedSocketOption.SO_OOBINLINE", SOL_SOCKET, SO_OOBINLINE);
......
......@@ -32,7 +32,7 @@
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.StandardSocketOption;
import java.net.StandardSocketOptions;
import java.nio.channels.*;
import java.util.*;
import java.util.concurrent.Executors;
......@@ -105,7 +105,7 @@ public class ChatServer implements Runnable {
*/
private AsynchronousServerSocketChannel createListener(AsynchronousChannelGroup channelGroup) throws IOException {
final AsynchronousServerSocketChannel listener = openChannel(channelGroup);
listener.setOption(StandardSocketOption.SO_REUSEADDR, true);
listener.setOption(StandardSocketOptions.SO_REUSEADDR, true);
listener.bind(new InetSocketAddress(port));
return listener;
}
......@@ -123,7 +123,7 @@ public class ChatServer implements Runnable {
private void handleNewConnection(AsynchronousSocketChannel channel) {
Client client = new Client(channel, new ClientReader(this, new NameReader(this)));
try {
channel.setOption(StandardSocketOption.TCP_NODELAY, true);
channel.setOption(StandardSocketOptions.TCP_NODELAY, true);
} catch (IOException e) {
// ignore
}
......
......@@ -30,7 +30,7 @@
*/
import java.nio.file.*;
import static java.nio.file.StandardWatchEventKind.*;
import static java.nio.file.StandardWatchEventKinds.*;
import static java.nio.file.LinkOption.*;
import java.nio.file.attribute.*;
import java.io.IOException;
......
......@@ -96,7 +96,7 @@ public class Reader {
family = StandardProtocolFamily.INET6;
}
DatagramChannel dc = DatagramChannel.open(family)
.setOption(StandardSocketOption.SO_REUSEADDR, true)
.setOption(StandardSocketOptions.SO_REUSEADDR, true)
.bind(new InetSocketAddress(target.port()));
if (includeList.isEmpty()) {
......
......@@ -59,7 +59,7 @@ public class Sender {
family = StandardProtocolFamily.INET6;
DatagramChannel dc = DatagramChannel.open(family).bind(new InetSocketAddress(0));
if (target.interf() != null) {
dc.setOption(StandardSocketOption.IP_MULTICAST_IF, target.interf());
dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, target.interf());
}
// send multicast packet
......
......@@ -55,7 +55,7 @@ import com.sun.nio.sctp.SctpChannel;
import com.sun.nio.sctp.SctpSocketOption;
import sun.nio.ch.PollArrayWrapper;
import sun.nio.ch.SelChImpl;
import static com.sun.nio.sctp.SctpStandardSocketOption.*;
import static com.sun.nio.sctp.SctpStandardSocketOptions.*;
import static sun.nio.ch.SctpResultContainer.SEND_FAILED;
import static sun.nio.ch.SctpResultContainer.ASSOCIATION_CHANGED;
import static sun.nio.ch.SctpResultContainer.PEER_ADDRESS_CHANGED;
......
......@@ -53,7 +53,7 @@ import com.sun.nio.sctp.MessageInfo;
import com.sun.nio.sctp.SctpChannel;
import com.sun.nio.sctp.SctpMultiChannel;
import com.sun.nio.sctp.SctpSocketOption;
import static com.sun.nio.sctp.SctpStandardSocketOption.*;
import static com.sun.nio.sctp.SctpStandardSocketOptions.*;
import static sun.nio.ch.SctpResultContainer.*;
/**
......
......@@ -35,7 +35,7 @@ import java.util.HashSet;
import java.security.AccessController;
import sun.security.action.GetPropertyAction;
import com.sun.nio.sctp.SctpSocketOption;
import static com.sun.nio.sctp.SctpStandardSocketOption.*;
import static com.sun.nio.sctp.SctpStandardSocketOptions.*;
public class SctpNet {
static final String osName = AccessController.doPrivileged(
......
......@@ -40,7 +40,7 @@ import com.sun.nio.sctp.IllegalUnbindException;
import com.sun.nio.sctp.SctpChannel;
import com.sun.nio.sctp.SctpServerChannel;
import com.sun.nio.sctp.SctpSocketOption;
import com.sun.nio.sctp.SctpStandardSocketOption;
import com.sun.nio.sctp.SctpStandardSocketOptions;
/**
* An implementation of SctpServerChannel
......@@ -386,7 +386,7 @@ public class SctpServerChannelImpl extends SctpServerChannel
private static Set<SctpSocketOption<?>> defaultOptions() {
HashSet<SctpSocketOption<?>> set = new HashSet<SctpSocketOption<?>>(1);
set.add(SctpStandardSocketOption.SCTP_INIT_MAXSTREAMS);
set.add(SctpStandardSocketOptions.SCTP_INIT_MAXSTREAMS);
return Collections.unmodifiableSet(set);
}
}
......
......@@ -210,15 +210,15 @@ class LinuxWatchService
int mask = 0;
for (WatchEvent.Kind<?> event: events) {
if (event == StandardWatchEventKind.ENTRY_CREATE) {
if (event == StandardWatchEventKinds.ENTRY_CREATE) {
mask |= IN_CREATE | IN_MOVED_TO;
continue;
}
if (event == StandardWatchEventKind.ENTRY_DELETE) {
if (event == StandardWatchEventKinds.ENTRY_DELETE) {
mask |= IN_DELETE | IN_MOVED_FROM;
continue;
}
if (event == StandardWatchEventKind.ENTRY_MODIFY) {
if (event == StandardWatchEventKinds.ENTRY_MODIFY) {
mask |= IN_MODIFY | IN_ATTRIB;
continue;
}
......@@ -378,17 +378,17 @@ class LinuxWatchService
*/
private WatchEvent.Kind<?> maskToEventKind(int mask) {
if ((mask & IN_MODIFY) > 0)
return StandardWatchEventKind.ENTRY_MODIFY;
return StandardWatchEventKinds.ENTRY_MODIFY;
if ((mask & IN_ATTRIB) > 0)
return StandardWatchEventKind.ENTRY_MODIFY;
return StandardWatchEventKinds.ENTRY_MODIFY;
if ((mask & IN_CREATE) > 0)
return StandardWatchEventKind.ENTRY_CREATE;
return StandardWatchEventKinds.ENTRY_CREATE;
if ((mask & IN_MOVED_TO) > 0)
return StandardWatchEventKind.ENTRY_CREATE;
return StandardWatchEventKinds.ENTRY_CREATE;
if ((mask & IN_DELETE) > 0)
return StandardWatchEventKind.ENTRY_DELETE;
return StandardWatchEventKinds.ENTRY_DELETE;
if ((mask & IN_MOVED_FROM) > 0)
return StandardWatchEventKind.ENTRY_DELETE;
return StandardWatchEventKinds.ENTRY_DELETE;
return null;
}
......@@ -400,7 +400,7 @@ class LinuxWatchService
if ((mask & IN_Q_OVERFLOW) > 0) {
for (Map.Entry<Integer,LinuxWatchKey> entry: wdToKey.entrySet()) {
entry.getValue()
.signalEvent(StandardWatchEventKind.OVERFLOW, null);
.signalEvent(StandardWatchEventKinds.OVERFLOW, null);
}
return;
}
......
......@@ -486,7 +486,7 @@ class SolarisWatchService
void processDirectoryEvents(SolarisWatchKey key, int mask) {
if ((mask & (FILE_MODIFIED | FILE_ATTRIB)) != 0) {
registerChildren(key.getDirectory(), key,
key.events().contains(StandardWatchEventKind.ENTRY_CREATE));
key.events().contains(StandardWatchEventKinds.ENTRY_CREATE));
}
}
......@@ -504,14 +504,14 @@ class SolarisWatchService
// entry modified
if (((mask & (FILE_MODIFIED | FILE_ATTRIB)) != 0) &&
events.contains(StandardWatchEventKind.ENTRY_MODIFY))
events.contains(StandardWatchEventKinds.ENTRY_MODIFY))
{
key.signalEvent(StandardWatchEventKind.ENTRY_MODIFY, node.name());
key.signalEvent(StandardWatchEventKinds.ENTRY_MODIFY, node.name());
}
// entry removed
if (((mask & (FILE_REMOVED)) != 0) &&
events.contains(StandardWatchEventKind.ENTRY_DELETE))
events.contains(StandardWatchEventKinds.ENTRY_DELETE))
{
// Due to 6636438/6636412 we may get a remove event for cases
// where a rmdir/unlink/rename is attempted but fails. Until
......@@ -527,7 +527,7 @@ class SolarisWatchService
} catch (UnixException x) { }
if (removed)
key.signalEvent(StandardWatchEventKind.ENTRY_DELETE, node.name());
key.signalEvent(StandardWatchEventKinds.ENTRY_DELETE, node.name());
}
return false;
}
......@@ -547,7 +547,7 @@ class SolarisWatchService
// if the ENTRY_MODIFY event is not enabled then we don't need
// modification events for entries in the directory
int events = FILE_NOFOLLOW;
if (parent.events().contains(StandardWatchEventKind.ENTRY_MODIFY))
if (parent.events().contains(StandardWatchEventKinds.ENTRY_MODIFY))
events |= (FILE_MODIFIED | FILE_ATTRIB);
DirectoryStream<Path> stream = null;
......@@ -567,7 +567,7 @@ class SolarisWatchService
// send ENTRY_CREATE if enabled
if (sendEvents) {
parent.signalEvent(StandardWatchEventKind.ENTRY_CREATE, name);
parent.signalEvent(StandardWatchEventKinds.ENTRY_CREATE, name);
}
// register it
......@@ -602,12 +602,12 @@ class SolarisWatchService
// update events, rembering if ENTRY_MODIFY was previously
// enabled or disabled.
boolean wasModifyEnabled = key.events()
.contains(StandardWatchEventKind.ENTRY_MODIFY);
.contains(StandardWatchEventKinds.ENTRY_MODIFY);
key.setEvents(events);
// check if ENTRY_MODIFY has changed
boolean isModifyEnabled = events
.contains(StandardWatchEventKind.ENTRY_MODIFY);
.contains(StandardWatchEventKinds.ENTRY_MODIFY);
if (wasModifyEnabled == isModifyEnabled) {
return;
}
......
......@@ -892,8 +892,9 @@ Java_sun_nio_fs_UnixNativeDispatcher_getpwuid(JNIEnv* env, jclass this, jint uid
if (res != 0 || p == NULL || p->pw_name == NULL || *(p->pw_name) == '\0') {
/* not found or error */
if (errno != 0 && errno != ENOENT)
throwUnixException(env, errno);
if (errno == 0)
errno = ENOENT;
throwUnixException(env, errno);
} else {
jsize len = strlen(p->pw_name);
result = (*env)->NewByteArray(env, len);
......@@ -941,14 +942,14 @@ Java_sun_nio_fs_UnixNativeDispatcher_getgrgid(JNIEnv* env, jclass this, jint gid
retry = 0;
if (res != 0 || g == NULL || g->gr_name == NULL || *(g->gr_name) == '\0') {
/* not found or error */
if (errno != 0 && errno != ENOENT) {
if (errno == ERANGE) {
/* insufficient buffer size so need larger buffer */
buflen += ENT_BUF_SIZE;
retry = 1;
} else {
throwUnixException(env, errno);
}
if (errno == ERANGE) {
/* insufficient buffer size so need larger buffer */
buflen += ENT_BUF_SIZE;
retry = 1;
} else {
if (errno == 0)
errno = ENOENT;
throwUnixException(env, errno);
}
} else {
jsize len = strlen(g->gr_name);
......
......@@ -464,15 +464,15 @@ class WindowsWatchService
{
switch (action) {
case FILE_ACTION_MODIFIED :
return StandardWatchEventKind.ENTRY_MODIFY;
return StandardWatchEventKinds.ENTRY_MODIFY;
case FILE_ACTION_ADDED :
case FILE_ACTION_RENAMED_NEW_NAME :
return StandardWatchEventKind.ENTRY_CREATE;
return StandardWatchEventKinds.ENTRY_CREATE;
case FILE_ACTION_REMOVED :
case FILE_ACTION_RENAMED_OLD_NAME :
return StandardWatchEventKind.ENTRY_DELETE;
return StandardWatchEventKinds.ENTRY_DELETE;
default :
return null; // action not recognized
......@@ -548,7 +548,7 @@ class WindowsWatchService
if (info.error() != 0) {
// buffer overflow
if (info.error() == ERROR_NOTIFY_ENUM_DIR) {
key.signalEvent(StandardWatchEventKind.OVERFLOW, null);
key.signalEvent(StandardWatchEventKinds.OVERFLOW, null);
} else {
// other error so cancel key
implCancelKey(key);
......@@ -562,7 +562,7 @@ class WindowsWatchService
processEvents(key, info.bytesTransferred());
} else {
// insufficient buffer size
key.signalEvent(StandardWatchEventKind.OVERFLOW, null);
key.signalEvent(StandardWatchEventKinds.OVERFLOW, null);
}
// start read for next batch of changes
......
......@@ -705,7 +705,7 @@ JNIEXPORT jobject JNICALL Java_sun_security_mscapi_RSAKeyPairGenerator_generateR
HCRYPTPROV hCryptProv = NULL;
HCRYPTKEY hKeyPair;
DWORD dwFlags = (keySize << 16) | CRYPT_EXPORTABLE;
jobject keypair;
jobject keypair = NULL;
const char* pszKeyContainerName = NULL; // UUID
__try
......
......@@ -195,6 +195,9 @@ java/beans/XMLEncoder/6329581/Test6329581.java generic-all
# jdk_lang
# requires junit
java/lang/invoke/InvokeDynamicPrintArgs.java generic-all
# Times out on solaris 10 sparc
java/lang/ClassLoader/Assert.java generic-all
......
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7036199
* @summary Check that GarbageCollectionNotification contents are reasonable
* @author Frederic Parain
* @run main/othervm GarbageCollectionNotificationContentTest
*/
import java.util.*;
import java.lang.management.*;
import java.lang.reflect.*;
import javax.management.*;
import javax.management.openmbean.*;
import com.sun.management.GarbageCollectionNotificationInfo;
import com.sun.management.GcInfo;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.lang.reflect.Field;
public class GarbageCollectionNotificationContentTest {
private static HashMap<String,GarbageCollectionNotificationInfo> listenerInvoked
= new HashMap<String,GarbageCollectionNotificationInfo>();
static volatile long count = 0;
static volatile long number = 0;
static Object synchronizer = new Object();
static class GcListener implements NotificationListener {
public void handleNotification(Notification notif, Object handback) {
String type = notif.getType();
if (type.equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) {
GarbageCollectionNotificationInfo gcNotif =
GarbageCollectionNotificationInfo.from((CompositeData) notif.getUserData());
String source = ((ObjectName)notif.getSource()).getCanonicalName();
synchronized(synchronizer) {
if(listenerInvoked.get(source) == null) {
listenerInvoked.put(((ObjectName)notif.getSource()).getCanonicalName(),gcNotif);
count++;
if(count >= number) {
synchronizer.notify();
}
}
}
}
}
}
public static void main(String[] args) throws Exception {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
final Boolean isNotificationSupported = AccessController.doPrivileged (new PrivilegedAction<Boolean>() {
public Boolean run() {
try {
Class cl = Class.forName("sun.management.VMManagementImpl");
Field f = cl.getDeclaredField("gcNotificationSupport");
f.setAccessible(true);
return f.getBoolean(null);
} catch(ClassNotFoundException e) {
return false;
} catch(NoSuchFieldException e) {
return false;
} catch(IllegalAccessException e) {
return false;
}
}
});
if(!isNotificationSupported) {
System.out.println("GC Notification not supported by the JVM, test skipped");
return;
}
final ObjectName gcMXBeanPattern =
new ObjectName("java.lang:type=GarbageCollector,*");
Set<ObjectName> names =
mbs.queryNames(gcMXBeanPattern, null);
if (names.isEmpty())
throw new Exception("Test incorrect: no GC MXBeans");
number = names.size();
for (ObjectName n : names) {
if(mbs.isInstanceOf(n,"javax.management.NotificationEmitter")) {
listenerInvoked.put(n.getCanonicalName(),null);
GcListener listener = new GcListener();
mbs.addNotificationListener(n, listener, null, null);
}
}
// Invocation of System.gc() to trigger major GC
System.gc();
// Allocation of many short living and small objects to trigger minor GC
Object data[] = new Object[32];
for(int i = 0; i<100000000; i++) {
data[i%32] = new int[8];
}
int wakeup = 0;
synchronized(synchronizer) {
while(count != number) {
synchronizer.wait(10000);
wakeup++;
if(wakeup > 10)
break;
}
}
for (GarbageCollectionNotificationInfo notif : listenerInvoked.values() ) {
checkGarbageCollectionNotificationInfoContent(notif);
}
System.out.println("Test passed");
}
private static void checkGarbageCollectionNotificationInfoContent(GarbageCollectionNotificationInfo notif) throws Exception {
System.out.println("GC notification for "+notif.getGcName());
System.out.print("Action: "+notif.getGcAction());
System.out.println(" Cause: "+notif.getGcCause());
GcInfo info = notif.getGcInfo();
System.out.print("GC Info #" + info.getId());
System.out.print(" start:" + info.getStartTime());
System.out.print(" end:" + info.getEndTime());
System.out.println(" (" + info.getDuration() + "ms)");
Map<String, MemoryUsage> usage = info.getMemoryUsageBeforeGc();
List<String> pnames = new ArrayList<String>();
for (Map.Entry entry : usage.entrySet() ) {
String poolname = (String) entry.getKey();
pnames.add(poolname);
MemoryUsage busage = (MemoryUsage) entry.getValue();
MemoryUsage ausage = (MemoryUsage) info.getMemoryUsageAfterGc().get(poolname);
if (ausage == null) {
throw new RuntimeException("After Gc Memory does not exist" +
" for " + poolname);
}
System.out.println("Usage for pool " + poolname);
System.out.println(" Before GC: " + busage);
System.out.println(" After GC: " + ausage);
}
// check if memory usage for all memory pools are returned
List<MemoryPoolMXBean> pools = ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean p : pools ) {
if (!pnames.contains(p.getName())) {
throw new RuntimeException("GcInfo does not contain " +
"memory usage for pool " + p.getName());
}
}
}
}
/*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 7036199
* @summary Check that GarbageCollection notification are thrown by every GarbageCollectorMXBean
* @author Frederic Parain
* @run main/othervm GarbageCollectionNotificationTest
*/
import java.util.*;
import java.lang.management.*;
import java.lang.reflect.*;
import javax.management.*;
import javax.management.openmbean.*;
import com.sun.management.GarbageCollectionNotificationInfo;
import com.sun.management.GcInfo;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.lang.reflect.Field;
public class GarbageCollectionNotificationTest {
private static HashMap<String,Boolean> listenerInvoked = new HashMap<String,Boolean>();
static volatile long count = 0;
static volatile long number = 0;
static Object synchronizer = new Object();
static class GcListener implements NotificationListener {
public void handleNotification(Notification notif, Object handback) {
String type = notif.getType();
if (type.equals(GarbageCollectionNotificationInfo.GARBAGE_COLLECTION_NOTIFICATION)) {
GarbageCollectionNotificationInfo gcNotif =
GarbageCollectionNotificationInfo.from((CompositeData) notif.getUserData());
String source = ((ObjectName)notif.getSource()).getCanonicalName();
synchronized(synchronizer) {
if(!listenerInvoked.get(source)) {
listenerInvoked.put(((ObjectName)notif.getSource()).getCanonicalName(),true);
count++;
if(count >= number) {
synchronizer.notify();
}
}
}
}
}
}
public static void main(String[] args) throws Exception {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
final Boolean isNotificationSupported = AccessController.doPrivileged (new PrivilegedAction<Boolean>() {
public Boolean run() {
try {
Class cl = Class.forName("sun.management.VMManagementImpl");
Field f = cl.getDeclaredField("gcNotificationSupport");
f.setAccessible(true);
return f.getBoolean(null);
} catch(ClassNotFoundException e) {
return false;
} catch(NoSuchFieldException e) {
return false;
} catch(IllegalAccessException e) {
return false;
}
}
});
if(!isNotificationSupported) {
System.out.println("GC Notification not supported by the JVM, test skipped");
return;
}
final ObjectName gcMXBeanPattern =
new ObjectName("java.lang:type=GarbageCollector,*");
Set<ObjectName> names =
mbs.queryNames(gcMXBeanPattern, null);
if (names.isEmpty())
throw new Exception("Test incorrect: no GC MXBeans");
number = names.size();
for (ObjectName n : names) {
if(mbs.isInstanceOf(n,"javax.management.NotificationEmitter")) {
listenerInvoked.put(n.getCanonicalName(),false);
GcListener listener = new GcListener();
mbs.addNotificationListener(n, listener, null, null);
}
}
// Invocation of System.gc() to trigger major GC
System.gc();
// Allocation of many short living and small objects to trigger minor GC
Object data[] = new Object[32];
for(int i = 0; i<100000000; i++) {
data[i%32] = new int[8];
}
int wakeup = 0;
synchronized(synchronizer) {
while(count != number) {
synchronizer.wait(10000);
wakeup++;
if(wakeup > 10)
break;
}
}
for (String source : listenerInvoked.keySet()) {
if(!listenerInvoked.get(source))
throw new Exception("Test incorrect: notifications have not been sent for "
+ source);
}
System.out.println("Test passed");
}
}
......@@ -40,7 +40,7 @@ import com.sun.nio.sctp.SctpServerChannel;
import com.sun.nio.sctp.SctpSocketOption;
import java.security.AccessController;
import sun.security.action.GetPropertyAction;
import static com.sun.nio.sctp.SctpStandardSocketOption.*;
import static com.sun.nio.sctp.SctpStandardSocketOptions.*;
import static java.lang.System.out;
public class SocketOptionTests {
......
......@@ -48,7 +48,7 @@ import com.sun.nio.sctp.SctpServerChannel;
import com.sun.nio.sctp.SctpSocketOption;
import java.security.AccessController;
import sun.security.action.GetPropertyAction;
import static com.sun.nio.sctp.SctpStandardSocketOption.*;
import static com.sun.nio.sctp.SctpStandardSocketOptions.*;
import static java.lang.System.out;
public class SocketOptionTests {
......
......@@ -29,7 +29,7 @@
import java.nio.channels.*;
import java.net.*;
import static java.net.StandardSocketOption.*;
import static java.net.StandardSocketOptions.*;
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.ExecutionException;
......
......@@ -29,7 +29,7 @@
import java.nio.ByteBuffer;
import java.nio.channels.*;
import static java.net.StandardSocketOption.*;
import static java.net.StandardSocketOptions.*;
import java.net.*;
import java.util.Random;
import java.util.concurrent.*;
......@@ -383,7 +383,7 @@ public class Basic {
// write bytes and close connection
SocketChannel sc = server.accept();
ByteBuffer src = genBuffer();
sc.setOption(StandardSocketOption.SO_SNDBUF, src.remaining());
sc.setOption(StandardSocketOptions.SO_SNDBUF, src.remaining());
while (src.hasRemaining())
sc.write(src);
sc.close();
......
......@@ -52,7 +52,7 @@ public class BasicMulticastTests {
StandardProtocolFamily.INET : StandardProtocolFamily.INET6;
DatagramChannel dc = DatagramChannel.open(family)
.setOption(StandardSocketOption.SO_REUSEADDR, true)
.setOption(StandardSocketOptions.SO_REUSEADDR, true)
.bind(new InetSocketAddress(source, 0));
// check existing key is returned
......@@ -115,7 +115,7 @@ public class BasicMulticastTests {
System.out.println("Exception Tests");
DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)
.setOption(StandardSocketOption.SO_REUSEADDR, true)
.setOption(StandardSocketOptions.SO_REUSEADDR, true)
.bind(new InetSocketAddress(0));
InetAddress group = InetAddress.getByName("225.4.5.6");
......
......@@ -59,7 +59,7 @@ public class MulticastSendReceiveTests {
StandardProtocolFamily.INET6 : StandardProtocolFamily.INET;
DatagramChannel dc = DatagramChannel.open(family)
.bind(new InetSocketAddress(local, 0))
.setOption(StandardSocketOption.IP_MULTICAST_IF, nif);
.setOption(StandardSocketOptions.IP_MULTICAST_IF, nif);
int id = rand.nextInt();
byte[] msg = Integer.toString(id).getBytes("UTF-8");
ByteBuffer buf = ByteBuffer.wrap(msg);
......@@ -146,7 +146,7 @@ public class MulticastSendReceiveTests {
System.out.format("\nTest DatagramChannel to %s socket\n", family.name());
try (DatagramChannel dc = (family == UNSPEC) ?
DatagramChannel.open() : DatagramChannel.open(family)) {
dc.setOption(StandardSocketOption.SO_REUSEADDR, true)
dc.setOption(StandardSocketOptions.SO_REUSEADDR, true)
.bind(new InetSocketAddress(0));
// join group
......
......@@ -31,7 +31,7 @@ import java.nio.channels.*;
import java.net.*;
import java.io.IOException;
import java.util.*;
import static java.net.StandardSocketOption.*;
import static java.net.StandardSocketOptions.*;
public class SocketOptionTests {
......
......@@ -52,13 +52,16 @@ public class ClosedByInterrupt {
fc.write(bb);
}
// test with 1-8 concurrent threads
for (int i=1; i<=8; i++) {
// test with 1-16 concurrent threads
for (int i=1; i<=16; i++) {
System.out.format("%d thread(s)%n", i);
test(f, i);
if (failed)
break;
}
if (failed)
throw new RuntimeException("Test failed");
}
/**
......@@ -132,12 +135,14 @@ public class ClosedByInterrupt {
// give the interruptible thread a chance
try {
Thread.sleep(rand.nextInt(50));
} catch (InterruptedException ignore) { }
} catch (InterruptedException e) {
unexpected(e);
}
}
}
} catch (ClosedByInterruptException e) {
if (interruptible) {
if (Thread.currentThread().isInterrupted()) {
if (Thread.interrupted()) {
expected(e + " thrown and interrupt status set");
} else {
unexpected(e + " thrown but interrupt status not set");
......@@ -158,7 +163,7 @@ public class ClosedByInterrupt {
}
static void expected(Exception e) {
System.out.format("%s (not expected)%n", e);
System.out.format("%s (expected)%n", e);
}
static void expected(String msg) {
......
......@@ -32,7 +32,7 @@ import java.nio.channels.*;
import java.net.*;
import java.io.IOException;
import java.util.*;
import static java.net.StandardSocketOption.*;
import static java.net.StandardSocketOptions.*;
public class SocketOptionTests {
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册