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

Merge

...@@ -38,7 +38,7 @@ FILES_java = \ ...@@ -38,7 +38,7 @@ FILES_java = \
com/sun/nio/sctp/SctpMultiChannel.java \ com/sun/nio/sctp/SctpMultiChannel.java \
com/sun/nio/sctp/SctpServerChannel.java \ com/sun/nio/sctp/SctpServerChannel.java \
com/sun/nio/sctp/SctpSocketOption.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/SendFailedNotification.java \
com/sun/nio/sctp/ShutdownNotification.java \ com/sun/nio/sctp/ShutdownNotification.java \
\ \
......
...@@ -49,6 +49,7 @@ SUNWprivate_1.1 { ...@@ -49,6 +49,7 @@ SUNWprivate_1.1 {
Java_sun_management_Flag_setStringValue; Java_sun_management_Flag_setStringValue;
Java_sun_management_GarbageCollectorImpl_getCollectionCount; Java_sun_management_GarbageCollectorImpl_getCollectionCount;
Java_sun_management_GarbageCollectorImpl_getCollectionTime; Java_sun_management_GarbageCollectorImpl_getCollectionTime;
Java_sun_management_GarbageCollectorImpl_setNotificationEnabled;
Java_sun_management_GcInfoBuilder_fillGcAttributeInfo; Java_sun_management_GcInfoBuilder_fillGcAttributeInfo;
Java_sun_management_GcInfoBuilder_getLastGcInfo0; Java_sun_management_GcInfoBuilder_getLastGcInfo0;
Java_sun_management_GcInfoBuilder_getNumGcExtAttributes; Java_sun_management_GcInfoBuilder_getNumGcExtAttributes;
......
...@@ -71,7 +71,7 @@ FILES_src = \ ...@@ -71,7 +71,7 @@ FILES_src = \
java/nio/charset/CoderMalfunctionError.java \ java/nio/charset/CoderMalfunctionError.java \
java/nio/charset/CodingErrorAction.java \ java/nio/charset/CodingErrorAction.java \
java/nio/charset/MalformedInputException.java \ java/nio/charset/MalformedInputException.java \
java/nio/charset/StandardCharset.java \ java/nio/charset/StandardCharsets.java \
java/nio/charset/UnmappableCharacterException.java \ java/nio/charset/UnmappableCharacterException.java \
\ \
java/nio/charset/spi/CharsetProvider.java \ java/nio/charset/spi/CharsetProvider.java \
...@@ -116,7 +116,7 @@ FILES_src = \ ...@@ -116,7 +116,7 @@ FILES_src = \
java/nio/file/SimpleFileVisitor.java \ java/nio/file/SimpleFileVisitor.java \
java/nio/file/StandardCopyOption.java \ java/nio/file/StandardCopyOption.java \
java/nio/file/StandardOpenOption.java \ java/nio/file/StandardOpenOption.java \
java/nio/file/StandardWatchEventKind.java \ java/nio/file/StandardWatchEventKinds.java \
java/nio/file/TempFileHelper.java \ java/nio/file/TempFileHelper.java \
java/nio/file/WatchEvent.java \ java/nio/file/WatchEvent.java \
java/nio/file/WatchKey.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 { ...@@ -179,7 +179,7 @@ public abstract class MessageInfo {
* completely received. For messages being sent {@code true} indicates that * completely received. For messages being sent {@code true} indicates that
* the message is complete, {@code false} indicates that the message is not * the message is complete, {@code false} indicates that the message is not
* complete. How the send channel interprets this value depends on the value * 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. * SCTP_EXPLICIT_COMPLETE} socket option.
* *
* @return {@code true} if, and only if, the message is complete * @return {@code true} if, and only if, the message is complete
...@@ -192,7 +192,7 @@ public abstract class MessageInfo { ...@@ -192,7 +192,7 @@ public abstract class MessageInfo {
* <P> For messages being sent {@code true} indicates that * <P> For messages being sent {@code true} indicates that
* the message is complete, {@code false} indicates that the message is not * the message is complete, {@code false} indicates that the message is not
* complete. How the send channel interprets this value depends on the value * 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. * SCTP_EXPLICIT_COMPLETE} socket option.
* *
* @param complete * @param complete
......
...@@ -65,55 +65,55 @@ import java.nio.channels.SelectionKey; ...@@ -65,55 +65,55 @@ import java.nio.channels.SelectionKey;
* <th>Description</th> * <th>Description</th>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_DISABLE_FRAGMENTS * <td> {@link SctpStandardSocketOptions#SCTP_DISABLE_FRAGMENTS
* SCTP_DISABLE_FRAGMENTS} </td> * SCTP_DISABLE_FRAGMENTS} </td>
* <td> Enables or disables message fragmentation </td> * <td> Enables or disables message fragmentation </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE * <td> {@link SctpStandardSocketOptions#SCTP_EXPLICIT_COMPLETE
* SCTP_EXPLICIT_COMPLETE} </td> * SCTP_EXPLICIT_COMPLETE} </td>
* <td> Enables or disables explicit message completion </td> * <td> Enables or disables explicit message completion </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE * <td> {@link SctpStandardSocketOptions#SCTP_FRAGMENT_INTERLEAVE
* SCTP_FRAGMENT_INTERLEAVE} </td> * SCTP_FRAGMENT_INTERLEAVE} </td>
* <td> Controls how the presentation of messages occur for the message * <td> Controls how the presentation of messages occur for the message
* receiver </td> * receiver </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS * <td> {@link SctpStandardSocketOptions#SCTP_INIT_MAXSTREAMS
* SCTP_INIT_MAXSTREAMS} </td> * SCTP_INIT_MAXSTREAMS} </td>
* <td> The maximum number of streams requested by the local endpoint during * <td> The maximum number of streams requested by the local endpoint during
* association initialization </td> * association initialization </td>
* </tr> * </tr>
* <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> * <td> Enables or disable a Nagle-like algorithm </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_PRIMARY_ADDR * <td> {@link SctpStandardSocketOptions#SCTP_PRIMARY_ADDR
* SCTP_PRIMARY_ADDR} </td> * SCTP_PRIMARY_ADDR} </td>
* <td> Requests that the local SCTP stack use the given peer address as the * <td> Requests that the local SCTP stack use the given peer address as the
* association primary </td> * association primary </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_SET_PEER_PRIMARY_ADDR * <td> {@link SctpStandardSocketOptions#SCTP_SET_PEER_PRIMARY_ADDR
* SCTP_SET_PEER_PRIMARY_ADDR} </td> * SCTP_SET_PEER_PRIMARY_ADDR} </td>
* <td> Requests that the peer mark the enclosed address as the association * <td> Requests that the peer mark the enclosed address as the association
* primary </td> * primary </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SO_SNDBUF * <td> {@link SctpStandardSocketOptions#SO_SNDBUF
* SO_SNDBUF} </td> * SO_SNDBUF} </td>
* <td> The size of the socket send buffer </td> * <td> The size of the socket send buffer </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SO_RCVBUF * <td> {@link SctpStandardSocketOptions#SO_RCVBUF
* SO_RCVBUF} </td> * SO_RCVBUF} </td>
* <td> The size of the socket receive buffer </td> * <td> The size of the socket receive buffer </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SO_LINGER * <td> {@link SctpStandardSocketOptions#SO_LINGER
* SO_LINGER} </td> * SO_LINGER} </td>
* <td> Linger on close if data is present (when configured in blocking mode * <td> Linger on close if data is present (when configured in blocking mode
* only) </td> * only) </td>
...@@ -449,7 +449,7 @@ public abstract class SctpChannel ...@@ -449,7 +449,7 @@ public abstract class SctpChannel
* <P> This is a convience method and is equivalent to evaluating the * <P> This is a convience method and is equivalent to evaluating the
* following expression: * following expression:
* <blockquote><pre> * <blockquote><pre>
* setOption(SctpStandardSocketOption.SCTP_INIT_MAXSTREAMS, SctpStandardSocketOption.InitMaxStreams.create(maxInStreams, maxOutStreams)) * setOption(SctpStandardSocketOptions.SCTP_INIT_MAXSTREAMS, SctpStandardSocketOption.InitMaxStreams.create(maxInStreams, maxOutStreams))
* .connect(remote); * .connect(remote);
* </pre></blockquote> * </pre></blockquote>
* *
...@@ -651,7 +651,7 @@ public abstract class SctpChannel ...@@ -651,7 +651,7 @@ public abstract class SctpChannel
* @throws IOException * @throws IOException
* If an I/O error occurs * If an I/O error occurs
* *
* @see SctpStandardSocketOption * @see SctpStandardSocketOptions
*/ */
public abstract <T> T getOption(SctpSocketOption<T> name) public abstract <T> T getOption(SctpSocketOption<T> name)
throws IOException; throws IOException;
...@@ -680,7 +680,7 @@ public abstract class SctpChannel ...@@ -680,7 +680,7 @@ public abstract class SctpChannel
* @throws IOException * @throws IOException
* If an I/O error occurs * If an I/O error occurs
* *
* @see SctpStandardSocketOption * @see SctpStandardSocketOptions
*/ */
public abstract <T> SctpChannel setOption(SctpSocketOption<T> name, T value) public abstract <T> SctpChannel setOption(SctpSocketOption<T> name, T value)
throws IOException; throws IOException;
...@@ -731,7 +731,7 @@ public abstract class SctpChannel ...@@ -731,7 +731,7 @@ public abstract class SctpChannel
* MessageInfo} will return {@code false}, and more invocations of this * MessageInfo} will return {@code false}, and more invocations of this
* method will be necessary to completely consume the messgae. Only * method will be necessary to completely consume the messgae. Only
* one message at a time will be partially delivered in any stream. The * 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 * SCTP_FRAGMENT_INTERLEAVE} controls various aspects of what interlacing of
* messages occurs. * messages occurs.
* *
...@@ -804,7 +804,7 @@ public abstract class SctpChannel ...@@ -804,7 +804,7 @@ public abstract class SctpChannel
* and sufficient room becomes available, then the remaining bytes in the * and sufficient room becomes available, then the remaining bytes in the
* given byte buffer are transmitted as a single message. Sending a message * given byte buffer are transmitted as a single message. Sending a message
* is atomic unless explicit message completion {@link * 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. * socket option is enabled on this channel's socket.
* *
* <P> The message is transferred from the byte buffer as if by a regular * <P> The message is transferred from the byte buffer as if by a regular
......
...@@ -69,55 +69,55 @@ import java.nio.channels.SelectionKey; ...@@ -69,55 +69,55 @@ import java.nio.channels.SelectionKey;
* <th>Description</th> * <th>Description</th>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_DISABLE_FRAGMENTS * <td> {@link SctpStandardSocketOptions#SCTP_DISABLE_FRAGMENTS
* SCTP_DISABLE_FRAGMENTS} </td> * SCTP_DISABLE_FRAGMENTS} </td>
* <td> Enables or disables message fragmentation </td> * <td> Enables or disables message fragmentation </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_EXPLICIT_COMPLETE * <td> {@link SctpStandardSocketOptions#SCTP_EXPLICIT_COMPLETE
* SCTP_EXPLICIT_COMPLETE} </td> * SCTP_EXPLICIT_COMPLETE} </td>
* <td> Enables or disables explicit message completion </td> * <td> Enables or disables explicit message completion </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_FRAGMENT_INTERLEAVE * <td> {@link SctpStandardSocketOptions#SCTP_FRAGMENT_INTERLEAVE
* SCTP_FRAGMENT_INTERLEAVE} </td> * SCTP_FRAGMENT_INTERLEAVE} </td>
* <td> Controls how the presentation of messages occur for the message * <td> Controls how the presentation of messages occur for the message
* receiver </td> * receiver </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS * <td> {@link SctpStandardSocketOptions#SCTP_INIT_MAXSTREAMS
* SCTP_INIT_MAXSTREAMS} </td> * SCTP_INIT_MAXSTREAMS} </td>
* <td> The maximum number of streams requested by the local endpoint during * <td> The maximum number of streams requested by the local endpoint during
* association initialization </td> * association initialization </td>
* </tr> * </tr>
* <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> * <td> Enables or disable a Nagle-like algorithm </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_PRIMARY_ADDR * <td> {@link SctpStandardSocketOptions#SCTP_PRIMARY_ADDR
* SCTP_PRIMARY_ADDR} </td> * SCTP_PRIMARY_ADDR} </td>
* <td> Requests that the local SCTP stack use the given peer address as the * <td> Requests that the local SCTP stack use the given peer address as the
* association primary </td> * association primary </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_SET_PEER_PRIMARY_ADDR * <td> {@link SctpStandardSocketOptions#SCTP_SET_PEER_PRIMARY_ADDR
* SCTP_SET_PEER_PRIMARY_ADDR} </td> * SCTP_SET_PEER_PRIMARY_ADDR} </td>
* <td> Requests that the peer mark the enclosed address as the association * <td> Requests that the peer mark the enclosed address as the association
* primary </td> * primary </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SO_SNDBUF * <td> {@link SctpStandardSocketOptions#SO_SNDBUF
* SO_SNDBUF} </td> * SO_SNDBUF} </td>
* <td> The size of the socket send buffer </td> * <td> The size of the socket send buffer </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SO_RCVBUF * <td> {@link SctpStandardSocketOptions#SO_RCVBUF
* SO_RCVBUF} </td> * SO_RCVBUF} </td>
* <td> The size of the socket receive buffer </td> * <td> The size of the socket receive buffer </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SO_LINGER * <td> {@link SctpStandardSocketOptions#SO_LINGER
* SO_LINGER} </td> * SO_LINGER} </td>
* <td> Linger on close if data is present (when configured in blocking mode * <td> Linger on close if data is present (when configured in blocking mode
* only) </td> * only) </td>
...@@ -450,7 +450,7 @@ public abstract class SctpMultiChannel ...@@ -450,7 +450,7 @@ public abstract class SctpMultiChannel
* @throws IOException * @throws IOException
* If an I/O error occurs * If an I/O error occurs
* *
* @see SctpStandardSocketOption * @see SctpStandardSocketOptions
*/ */
public abstract <T> T getOption(SctpSocketOption<T> name, public abstract <T> T getOption(SctpSocketOption<T> name,
Association association) Association association)
...@@ -489,7 +489,7 @@ public abstract class SctpMultiChannel ...@@ -489,7 +489,7 @@ public abstract class SctpMultiChannel
* @throws IOException * @throws IOException
* If an I/O error occurs * If an I/O error occurs
* *
* @see SctpStandardSocketOption * @see SctpStandardSocketOptions
*/ */
public abstract <T> SctpMultiChannel setOption(SctpSocketOption<T> name, public abstract <T> SctpMultiChannel setOption(SctpSocketOption<T> name,
T value, T value,
...@@ -542,7 +542,7 @@ public abstract class SctpMultiChannel ...@@ -542,7 +542,7 @@ public abstract class SctpMultiChannel
* MessageInfo} will return {@code false}, and more invocations of this * MessageInfo} will return {@code false}, and more invocations of this
* method will be necessary to completely consume the messgae. Only * method will be necessary to completely consume the messgae. Only
* one message at a time will be partially delivered in any stream. The * 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 * SCTP_FRAGMENT_INTERLEAVE} controls various aspects of what interlacing of
* messages occurs. * messages occurs.
* *
...@@ -635,14 +635,14 @@ public abstract class SctpMultiChannel ...@@ -635,14 +635,14 @@ public abstract class SctpMultiChannel
* underlying output buffer, then the remaining bytes in the given byte * underlying output buffer, then the remaining bytes in the given byte
* buffer are transmitted as a single message. Sending a message * buffer are transmitted as a single message. Sending a message
* is atomic unless explicit message completion {@link * 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. * socket option is enabled on this channel's socket.
* *
* <P> If this channel is in non-blocking mode, there is sufficient room * <P> If this channel is in non-blocking mode, there is sufficient room
* in the underlying output buffer, and an implicit association setup is * in the underlying output buffer, and an implicit association setup is
* required, then the remaining bytes in the given byte buffer are * required, then the remaining bytes in the given byte buffer are
* transmitted as a single message, subject to {@link * 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 * If for any reason the message cannot
* be delivered an {@link AssociationChangeNotification association * be delivered an {@link AssociationChangeNotification association
* changed} notification is put on the SCTP stack with its {@code event} parameter set * changed} notification is put on the SCTP stack with its {@code event} parameter set
......
...@@ -53,7 +53,7 @@ import java.nio.channels.spi.AbstractSelectableChannel; ...@@ -53,7 +53,7 @@ import java.nio.channels.spi.AbstractSelectableChannel;
* <th>Description</th> * <th>Description</th>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link SctpStandardSocketOption#SCTP_INIT_MAXSTREAMS * <td> {@link SctpStandardSocketOptions#SCTP_INIT_MAXSTREAMS
* SCTP_INIT_MAXSTREAMS} </td> * SCTP_INIT_MAXSTREAMS} </td>
* <td> The maximum number of streams requested by the local endpoint during * <td> The maximum number of streams requested by the local endpoint during
* association initialization </td> * association initialization </td>
...@@ -360,7 +360,7 @@ public abstract class SctpServerChannel ...@@ -360,7 +360,7 @@ public abstract class SctpServerChannel
* @throws IOException * @throws IOException
* If an I/O error occurs * If an I/O error occurs
* *
* @see SctpStandardSocketOption * @see SctpStandardSocketOptions
*/ */
public abstract <T> T getOption(SctpSocketOption<T> name) throws IOException; public abstract <T> T getOption(SctpSocketOption<T> name) throws IOException;
...@@ -388,7 +388,7 @@ public abstract class SctpServerChannel ...@@ -388,7 +388,7 @@ public abstract class SctpServerChannel
* @throws IOException * @throws IOException
* If an I/O error occurs * If an I/O error occurs
* *
* @see SctpStandardSocketOption * @see SctpStandardSocketOptions
*/ */
public abstract <T> SctpServerChannel setOption(SctpSocketOption<T> name, public abstract <T> SctpServerChannel setOption(SctpSocketOption<T> name,
T value) T value)
......
...@@ -33,6 +33,6 @@ import java.net.SocketOption; ...@@ -33,6 +33,6 @@ import java.net.SocketOption;
* *
* @since 1.7 * @since 1.7
* *
* @see SctpStandardSocketOption * @see SctpStandardSocketOptions
*/ */
public interface SctpSocketOption<T> extends SocketOption<T> { } public interface SctpSocketOption<T> extends SocketOption<T> { }
...@@ -34,8 +34,8 @@ import sun.nio.ch.SctpStdSocketOption; ...@@ -34,8 +34,8 @@ import sun.nio.ch.SctpStdSocketOption;
* *
* @since 1.7 * @since 1.7
*/ */
public class SctpStandardSocketOption { public class SctpStandardSocketOptions {
private SctpStandardSocketOption() {} private SctpStandardSocketOptions() {}
/** /**
* Enables or disables message fragmentation. * Enables or disables message fragmentation.
* *
...@@ -127,7 +127,7 @@ public class SctpStandardSocketOption { ...@@ -127,7 +127,7 @@ public class SctpStandardSocketOption {
* association initialization. * association initialization.
* *
* <P> The value of this socket option is an {@link * <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 * the maximum number of inbound and outbound streams that an association
* on the channel is prepared to support. * on the channel is prepared to support.
* *
...@@ -157,9 +157,9 @@ public class SctpStandardSocketOption { ...@@ -157,9 +157,9 @@ public class SctpStandardSocketOption {
* the endpoints default value. * the endpoints default value.
*/ */
public static final SctpSocketOption public static final SctpSocketOption
<SctpStandardSocketOption.InitMaxStreams> SCTP_INIT_MAXSTREAMS = <SctpStandardSocketOptions.InitMaxStreams> SCTP_INIT_MAXSTREAMS =
new SctpStdSocketOption<SctpStandardSocketOption.InitMaxStreams>( new SctpStdSocketOption<SctpStandardSocketOptions.InitMaxStreams>(
"SCTP_INIT_MAXSTREAMS", SctpStandardSocketOption.InitMaxStreams.class); "SCTP_INIT_MAXSTREAMS", SctpStandardSocketOptions.InitMaxStreams.class);
/** /**
* Enables or disables a Nagle-like algorithm. * Enables or disables a Nagle-like algorithm.
...@@ -310,7 +310,7 @@ public class SctpStandardSocketOption { ...@@ -310,7 +310,7 @@ public class SctpStandardSocketOption {
* This class is used to set the maximum number of inbound/outbound streams * This class is used to set the maximum number of inbound/outbound streams
* used by the local endpoint during association initialization. An * used by the local endpoint during association initialization. An
* instance of this class is used to set the {@link * 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. * socket option.
* *
* @since 1.7 * @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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -32,7 +32,7 @@ import java.lang.annotation.*; ...@@ -32,7 +32,7 @@ import java.lang.annotation.*;
* constructor does not perform potentially unsafe operations on its * constructor does not perform potentially unsafe operations on its
* varargs parameter. Applying this annotation to a method or * varargs parameter. Applying this annotation to a method or
* constructor suppresses unchecked warnings about a * 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 * unchecked warnings about parameterized array creation at call
* sites. * sites.
* *
...@@ -41,11 +41,10 @@ import java.lang.annotation.*; ...@@ -41,11 +41,10 @@ import java.lang.annotation.*;
* additional usage restrictions on this annotation type; it is a * additional usage restrictions on this annotation type; it is a
* compile-time error if a method or constructor declaration is * compile-time error if a method or constructor declaration is
* annotated with a {@code @SafeVarargs} annotation, and either: * annotated with a {@code @SafeVarargs} annotation, and either:
* <ul> * <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}. * {@code static} nor {@code final}.
* *
* </ul> * </ul>
...@@ -55,15 +54,28 @@ import java.lang.annotation.*; ...@@ -55,15 +54,28 @@ import java.lang.annotation.*;
* *
* <ul> * <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}. * which includes primitive types, {@code Object}, and {@code String}.
* (The unchecked warnings this annotation type suppresses already do * (The unchecked warnings this annotation type suppresses already do
* not occur for a reifiable element type.) * not occur for a reifiable element type.)
* *
* <li> The body of the method or constructor declaration performs * <li> The body of the method or constructor declaration performs
* potentially unsafe operations, such as an assignment to an element * potentially unsafe operations, such as an assignment to an element
* of the variable-arity parameter's array that generates an unchecked * of the variable arity parameter's array that generates an unchecked
* warning. * 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 * <p>Future versions of the platform may mandate compiler errors for
* such unsafe operations. * such unsafe operations.
......
...@@ -336,7 +336,10 @@ public class Throwable implements Serializable { ...@@ -336,7 +336,10 @@ public class Throwable implements Serializable {
* Disabling of suppression should only occur in exceptional * Disabling of suppression should only occur in exceptional
* circumstances where special requirements exist, such as a * circumstances where special requirements exist, such as a
* virtual machine reusing exception objects under low-memory * 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 message the detail message.
* @param cause the cause. (A {@code null} value is permitted, * @param cause the cause. (A {@code null} value is permitted,
...@@ -423,6 +426,18 @@ public class Throwable implements Serializable { ...@@ -423,6 +426,18 @@ public class Throwable implements Serializable {
* {@link #Throwable(String,Throwable)}, this method cannot be called * {@link #Throwable(String,Throwable)}, this method cannot be called
* even once. * 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 * @param cause the cause (which is saved for later retrieval by the
* {@link #getCause()} method). (A {@code null} value is * {@link #getCause()} method). (A {@code null} value is
* permitted, and indicates that the cause is nonexistent or * permitted, and indicates that the cause is nonexistent or
...@@ -788,7 +803,8 @@ public class Throwable implements Serializable { ...@@ -788,7 +803,8 @@ public class Throwable implements Serializable {
* this throwable is permitted to return a zero-length array from this * this throwable is permitted to return a zero-length array from this
* method. Generally speaking, the array returned by this method will * method. Generally speaking, the array returned by this method will
* contain one element for every frame that would be printed by * 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 * @return an array of stack trace elements representing the stack trace
* pertaining to this throwable. * pertaining to this throwable.
...@@ -971,8 +987,8 @@ public class Throwable implements Serializable { ...@@ -971,8 +987,8 @@ public class Throwable implements Serializable {
/** /**
* Appends the specified exception to the exceptions that were * Appends the specified exception to the exceptions that were
* suppressed in order to deliver this exception. This method is * suppressed in order to deliver this exception. This method is
* typically called (automatically and implicitly) by the {@code * thread-safe and typically called (automatically and implicitly)
* try}-with-resources statement. * by the {@code try}-with-resources statement.
* *
* <p>The suppression behavior is enabled <em>unless</em> disabled * <p>The suppression behavior is enabled <em>unless</em> disabled
* {@linkplain #Throwable(String, Throwable, boolean, boolean) via * {@linkplain #Throwable(String, Throwable, boolean, boolean) via
...@@ -1043,7 +1059,9 @@ public class Throwable implements Serializable { ...@@ -1043,7 +1059,9 @@ public class Throwable implements Serializable {
* *
* If no exceptions were suppressed or {@linkplain * If no exceptions were suppressed or {@linkplain
* #Throwable(String, Throwable, boolean, boolean) suppression is * #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 * @return an array containing all of the exceptions that were
* suppressed to deliver this exception. * suppressed to deliver this exception.
......
...@@ -38,7 +38,7 @@ package java.net; ...@@ -38,7 +38,7 @@ package java.net;
* *
* @since 1.7 * @since 1.7
* *
* @see StandardSocketOption * @see StandardSocketOptions
*/ */
public interface SocketOption<T> { public interface SocketOption<T> {
......
...@@ -38,8 +38,8 @@ package java.net; ...@@ -38,8 +38,8 @@ package java.net;
* @since 1.7 * @since 1.7
*/ */
public final class StandardSocketOption { public final class StandardSocketOptions {
private StandardSocketOption() { } private StandardSocketOptions() { }
// -- SOL_SOCKET -- // -- SOL_SOCKET --
......
...@@ -58,11 +58,11 @@ import java.io.IOException; ...@@ -58,11 +58,11 @@ import java.io.IOException;
* <th>Description</th> * <th>Description</th>
* </tr> * </tr>
* <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> * <td> The size of the socket receive buffer </td>
* </tr> * </tr>
* <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> * <td> Re-use address </td>
* </tr> * </tr>
* </table> * </table>
......
...@@ -68,23 +68,23 @@ import java.nio.ByteBuffer; ...@@ -68,23 +68,23 @@ import java.nio.ByteBuffer;
* <th>Description</th> * <th>Description</th>
* </tr> * </tr>
* <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> * <td> The size of the socket send buffer </td>
* </tr> * </tr>
* <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> * <td> The size of the socket receive buffer </td>
* </tr> * </tr>
* <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> * <td> Keep connection alive </td>
* </tr> * </tr>
* <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> * <td> Re-use address </td>
* </tr> * </tr>
* <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> * <td> Disable the Nagle algorithm </td>
* </tr> * </tr>
* </table> * </table>
......
...@@ -63,37 +63,37 @@ import java.nio.channels.spi.SelectorProvider; ...@@ -63,37 +63,37 @@ import java.nio.channels.spi.SelectorProvider;
* <th>Description</th> * <th>Description</th>
* </tr> * </tr>
* <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> * <td> The size of the socket send buffer </td>
* </tr> * </tr>
* <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> * <td> The size of the socket receive buffer </td>
* </tr> * </tr>
* <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> * <td> Re-use address </td>
* </tr> * </tr>
* <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> * <td> Allow transmission of broadcast datagrams </td>
* </tr> * </tr>
* <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> * <td> The Type of Service (ToS) octet in the Internet Protocol (IP) header </td>
* </tr> * </tr>
* <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> * <td> The network interface for Internet Protocol (IP) multicast datagrams </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link java.net.StandardSocketOption#IP_MULTICAST_TTL * <td> {@link java.net.StandardSocketOptions#IP_MULTICAST_TTL
* IP_MULTICAST_TTL} </td> * IP_MULTICAST_TTL} </td>
* <td> The <em>time-to-live</em> for Internet Protocol (IP) multicast * <td> The <em>time-to-live</em> for Internet Protocol (IP) multicast
* datagrams </td> * datagrams </td>
* </tr> * </tr>
* <tr> * <tr>
* <td> {@link java.net.StandardSocketOption#IP_MULTICAST_LOOP * <td> {@link java.net.StandardSocketOptions#IP_MULTICAST_LOOP
* IP_MULTICAST_LOOP} </td> * IP_MULTICAST_LOOP} </td>
* <td> Loopback for Internet Protocol (IP) multicast datagrams </td> * <td> Loopback for Internet Protocol (IP) multicast datagrams </td>
* </tr> * </tr>
......
...@@ -30,7 +30,7 @@ import java.net.NetworkInterface; ...@@ -30,7 +30,7 @@ import java.net.NetworkInterface;
import java.io.IOException; import java.io.IOException;
import java.net.ProtocolFamily; // javadoc import java.net.ProtocolFamily; // javadoc
import java.net.StandardProtocolFamily; // 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. * A network channel that supports Internet Protocol (IP) multicasting.
...@@ -93,7 +93,7 @@ import java.net.StandardSocketOption; // javadoc ...@@ -93,7 +93,7 @@ import java.net.StandardSocketOption; // javadoc
* a specific address, rather than the wildcard address then it is implementation * a specific address, rather than the wildcard address then it is implementation
* specific if multicast datagrams are received by the socket. </p></li> * 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 * enabled prior to {@link NetworkChannel#bind binding} the socket. This is
* required to allow multiple members of the group to bind to the same * required to allow multiple members of the group to bind to the same
* address. </p></li> * address. </p></li>
...@@ -107,9 +107,9 @@ import java.net.StandardSocketOption; // javadoc ...@@ -107,9 +107,9 @@ import java.net.StandardSocketOption; // javadoc
* NetworkInterface ni = NetworkInterface.getByName("hme0"); * NetworkInterface ni = NetworkInterface.getByName("hme0");
* *
* DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET) * DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)
* .setOption(StandardSocketOption.SO_REUSEADDR, true) * .setOption(StandardSocketOptions.SO_REUSEADDR, true)
* .bind(new InetSocketAddress(5000)) * .bind(new InetSocketAddress(5000))
* .setOption(StandardSocketOption.IP_MULTICAST_IF, ni); * .setOption(StandardSocketOptions.IP_MULTICAST_IF, ni);
* *
* InetAddress group = InetAddress.getByName("225.4.5.6"); * InetAddress group = InetAddress.getByName("225.4.5.6");
* *
......
...@@ -124,7 +124,7 @@ public interface NetworkChannel ...@@ -124,7 +124,7 @@ public interface NetworkChannel
* @throws IOException * @throws IOException
* If an I/O error occurs * If an I/O error occurs
* *
* @see java.net.StandardSocketOption * @see java.net.StandardSocketOptions
*/ */
<T> NetworkChannel setOption(SocketOption<T> name, T value) throws IOException; <T> NetworkChannel setOption(SocketOption<T> name, T value) throws IOException;
...@@ -144,7 +144,7 @@ public interface NetworkChannel ...@@ -144,7 +144,7 @@ public interface NetworkChannel
* @throws IOException * @throws IOException
* If an I/O error occurs * If an I/O error occurs
* *
* @see java.net.StandardSocketOption * @see java.net.StandardSocketOptions
*/ */
<T> T getOption(SocketOption<T> name) throws IOException; <T> T getOption(SocketOption<T> name) throws IOException;
......
...@@ -52,11 +52,11 @@ import java.nio.channels.spi.SelectorProvider; ...@@ -52,11 +52,11 @@ import java.nio.channels.spi.SelectorProvider;
* <th>Description</th> * <th>Description</th>
* </tr> * </tr>
* <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> * <td> The size of the socket receive buffer </td>
* </tr> * </tr>
* <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> * <td> Re-use address </td>
* </tr> * </tr>
* </table> * </table>
......
...@@ -72,28 +72,28 @@ import java.nio.channels.spi.SelectorProvider; ...@@ -72,28 +72,28 @@ import java.nio.channels.spi.SelectorProvider;
* <th>Description</th> * <th>Description</th>
* </tr> * </tr>
* <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> * <td> The size of the socket send buffer </td>
* </tr> * </tr>
* <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> * <td> The size of the socket receive buffer </td>
* </tr> * </tr>
* <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> * <td> Keep connection alive </td>
* </tr> * </tr>
* <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> * <td> Re-use address </td>
* </tr> * </tr>
* <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 * <td> Linger on close if data is present (when configured in blocking mode
* only) </td> * only) </td>
* </tr> * </tr>
* <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> * <td> Disable the Nagle algorithm </td>
* </tr> * </tr>
* </table> * </table>
......
...@@ -215,7 +215,7 @@ import sun.security.action.GetPropertyAction; ...@@ -215,7 +215,7 @@ import sun.security.action.GetPropertyAction;
* determined during virtual-machine startup and typically depends upon the * determined during virtual-machine startup and typically depends upon the
* locale and charset being used by the underlying operating system. </p> * 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. * standard charsets.
* *
* <h4>Terminology</h4> * <h4>Terminology</h4>
......
...@@ -32,10 +32,10 @@ package java.nio.charset; ...@@ -32,10 +32,10 @@ package java.nio.charset;
* @see <a href="Charset#standard">Standard Charsets</a> * @see <a href="Charset#standard">Standard Charsets</a>
* @since 1.7 * @since 1.7
*/ */
public final class StandardCharset { public final class StandardCharsets {
private StandardCharset() { private StandardCharsets() {
throw new AssertionError("No java.nio.charset.StandardCharset instances for you!"); 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 * 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; ...@@ -72,7 +72,7 @@ import java.util.Iterator;
* directory and is UTF-8 encoded. * directory and is UTF-8 encoded.
* <pre> * <pre>
* Path path = FileSystems.getDefault().getPath("logs", "access.log"); * 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> * </pre>
* *
* <a name="interop"><h4>Interoperability</h4></a> * <a name="interop"><h4>Interoperability</h4></a>
...@@ -609,11 +609,11 @@ public interface Path ...@@ -609,11 +609,11 @@ public interface Path
* directory can be watched. The {@code events} parameter is the events to * directory can be watched. The {@code events} parameter is the events to
* register and may contain the following events: * register and may contain the following events:
* <ul> * <ul>
* <li>{@link StandardWatchEventKind#ENTRY_CREATE ENTRY_CREATE} - * <li>{@link StandardWatchEventKinds#ENTRY_CREATE ENTRY_CREATE} -
* entry created or moved into the directory</li> * 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> * 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> * entry in directory was modified</li>
* </ul> * </ul>
* *
...@@ -622,7 +622,7 @@ public interface Path ...@@ -622,7 +622,7 @@ public interface Path
* that locates the directory entry that is created, deleted, or modified. * that locates the directory entry that is created, deleted, or modified.
* *
* <p> The set of events may include additional implementation specific * <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 * <p> The {@code modifiers} parameter specifies <em>modifiers</em> that
* qualify how the directory is registered. This release does not define any * qualify how the directory is registered. This release does not define any
......
...@@ -31,8 +31,8 @@ package java.nio.file; ...@@ -31,8 +31,8 @@ package java.nio.file;
* @since 1.7 * @since 1.7
*/ */
public final class StandardWatchEventKind { public final class StandardWatchEventKinds {
private StandardWatchEventKind() { } private StandardWatchEventKinds() { }
/** /**
* A special event to indicate that events may have been lost or * A special event to indicate that events may have been lost or
...@@ -44,8 +44,8 @@ public final class StandardWatchEventKind { ...@@ -44,8 +44,8 @@ public final class StandardWatchEventKind {
* *
* @see WatchService * @see WatchService
*/ */
public static final WatchEvent.Kind<Void> OVERFLOW = public static final WatchEvent.Kind<Object> OVERFLOW =
new StdWatchEventKind<Void>("OVERFLOW", Void.class); new StdWatchEventKind<Object>("OVERFLOW", Object.class);
/** /**
* Directory entry created. * Directory entry created.
......
...@@ -50,7 +50,7 @@ public interface WatchEvent<T> { ...@@ -50,7 +50,7 @@ public interface WatchEvent<T> {
* An event kind, for the purposes of identification. * An event kind, for the purposes of identification.
* *
* @since 1.7 * @since 1.7
* @see StandardWatchEventKind * @see StandardWatchEventKinds
*/ */
public static interface Kind<T> { public static interface Kind<T> {
/** /**
...@@ -98,9 +98,9 @@ public interface WatchEvent<T> { ...@@ -98,9 +98,9 @@ public interface WatchEvent<T> {
/** /**
* Returns the context for the event. * Returns the context for the event.
* *
* <p> In the case of {@link StandardWatchEventKind#ENTRY_CREATE ENTRY_CREATE}, * <p> In the case of {@link StandardWatchEventKinds#ENTRY_CREATE ENTRY_CREATE},
* {@link StandardWatchEventKind#ENTRY_DELETE ENTRY_DELETE}, and {@link * {@link StandardWatchEventKinds#ENTRY_DELETE ENTRY_DELETE}, and {@link
* StandardWatchEventKind#ENTRY_MODIFY ENTRY_MODIFY} events the context is * StandardWatchEventKinds#ENTRY_MODIFY ENTRY_MODIFY} events the context is
* a {@code Path} that is the {@link Path#relativize relative} path between * a {@code Path} that is the {@link Path#relativize relative} path between
* the directory registered with the watch service, and the entry that is * the directory registered with the watch service, and the entry that is
* created, deleted, or modified. * created, deleted, or modified.
......
...@@ -68,7 +68,7 @@ import java.util.concurrent.TimeUnit; ...@@ -68,7 +68,7 @@ import java.util.concurrent.TimeUnit;
* of events that it may accumulate. Where an implementation <em>knowingly</em> * of events that it may accumulate. Where an implementation <em>knowingly</em>
* discards events then it arranges for the key's {@link WatchKey#pollEvents * discards events then it arranges for the key's {@link WatchKey#pollEvents
* pollEvents} method to return an element with an event type of {@link * 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. * 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 * <p> When an event is reported to indicate that a file in a watched directory
...@@ -87,7 +87,7 @@ import java.util.concurrent.TimeUnit; ...@@ -87,7 +87,7 @@ import java.util.concurrent.TimeUnit;
* are detected, their timeliness, and whether their ordering is preserved are * are detected, their timeliness, and whether their ordering is preserved are
* highly implementation specific. For example, when a file in a watched * highly implementation specific. For example, when a file in a watched
* directory is modified then it may result in a single {@link * 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 * implementations but several events in other implementations. Short-lived
* files (meaning files that are deleted very quickly after they are created) * files (meaning files that are deleted very quickly after they are created)
* may not be detected by primitive implementations that periodically poll the * may not be detected by primitive implementations that periodically poll the
......
...@@ -53,7 +53,7 @@ public interface Watchable { ...@@ -53,7 +53,7 @@ public interface Watchable {
* those specified by the {@code events} and {@code modifiers} parameters. * those specified by the {@code events} and {@code modifiers} parameters.
* Changing the event set does not cause pending events for the object to be * Changing the event set does not cause pending events for the object to be
* discarded. Objects are automatically registered for the {@link * 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. * required to be present in the array of events.
* *
* <p> Otherwise the file system object has not yet been registered with the * <p> Otherwise the file system object has not yet been registered with the
......
...@@ -89,7 +89,7 @@ public class BatchUpdateException extends SQLException { ...@@ -89,7 +89,7 @@ public class BatchUpdateException extends SQLException {
* The <code>cause</code> is not initialized, and may subsequently be * The <code>cause</code> is not initialized, and may subsequently be
* initialized by a call to the * initialized by a call to the
* {@link Throwable#initCause(java.lang.Throwable)} method. The vendor code * {@link Throwable#initCause(java.lang.Throwable)} method. The vendor code
* is intialized to 0. * is initialized to 0.
* <p> * <p>
* *
* @param reason a description of the exception * @param reason a description of the exception
...@@ -188,7 +188,7 @@ public class BatchUpdateException extends SQLException { ...@@ -188,7 +188,7 @@ public class BatchUpdateException extends SQLException {
* @since 1.6 * @since 1.6
*/ */
public BatchUpdateException(Throwable cause) { 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 { ...@@ -214,7 +214,7 @@ public class BatchUpdateException extends SQLException {
* @since 1.6 * @since 1.6
*/ */
public BatchUpdateException(int []updateCounts , Throwable cause) { 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; ...@@ -826,7 +826,7 @@ import sun.misc.FormattedFloatingDecimal;
* *
* <li> <a href="#dndec"><b>Float and Double</b></a> * <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> * </ol>
* *
...@@ -1362,7 +1362,7 @@ import sun.misc.FormattedFloatingDecimal; ...@@ -1362,7 +1362,7 @@ import sun.misc.FormattedFloatingDecimal;
* precision is not provided, then all of the digits as returned by {@link * precision is not provided, then all of the digits as returned by {@link
* Double#toHexString(double)} will be output. * 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 * <p> The following conversions may be applied {@link java.math.BigDecimal
* BigDecimal}. * BigDecimal}.
...@@ -1372,7 +1372,7 @@ import sun.misc.FormattedFloatingDecimal; ...@@ -1372,7 +1372,7 @@ import sun.misc.FormattedFloatingDecimal;
* <tr><td valign="top"> {@code 'e'} * <tr><td valign="top"> {@code 'e'}
* <td valign="top"> <tt>'&#92;u0065'</tt> * <td valign="top"> <tt>'&#92;u0065'</tt>
* <td> Requires the output to be formatted using <a * <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. * href="#l10n algorithm">localization algorithm</a> is applied.
* *
* <p> The formatting of the magnitude <i>m</i> depends upon its value. * <p> The formatting of the magnitude <i>m</i> depends upon its value.
...@@ -1427,11 +1427,11 @@ import sun.misc.FormattedFloatingDecimal; ...@@ -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 * <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 * 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 * <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 * 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 * <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 * precision. If the precision is not specified, then the default value is
...@@ -1447,7 +1447,7 @@ import sun.misc.FormattedFloatingDecimal; ...@@ -1447,7 +1447,7 @@ import sun.misc.FormattedFloatingDecimal;
* *
* <tr><td valign="top"> {@code 'f'} * <tr><td valign="top"> {@code 'f'}
* <td valign="top"> <tt>'&#92;u0066'</tt> * <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 * format</a>. The <a href="#l10n algorithm">localization algorithm</a> is
* applied. * applied.
* *
......
...@@ -159,7 +159,7 @@ import java.util.concurrent.locks.LockSupport; ...@@ -159,7 +159,7 @@ import java.util.concurrent.locks.LockSupport;
* void runTasks(List<Runnable> tasks) { * void runTasks(List<Runnable> tasks) {
* final Phaser phaser = new Phaser(1); // "1" to register self * final Phaser phaser = new Phaser(1); // "1" to register self
* // create and start threads * // create and start threads
* for (Runnable task : tasks) { * for (final Runnable task : tasks) {
* phaser.register(); * phaser.register();
* new Thread() { * new Thread() {
* public void run() { * public void run() {
......
...@@ -275,10 +275,14 @@ public class LockSupport { ...@@ -275,10 +275,14 @@ public class LockSupport {
* snapshot -- the thread may have since unblocked or blocked on a * snapshot -- the thread may have since unblocked or blocked on a
* different blocker object. * different blocker object.
* *
* @param t the thread
* @return the blocker * @return the blocker
* @throws NullPointerException if argument is null
* @since 1.6 * @since 1.6
*/ */
public static Object getBlocker(Thread t) { public static Object getBlocker(Thread t) {
if (t == null)
throw new NullPointerException();
return unsafe.getObjectVolatile(t, parkBlockerOffset); 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -342,12 +342,35 @@ public class LogManager { ...@@ -342,12 +342,35 @@ public class LogManager {
// already been created with the given name it is returned. // already been created with the given name it is returned.
// Otherwise a new logger instance is created and registered // Otherwise a new logger instance is created and registered
// in the LogManager global namespace. // 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 demandLogger(String name) {
Logger result = getLogger(name); Logger result = getLogger(name);
if (result == null) { if (result == null) {
result = new Logger(name, null); // only allocate the new logger once
addLogger(result); Logger newLogger = new Logger(name, null);
result = getLogger(name); 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; return result;
} }
......
...@@ -310,7 +310,20 @@ public class Logger { ...@@ -310,7 +310,20 @@ public class Logger {
* @return a suitable Logger * @return a suitable Logger
* @throws NullPointerException if the name is null. * @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(); LogManager manager = LogManager.getLogManager();
return manager.demandLogger(name); return manager.demandLogger(name);
} }
...@@ -355,7 +368,10 @@ public class Logger { ...@@ -355,7 +368,10 @@ public class Logger {
* a different resource bundle name. * a different resource bundle name.
* @throws NullPointerException if the name is null. * @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(); LogManager manager = LogManager.getLogManager();
Logger result = manager.demandLogger(name); Logger result = manager.demandLogger(name);
if (result.resourceBundleName == null) { if (result.resourceBundleName == null) {
...@@ -417,7 +433,10 @@ public class Logger { ...@@ -417,7 +433,10 @@ public class Logger {
* @throws MissingResourceException if the resourceBundleName is non-null and * @throws MissingResourceException if the resourceBundleName is non-null and
* no corresponding resource can be found. * 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(); LogManager manager = LogManager.getLogManager();
// cleanup some Loggers that have been GC'ed // cleanup some Loggers that have been GC'ed
manager.drainLoggerRefQueueBounded(); manager.drainLoggerRefQueueBounded();
......
...@@ -213,7 +213,7 @@ import java.util.Arrays; ...@@ -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> * <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> * <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> * <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> * <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> * <tr><td valign="top" headers="construct unicode"><tt>\p{Sc}</tt></td>
* <td headers="matches">A currency symbol</td></tr> * <td headers="matches">A currency symbol</td></tr>
......
...@@ -28,7 +28,7 @@ package java.util.zip; ...@@ -28,7 +28,7 @@ package java.util.zip;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.CharBuffer; import java.nio.CharBuffer;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharset; import java.nio.charset.StandardCharsets;
import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder; import java.nio.charset.CharsetEncoder;
import java.nio.charset.CoderResult; import java.nio.charset.CoderResult;
...@@ -107,7 +107,7 @@ final class ZipCoder { ...@@ -107,7 +107,7 @@ final class ZipCoder {
if (isUTF8) if (isUTF8)
return getBytes(s); return getBytes(s);
if (utf8 == null) if (utf8 == null)
utf8 = new ZipCoder(StandardCharset.UTF_8); utf8 = new ZipCoder(StandardCharsets.UTF_8);
return utf8.getBytes(s); return utf8.getBytes(s);
} }
...@@ -116,7 +116,7 @@ final class ZipCoder { ...@@ -116,7 +116,7 @@ final class ZipCoder {
if (isUTF8) if (isUTF8)
return toString(ba, len); return toString(ba, len);
if (utf8 == null) if (utf8 == null)
utf8 = new ZipCoder(StandardCharset.UTF_8); utf8 = new ZipCoder(StandardCharsets.UTF_8);
return utf8.toString(ba, len); return utf8.toString(ba, len);
} }
...@@ -132,7 +132,7 @@ final class ZipCoder { ...@@ -132,7 +132,7 @@ final class ZipCoder {
private ZipCoder(Charset cs) { private ZipCoder(Charset cs) {
this.cs = 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) { static ZipCoder get(Charset charset) {
......
...@@ -31,7 +31,7 @@ import java.io.IOException; ...@@ -31,7 +31,7 @@ import java.io.IOException;
import java.io.EOFException; import java.io.EOFException;
import java.io.File; import java.io.File;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharset; import java.nio.charset.StandardCharsets;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.Deque; import java.util.Deque;
import java.util.Enumeration; import java.util.Enumeration;
...@@ -141,7 +141,7 @@ class ZipFile implements ZipConstants, Closeable { ...@@ -141,7 +141,7 @@ class ZipFile implements ZipConstants, Closeable {
* @since 1.3 * @since 1.3
*/ */
public ZipFile(File file, int mode) throws IOException { 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; ...@@ -30,7 +30,7 @@ import java.io.IOException;
import java.io.EOFException; import java.io.EOFException;
import java.io.PushbackInputStream; import java.io.PushbackInputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharset; import java.nio.charset.StandardCharsets;
import static java.util.zip.ZipConstants64.*; import static java.util.zip.ZipConstants64.*;
/** /**
...@@ -76,7 +76,7 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants { ...@@ -76,7 +76,7 @@ class ZipInputStream extends InflaterInputStream implements ZipConstants {
* @param in the actual input stream * @param in the actual input stream
*/ */
public ZipInputStream(InputStream in) { public ZipInputStream(InputStream in) {
this(in, StandardCharset.UTF_8); this(in, StandardCharsets.UTF_8);
} }
/** /**
......
...@@ -28,7 +28,7 @@ package java.util.zip; ...@@ -28,7 +28,7 @@ package java.util.zip;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharset; import java.nio.charset.StandardCharsets;
import java.util.Vector; import java.util.Vector;
import java.util.HashSet; import java.util.HashSet;
import static java.util.zip.ZipConstants64.*; import static java.util.zip.ZipConstants64.*;
...@@ -101,7 +101,7 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants { ...@@ -101,7 +101,7 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants {
* @param out the actual output stream * @param out the actual output stream
*/ */
public ZipOutputStream(OutputStream out) { public ZipOutputStream(OutputStream out) {
this(out, StandardCharset.UTF_8); this(out, StandardCharsets.UTF_8);
} }
/** /**
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<head> <head>
<title>javax.management.loading package</title> <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. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
...@@ -68,7 +68,7 @@ questions. ...@@ -68,7 +68,7 @@ questions.
<p id="spec"> <p id="spec">
@see <a href="{@docRoot}/../technotes/guides/jmx/"> @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 in particular the
<a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf"> <a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
JMX Specification, version 1.4(pdf).</a> JMX Specification, version 1.4(pdf).</a>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<head> <head>
<title>javax.management.modelmbean package</title> <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. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it 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 ...@@ -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> <li>See the <i>JMX 1.4 Specification</i>
PDF document available from the PDF document available from the
<a href="{@docRoot}/../technotes/guides/jmx/"> <a href="{@docRoot}/../technotes/guides/jmx/">
Java SE 6 Platform documentation on JMX</a> Java Platform documentation on JMX technology</a>
</ul> </ul>
@since 1.5 @since 1.5
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<head> <head>
<title>javax.management.monitor package</title> <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. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
...@@ -184,7 +184,7 @@ questions. ...@@ -184,7 +184,7 @@ questions.
</ul> </ul>
<p id="spec"> <p id="spec">
@see <a href="{@docRoot}/../technotes/guides/jmx/"> @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 in particular the
<a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf"> <a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
JMX Specification, version 1.4(pdf).</a> JMX Specification, version 1.4(pdf).</a>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<head> <head>
<title>javax.management.openmbean package</title> <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. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
...@@ -143,7 +143,7 @@ questions. ...@@ -143,7 +143,7 @@ questions.
</ul> </ul>
@see <a href="{@docRoot}/../technotes/guides/jmx/"> @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 in particular the
<a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf"> <a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
JMX Specification, version 1.4</a> JMX Specification, version 1.4</a>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<head> <head>
<title>javax.management package</title> <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. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
...@@ -391,7 +391,7 @@ questions. ...@@ -391,7 +391,7 @@ questions.
<p id="spec"> <p id="spec">
@see <a href="{@docRoot}/../technotes/guides/jmx/index.html"> @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 in particular the
<a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf"> <a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
JMX Specification, version 1.4(pdf).</a> JMX Specification, version 1.4(pdf).</a>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<head> <head>
<title>javax.management.relation package</title> <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. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
...@@ -137,7 +137,7 @@ Set&lt;ObjectName&gt; dependentASet = dependentAMap.keySet(); ...@@ -137,7 +137,7 @@ Set&lt;ObjectName&gt; dependentASet = dependentAMap.keySet();
</pre> </pre>
@see <a href="{@docRoot}/../technotes/guides/jmx/"> @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 in particular the
<a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf"> <a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
JMX Specification, version 1.4</a> JMX Specification, version 1.4</a>
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<head> <head>
<title>JMX<sup><font size="-2">TM</font></sup> Remote API.</title> <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. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
This code is free software; you can redistribute it and/or modify it This code is free software; you can redistribute it and/or modify it
...@@ -195,7 +195,7 @@ rmi://192.18.1.9 username 1 ...@@ -195,7 +195,7 @@ rmi://192.18.1.9 username 1
@see <a href="{@docRoot}/../technotes/guides/jmx/"> @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 in particular the
<a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf"> <a href="{@docRoot}/../technotes/guides/jmx/JMX_1_4_specification.pdf">
JMX Specification, version 1.4</a> JMX Specification, version 1.4</a>
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
package javax.management.timer; package javax.management.timer;
import static com.sun.jmx.defaults.JmxProperties.TIMER_LOGGER; import static com.sun.jmx.defaults.JmxProperties.TIMER_LOGGER;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Iterator; import java.util.Iterator;
...@@ -1003,7 +1004,10 @@ public class Timer extends NotificationBroadcasterSupport ...@@ -1003,7 +1004,10 @@ public class Timer extends NotificationBroadcasterSupport
Integer notifID; Integer notifID;
Date date; 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. // Retrieve the timer notification and the date notification.
// //
......
...@@ -26,7 +26,7 @@ package sun.awt; ...@@ -26,7 +26,7 @@ package sun.awt;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder; import java.nio.charset.CharsetEncoder;
import java.nio.charset.StandardCharset; import java.nio.charset.StandardCharsets;
import sun.nio.cs.HistoricallyNamedCharset; import sun.nio.cs.HistoricallyNamedCharset;
public class FontDescriptor implements Cloneable { public class FontDescriptor implements Cloneable {
...@@ -105,8 +105,8 @@ public class FontDescriptor implements Cloneable { ...@@ -105,8 +105,8 @@ public class FontDescriptor implements Cloneable {
if (useUnicode && unicodeEncoder == null) { if (useUnicode && unicodeEncoder == null) {
try { try {
this.unicodeEncoder = isLE? this.unicodeEncoder = isLE?
StandardCharset.UTF_16LE.newEncoder(): StandardCharsets.UTF_16LE.newEncoder():
StandardCharset.UTF_16BE.newEncoder(); StandardCharsets.UTF_16BE.newEncoder();
} catch (IllegalArgumentException x) {} } catch (IllegalArgumentException x) {}
} }
return useUnicode; 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
package sun.management; package sun.management;
import com.sun.management.GarbageCollectorMXBean; import com.sun.management.GarbageCollectorMXBean;
import com.sun.management.GarbageCollectionNotificationInfo;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean; import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryUsage; import java.lang.management.MemoryUsage;
...@@ -35,9 +36,15 @@ import javax.management.openmbean.CompositeData; ...@@ -35,9 +36,15 @@ import javax.management.openmbean.CompositeData;
import javax.management.MBeanInfo; import javax.management.MBeanInfo;
import javax.management.MBeanAttributeInfo; import javax.management.MBeanAttributeInfo;
import javax.management.ObjectName; 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.List;
import java.util.ListIterator; import java.util.ListIterator;
import java.util.Map;
/** /**
* Implementation class for the garbage collector. * Implementation class for the garbage collector.
...@@ -78,19 +85,111 @@ class GarbageCollectorImpl extends MemoryManagerImpl ...@@ -78,19 +85,111 @@ class GarbageCollectorImpl extends MemoryManagerImpl
// Sun JDK extension // Sun JDK extension
private GcInfoBuilder gcInfoBuilder; private GcInfoBuilder gcInfoBuilder;
private synchronized GcInfoBuilder getGcInfoBuilder() {
if(gcInfoBuilder == null) {
gcInfoBuilder = new GcInfoBuilder(this, getAllPoolNames());
}
return gcInfoBuilder;
}
public GcInfo getLastGcInfo() { 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) { synchronized (this) {
if (gcInfoBuilder == null) { if (notifInfo == null) {
gcInfoBuilder = new GcInfoBuilder(this, getAllPoolNames()); notifInfo = new MBeanNotificationInfo[1];
notifInfo[0] = new MBeanNotificationInfo(gcNotifTypes,
notifName,
"GC Notification");
} }
} }
return notifInfo;
}
GcInfo info = gcInfoBuilder.getLastGcInfo(); private static long seqNumber = 0;
return info; 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() { public ObjectName getObjectName() {
return Util.newObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE, getName()); 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -27,6 +27,7 @@ package sun.management; ...@@ -27,6 +27,7 @@ package sun.management;
import java.lang.management.MemoryUsage; import java.lang.management.MemoryUsage;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
...@@ -41,6 +42,9 @@ import javax.management.openmbean.SimpleType; ...@@ -41,6 +42,9 @@ import javax.management.openmbean.SimpleType;
import javax.management.openmbean.OpenType; import javax.management.openmbean.OpenType;
import javax.management.openmbean.OpenDataException; import javax.management.openmbean.OpenDataException;
import com.sun.management.GcInfo; 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. * A CompositeData for GcInfo for the local management support.
...@@ -64,6 +68,44 @@ public class GcInfoCompositeData extends LazyCompositeData { ...@@ -64,6 +68,44 @@ public class GcInfoCompositeData extends LazyCompositeData {
return info; 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() { protected CompositeData getCompositeData() {
// CONTENTS OF THIS ARRAY MUST BE SYNCHRONIZED WITH // CONTENTS OF THIS ARRAY MUST BE SYNCHRONIZED WITH
// baseGcInfoItemNames! // baseGcInfoItemNames!
...@@ -115,7 +157,6 @@ public class GcInfoCompositeData extends LazyCompositeData { ...@@ -115,7 +157,6 @@ public class GcInfoCompositeData extends LazyCompositeData {
} }
} }
private static final String ID = "id"; private static final String ID = "id";
private static final String START_TIME = "startTime"; private static final String START_TIME = "startTime";
private static final String END_TIME = "endTime"; private static final String END_TIME = "endTime";
...@@ -231,7 +272,7 @@ public class GcInfoCompositeData extends LazyCompositeData { ...@@ -231,7 +272,7 @@ public class GcInfoCompositeData extends LazyCompositeData {
// This is only used for validation. // This is only used for validation.
private static CompositeType baseGcInfoCompositeType = null; private static CompositeType baseGcInfoCompositeType = null;
private static synchronized CompositeType getBaseGcInfoCompositeType() { static synchronized CompositeType getBaseGcInfoCompositeType() {
if (baseGcInfoCompositeType == null) { if (baseGcInfoCompositeType == null) {
try { try {
baseGcInfoCompositeType = 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -29,6 +29,7 @@ import java.lang.management.ManagementFactory; ...@@ -29,6 +29,7 @@ import java.lang.management.ManagementFactory;
import java.lang.management.MemoryManagerMXBean; import java.lang.management.MemoryManagerMXBean;
import java.lang.management.MemoryPoolMXBean; import java.lang.management.MemoryPoolMXBean;
import javax.management.MBeanNotificationInfo;
import javax.management.ObjectName; import javax.management.ObjectName;
/** /**
...@@ -38,7 +39,8 @@ import javax.management.ObjectName; ...@@ -38,7 +39,8 @@ import javax.management.ObjectName;
* ManagementFactory.getMemoryManagerMXBeans() returns a list * ManagementFactory.getMemoryManagerMXBeans() returns a list
* of instances of this class. * of instances of this class.
*/ */
class MemoryManagerImpl implements MemoryManagerMXBean { class MemoryManagerImpl extends NotificationEmitterSupport
implements MemoryManagerMXBean {
private final String name; private final String name;
private final boolean isValid; private final boolean isValid;
...@@ -76,6 +78,16 @@ class MemoryManagerImpl implements MemoryManagerMXBean { ...@@ -76,6 +78,16 @@ class MemoryManagerImpl implements MemoryManagerMXBean {
} }
private native MemoryPoolMXBean[] getMemoryPools0(); 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() { public ObjectName getObjectName() {
return Util.newObjectName(ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE, getName()); return Util.newObjectName(ManagementFactory.MEMORY_MANAGER_MXBEAN_DOMAIN_TYPE, getName());
} }
......
...@@ -45,6 +45,7 @@ public interface VMManagement { ...@@ -45,6 +45,7 @@ public interface VMManagement {
public boolean isSynchronizerUsageSupported(); public boolean isSynchronizerUsageSupported();
public boolean isThreadAllocatedMemorySupported(); public boolean isThreadAllocatedMemorySupported();
public boolean isThreadAllocatedMemoryEnabled(); public boolean isThreadAllocatedMemoryEnabled();
public boolean isGcNotificationSupported();
// Class Loading Subsystem // Class Loading Subsystem
public long getTotalClassCount(); public long getTotalClassCount();
......
...@@ -56,6 +56,8 @@ class VMManagementImpl implements VMManagement { ...@@ -56,6 +56,8 @@ class VMManagementImpl implements VMManagement {
private static boolean objectMonitorUsageSupport; private static boolean objectMonitorUsageSupport;
private static boolean synchronizerUsageSupport; private static boolean synchronizerUsageSupport;
private static boolean threadAllocatedMemorySupport; private static boolean threadAllocatedMemorySupport;
private static boolean gcNotificationSupport;
static { static {
version = getVersion0(); version = getVersion0();
...@@ -100,6 +102,10 @@ class VMManagementImpl implements VMManagement { ...@@ -100,6 +102,10 @@ class VMManagementImpl implements VMManagement {
return threadAllocatedMemorySupport; return threadAllocatedMemorySupport;
} }
public boolean isGcNotificationSupported() {
return gcNotificationSupport;
}
public native boolean isThreadContentionMonitoringEnabled(); public native boolean isThreadContentionMonitoringEnabled();
public native boolean isThreadCpuTimeEnabled(); public native boolean isThreadCpuTimeEnabled();
public native boolean isThreadAllocatedMemoryEnabled(); public native boolean isThreadAllocatedMemoryEnabled();
......
...@@ -28,7 +28,7 @@ package sun.nio.ch; ...@@ -28,7 +28,7 @@ package sun.nio.ch;
import java.nio.channels.*; import java.nio.channels.*;
import java.net.SocketAddress; import java.net.SocketAddress;
import java.net.SocketOption; import java.net.SocketOption;
import java.net.StandardSocketOption; import java.net.StandardSocketOptions;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.IOException; import java.io.IOException;
...@@ -214,8 +214,8 @@ abstract class AsynchronousServerSocketChannelImpl ...@@ -214,8 +214,8 @@ abstract class AsynchronousServerSocketChannelImpl
private static Set<SocketOption<?>> defaultOptions() { private static Set<SocketOption<?>> defaultOptions() {
HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(2); HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(2);
set.add(StandardSocketOption.SO_RCVBUF); set.add(StandardSocketOptions.SO_RCVBUF);
set.add(StandardSocketOption.SO_REUSEADDR); set.add(StandardSocketOptions.SO_REUSEADDR);
return Collections.unmodifiableSet(set); return Collections.unmodifiableSet(set);
} }
} }
......
...@@ -28,7 +28,7 @@ package sun.nio.ch; ...@@ -28,7 +28,7 @@ package sun.nio.ch;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.*; import java.nio.channels.*;
import java.net.SocketOption; import java.net.SocketOption;
import java.net.StandardSocketOption; import java.net.StandardSocketOptions;
import java.net.SocketAddress; import java.net.SocketAddress;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.io.IOException; import java.io.IOException;
...@@ -483,11 +483,11 @@ abstract class AsynchronousSocketChannelImpl ...@@ -483,11 +483,11 @@ abstract class AsynchronousSocketChannelImpl
private static Set<SocketOption<?>> defaultOptions() { private static Set<SocketOption<?>> defaultOptions() {
HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(5); HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(5);
set.add(StandardSocketOption.SO_SNDBUF); set.add(StandardSocketOptions.SO_SNDBUF);
set.add(StandardSocketOption.SO_RCVBUF); set.add(StandardSocketOptions.SO_RCVBUF);
set.add(StandardSocketOption.SO_KEEPALIVE); set.add(StandardSocketOptions.SO_KEEPALIVE);
set.add(StandardSocketOption.SO_REUSEADDR); set.add(StandardSocketOptions.SO_REUSEADDR);
set.add(StandardSocketOption.TCP_NODELAY); set.add(StandardSocketOptions.TCP_NODELAY);
return Collections.unmodifiableSet(set); return Collections.unmodifiableSet(set);
} }
} }
......
...@@ -188,7 +188,7 @@ class DatagramChannelImpl ...@@ -188,7 +188,7 @@ class DatagramChannelImpl
synchronized (stateLock) { synchronized (stateLock) {
ensureOpen(); ensureOpen();
if (name == StandardSocketOption.IP_TOS) { if (name == StandardSocketOptions.IP_TOS) {
// IPv4 only; no-op for IPv6 // IPv4 only; no-op for IPv6
if (family == StandardProtocolFamily.INET) { if (family == StandardProtocolFamily.INET) {
Net.setSocketOption(fd, family, name, value); Net.setSocketOption(fd, family, name, value);
...@@ -196,15 +196,15 @@ class DatagramChannelImpl ...@@ -196,15 +196,15 @@ class DatagramChannelImpl
return this; return this;
} }
if (name == StandardSocketOption.IP_MULTICAST_TTL || if (name == StandardSocketOptions.IP_MULTICAST_TTL ||
name == StandardSocketOption.IP_MULTICAST_LOOP) name == StandardSocketOptions.IP_MULTICAST_LOOP)
{ {
// options are protocol dependent // options are protocol dependent
Net.setSocketOption(fd, family, name, value); Net.setSocketOption(fd, family, name, value);
return this; return this;
} }
if (name == StandardSocketOption.IP_MULTICAST_IF) { if (name == StandardSocketOptions.IP_MULTICAST_IF) {
if (value == null) if (value == null)
throw new IllegalArgumentException("Cannot set IP_MULTICAST_IF to 'null'"); throw new IllegalArgumentException("Cannot set IP_MULTICAST_IF to 'null'");
NetworkInterface interf = (NetworkInterface)value; NetworkInterface interf = (NetworkInterface)value;
...@@ -243,7 +243,7 @@ class DatagramChannelImpl ...@@ -243,7 +243,7 @@ class DatagramChannelImpl
synchronized (stateLock) { synchronized (stateLock) {
ensureOpen(); ensureOpen();
if (name == StandardSocketOption.IP_TOS) { if (name == StandardSocketOptions.IP_TOS) {
// IPv4 only; always return 0 on IPv6 // IPv4 only; always return 0 on IPv6
if (family == StandardProtocolFamily.INET) { if (family == StandardProtocolFamily.INET) {
return (T) Net.getSocketOption(fd, family, name); return (T) Net.getSocketOption(fd, family, name);
...@@ -252,13 +252,13 @@ class DatagramChannelImpl ...@@ -252,13 +252,13 @@ class DatagramChannelImpl
} }
} }
if (name == StandardSocketOption.IP_MULTICAST_TTL || if (name == StandardSocketOptions.IP_MULTICAST_TTL ||
name == StandardSocketOption.IP_MULTICAST_LOOP) name == StandardSocketOptions.IP_MULTICAST_LOOP)
{ {
return (T) Net.getSocketOption(fd, family, name); return (T) Net.getSocketOption(fd, family, name);
} }
if (name == StandardSocketOption.IP_MULTICAST_IF) { if (name == StandardSocketOptions.IP_MULTICAST_IF) {
if (family == StandardProtocolFamily.INET) { if (family == StandardProtocolFamily.INET) {
int address = Net.getInterface4(fd); int address = Net.getInterface4(fd);
if (address == 0) if (address == 0)
...@@ -291,14 +291,14 @@ class DatagramChannelImpl ...@@ -291,14 +291,14 @@ class DatagramChannelImpl
private static Set<SocketOption<?>> defaultOptions() { private static Set<SocketOption<?>> defaultOptions() {
HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(8); HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(8);
set.add(StandardSocketOption.SO_SNDBUF); set.add(StandardSocketOptions.SO_SNDBUF);
set.add(StandardSocketOption.SO_RCVBUF); set.add(StandardSocketOptions.SO_RCVBUF);
set.add(StandardSocketOption.SO_REUSEADDR); set.add(StandardSocketOptions.SO_REUSEADDR);
set.add(StandardSocketOption.SO_BROADCAST); set.add(StandardSocketOptions.SO_BROADCAST);
set.add(StandardSocketOption.IP_TOS); set.add(StandardSocketOptions.IP_TOS);
set.add(StandardSocketOption.IP_MULTICAST_IF); set.add(StandardSocketOptions.IP_MULTICAST_IF);
set.add(StandardSocketOption.IP_MULTICAST_TTL); set.add(StandardSocketOptions.IP_MULTICAST_TTL);
set.add(StandardSocketOption.IP_MULTICAST_LOOP); set.add(StandardSocketOptions.IP_MULTICAST_LOOP);
return Collections.unmodifiableSet(set); return Collections.unmodifiableSet(set);
} }
} }
......
...@@ -312,46 +312,46 @@ public class DatagramSocketAdaptor ...@@ -312,46 +312,46 @@ public class DatagramSocketAdaptor
public void setSendBufferSize(int size) throws SocketException { public void setSendBufferSize(int size) throws SocketException {
if (size <= 0) if (size <= 0)
throw new IllegalArgumentException("Invalid send size"); throw new IllegalArgumentException("Invalid send size");
setIntOption(StandardSocketOption.SO_SNDBUF, size); setIntOption(StandardSocketOptions.SO_SNDBUF, size);
} }
public int getSendBufferSize() throws SocketException { public int getSendBufferSize() throws SocketException {
return getIntOption(StandardSocketOption.SO_SNDBUF); return getIntOption(StandardSocketOptions.SO_SNDBUF);
} }
public void setReceiveBufferSize(int size) throws SocketException { public void setReceiveBufferSize(int size) throws SocketException {
if (size <= 0) if (size <= 0)
throw new IllegalArgumentException("Invalid receive size"); throw new IllegalArgumentException("Invalid receive size");
setIntOption(StandardSocketOption.SO_RCVBUF, size); setIntOption(StandardSocketOptions.SO_RCVBUF, size);
} }
public int getReceiveBufferSize() throws SocketException { public int getReceiveBufferSize() throws SocketException {
return getIntOption(StandardSocketOption.SO_RCVBUF); return getIntOption(StandardSocketOptions.SO_RCVBUF);
} }
public void setReuseAddress(boolean on) throws SocketException { public void setReuseAddress(boolean on) throws SocketException {
setBooleanOption(StandardSocketOption.SO_REUSEADDR, on); setBooleanOption(StandardSocketOptions.SO_REUSEADDR, on);
} }
public boolean getReuseAddress() throws SocketException { public boolean getReuseAddress() throws SocketException {
return getBooleanOption(StandardSocketOption.SO_REUSEADDR); return getBooleanOption(StandardSocketOptions.SO_REUSEADDR);
} }
public void setBroadcast(boolean on) throws SocketException { public void setBroadcast(boolean on) throws SocketException {
setBooleanOption(StandardSocketOption.SO_BROADCAST, on); setBooleanOption(StandardSocketOptions.SO_BROADCAST, on);
} }
public boolean getBroadcast() throws SocketException { public boolean getBroadcast() throws SocketException {
return getBooleanOption(StandardSocketOption.SO_BROADCAST); return getBooleanOption(StandardSocketOptions.SO_BROADCAST);
} }
public void setTrafficClass(int tc) throws SocketException { public void setTrafficClass(int tc) throws SocketException {
setIntOption(StandardSocketOption.IP_TOS, tc); setIntOption(StandardSocketOptions.IP_TOS, tc);
} }
public int getTrafficClass() throws SocketException { public int getTrafficClass() throws SocketException {
return getIntOption(StandardSocketOption.IP_TOS); return getIntOption(StandardSocketOptions.IP_TOS);
} }
public void close() { public void close() {
......
...@@ -29,7 +29,7 @@ import java.net.SocketOption; ...@@ -29,7 +29,7 @@ import java.net.SocketOption;
/** /**
* Defines socket options that are supported by the implementation * Defines socket options that are supported by the implementation
* but not defined in StandardSocketOption. * but not defined in StandardSocketOptions.
*/ */
class ExtendedSocketOption { class ExtendedSocketOption {
......
...@@ -96,11 +96,16 @@ class NativeThreadSet { ...@@ -96,11 +96,16 @@ class NativeThreadSet {
break; break;
} }
waitingToEmpty = true; waitingToEmpty = true;
boolean interrupted = false;
while (used > 0) { while (used > 0) {
try { try {
wait(); wait();
} catch (InterruptedException ignore) { } } catch (InterruptedException e) {
interrupted = true;
}
} }
if (interrupted)
Thread.currentThread().interrupt();
} }
} }
} }
...@@ -237,26 +237,26 @@ class Net { // package-private ...@@ -237,26 +237,26 @@ class Net { // package-private
throw new AssertionError("Should not reach here"); throw new AssertionError("Should not reach here");
// special handling // special handling
if (name == StandardSocketOption.SO_RCVBUF || if (name == StandardSocketOptions.SO_RCVBUF ||
name == StandardSocketOption.SO_SNDBUF) name == StandardSocketOptions.SO_SNDBUF)
{ {
int i = ((Integer)value).intValue(); int i = ((Integer)value).intValue();
if (i < 0) if (i < 0)
throw new IllegalArgumentException("Invalid send/receive buffer size"); throw new IllegalArgumentException("Invalid send/receive buffer size");
} }
if (name == StandardSocketOption.SO_LINGER) { if (name == StandardSocketOptions.SO_LINGER) {
int i = ((Integer)value).intValue(); int i = ((Integer)value).intValue();
if (i < 0) if (i < 0)
value = Integer.valueOf(-1); value = Integer.valueOf(-1);
if (i > 65535) if (i > 65535)
value = Integer.valueOf(65535); value = Integer.valueOf(65535);
} }
if (name == StandardSocketOption.IP_TOS) { if (name == StandardSocketOptions.IP_TOS) {
int i = ((Integer)value).intValue(); int i = ((Integer)value).intValue();
if (i < 0 || i > 255) if (i < 0 || i > 255)
throw new IllegalArgumentException("Invalid IP_TOS value"); throw new IllegalArgumentException("Invalid IP_TOS value");
} }
if (name == StandardSocketOption.IP_MULTICAST_TTL) { if (name == StandardSocketOptions.IP_MULTICAST_TTL) {
int i = ((Integer)value).intValue(); int i = ((Integer)value).intValue();
if (i < 0 || i > 255) if (i < 0 || i > 255)
throw new IllegalArgumentException("Invalid TTL/hop value"); throw new IllegalArgumentException("Invalid TTL/hop value");
......
...@@ -169,7 +169,7 @@ public class ServerSocketAdaptor // package-private ...@@ -169,7 +169,7 @@ public class ServerSocketAdaptor // package-private
public void setReuseAddress(boolean on) throws SocketException { public void setReuseAddress(boolean on) throws SocketException {
try { try {
ssc.setOption(StandardSocketOption.SO_REUSEADDR, on); ssc.setOption(StandardSocketOptions.SO_REUSEADDR, on);
} catch (IOException x) { } catch (IOException x) {
Net.translateToSocketException(x); Net.translateToSocketException(x);
} }
...@@ -177,7 +177,7 @@ public class ServerSocketAdaptor // package-private ...@@ -177,7 +177,7 @@ public class ServerSocketAdaptor // package-private
public boolean getReuseAddress() throws SocketException { public boolean getReuseAddress() throws SocketException {
try { try {
return ssc.getOption(StandardSocketOption.SO_REUSEADDR).booleanValue(); return ssc.getOption(StandardSocketOptions.SO_REUSEADDR).booleanValue();
} catch (IOException x) { } catch (IOException x) {
Net.translateToSocketException(x); Net.translateToSocketException(x);
return false; // Never happens return false; // Never happens
...@@ -197,7 +197,7 @@ public class ServerSocketAdaptor // package-private ...@@ -197,7 +197,7 @@ public class ServerSocketAdaptor // package-private
if (size <= 0) if (size <= 0)
throw new IllegalArgumentException("size cannot be 0 or negative"); throw new IllegalArgumentException("size cannot be 0 or negative");
try { try {
ssc.setOption(StandardSocketOption.SO_RCVBUF, size); ssc.setOption(StandardSocketOptions.SO_RCVBUF, size);
} catch (IOException x) { } catch (IOException x) {
Net.translateToSocketException(x); Net.translateToSocketException(x);
} }
...@@ -205,7 +205,7 @@ public class ServerSocketAdaptor // package-private ...@@ -205,7 +205,7 @@ public class ServerSocketAdaptor // package-private
public int getReceiveBufferSize() throws SocketException { public int getReceiveBufferSize() throws SocketException {
try { try {
return ssc.getOption(StandardSocketOption.SO_RCVBUF).intValue(); return ssc.getOption(StandardSocketOptions.SO_RCVBUF).intValue();
} catch (IOException x) { } catch (IOException x) {
Net.translateToSocketException(x); Net.translateToSocketException(x);
return -1; // Never happens return -1; // Never happens
......
...@@ -160,8 +160,8 @@ class ServerSocketChannelImpl ...@@ -160,8 +160,8 @@ class ServerSocketChannelImpl
private static Set<SocketOption<?>> defaultOptions() { private static Set<SocketOption<?>> defaultOptions() {
HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(2); HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(2);
set.add(StandardSocketOption.SO_RCVBUF); set.add(StandardSocketOptions.SO_RCVBUF);
set.add(StandardSocketOption.SO_REUSEADDR); set.add(StandardSocketOptions.SO_REUSEADDR);
return Collections.unmodifiableSet(set); return Collections.unmodifiableSet(set);
} }
} }
......
...@@ -318,21 +318,21 @@ public class SocketAdaptor ...@@ -318,21 +318,21 @@ public class SocketAdaptor
} }
public void setTcpNoDelay(boolean on) throws SocketException { public void setTcpNoDelay(boolean on) throws SocketException {
setBooleanOption(StandardSocketOption.TCP_NODELAY, on); setBooleanOption(StandardSocketOptions.TCP_NODELAY, on);
} }
public boolean getTcpNoDelay() throws SocketException { public boolean getTcpNoDelay() throws SocketException {
return getBooleanOption(StandardSocketOption.TCP_NODELAY); return getBooleanOption(StandardSocketOptions.TCP_NODELAY);
} }
public void setSoLinger(boolean on, int linger) throws SocketException { public void setSoLinger(boolean on, int linger) throws SocketException {
if (!on) if (!on)
linger = -1; linger = -1;
setIntOption(StandardSocketOption.SO_LINGER, linger); setIntOption(StandardSocketOptions.SO_LINGER, linger);
} }
public int getSoLinger() throws SocketException { public int getSoLinger() throws SocketException {
return getIntOption(StandardSocketOption.SO_LINGER); return getIntOption(StandardSocketOptions.SO_LINGER);
} }
public void sendUrgentData(int data) throws IOException { public void sendUrgentData(int data) throws IOException {
...@@ -366,46 +366,46 @@ public class SocketAdaptor ...@@ -366,46 +366,46 @@ public class SocketAdaptor
// size 0 valid for SocketChannel, invalid for Socket // size 0 valid for SocketChannel, invalid for Socket
if (size <= 0) if (size <= 0)
throw new IllegalArgumentException("Invalid send size"); throw new IllegalArgumentException("Invalid send size");
setIntOption(StandardSocketOption.SO_SNDBUF, size); setIntOption(StandardSocketOptions.SO_SNDBUF, size);
} }
public int getSendBufferSize() throws SocketException { public int getSendBufferSize() throws SocketException {
return getIntOption(StandardSocketOption.SO_SNDBUF); return getIntOption(StandardSocketOptions.SO_SNDBUF);
} }
public void setReceiveBufferSize(int size) throws SocketException { public void setReceiveBufferSize(int size) throws SocketException {
// size 0 valid for SocketChannel, invalid for Socket // size 0 valid for SocketChannel, invalid for Socket
if (size <= 0) if (size <= 0)
throw new IllegalArgumentException("Invalid receive size"); throw new IllegalArgumentException("Invalid receive size");
setIntOption(StandardSocketOption.SO_RCVBUF, size); setIntOption(StandardSocketOptions.SO_RCVBUF, size);
} }
public int getReceiveBufferSize() throws SocketException { public int getReceiveBufferSize() throws SocketException {
return getIntOption(StandardSocketOption.SO_RCVBUF); return getIntOption(StandardSocketOptions.SO_RCVBUF);
} }
public void setKeepAlive(boolean on) throws SocketException { public void setKeepAlive(boolean on) throws SocketException {
setBooleanOption(StandardSocketOption.SO_KEEPALIVE, on); setBooleanOption(StandardSocketOptions.SO_KEEPALIVE, on);
} }
public boolean getKeepAlive() throws SocketException { public boolean getKeepAlive() throws SocketException {
return getBooleanOption(StandardSocketOption.SO_KEEPALIVE); return getBooleanOption(StandardSocketOptions.SO_KEEPALIVE);
} }
public void setTrafficClass(int tc) throws SocketException { public void setTrafficClass(int tc) throws SocketException {
setIntOption(StandardSocketOption.IP_TOS, tc); setIntOption(StandardSocketOptions.IP_TOS, tc);
} }
public int getTrafficClass() throws SocketException { public int getTrafficClass() throws SocketException {
return getIntOption(StandardSocketOption.IP_TOS); return getIntOption(StandardSocketOptions.IP_TOS);
} }
public void setReuseAddress(boolean on) throws SocketException { public void setReuseAddress(boolean on) throws SocketException {
setBooleanOption(StandardSocketOption.SO_REUSEADDR, on); setBooleanOption(StandardSocketOptions.SO_REUSEADDR, on);
} }
public boolean getReuseAddress() throws SocketException { public boolean getReuseAddress() throws SocketException {
return getBooleanOption(StandardSocketOption.SO_REUSEADDR); return getBooleanOption(StandardSocketOptions.SO_REUSEADDR);
} }
public void close() throws IOException { public void close() throws IOException {
......
...@@ -170,7 +170,7 @@ class SocketChannelImpl ...@@ -170,7 +170,7 @@ class SocketChannelImpl
throw new ClosedChannelException(); throw new ClosedChannelException();
// special handling for IP_TOS: no-op when IPv6 // special handling for IP_TOS: no-op when IPv6
if (name == StandardSocketOption.IP_TOS) { if (name == StandardSocketOptions.IP_TOS) {
if (!Net.isIPv6Available()) if (!Net.isIPv6Available())
Net.setSocketOption(fd, StandardProtocolFamily.INET, name, value); Net.setSocketOption(fd, StandardProtocolFamily.INET, name, value);
return this; return this;
...@@ -197,7 +197,7 @@ class SocketChannelImpl ...@@ -197,7 +197,7 @@ class SocketChannelImpl
throw new ClosedChannelException(); throw new ClosedChannelException();
// special handling for IP_TOS: always return 0 when IPv6 // 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) : return (Net.isIPv6Available()) ? (T) Integer.valueOf(0) :
(T) Net.getSocketOption(fd, StandardProtocolFamily.INET, name); (T) Net.getSocketOption(fd, StandardProtocolFamily.INET, name);
} }
...@@ -212,14 +212,14 @@ class SocketChannelImpl ...@@ -212,14 +212,14 @@ class SocketChannelImpl
private static Set<SocketOption<?>> defaultOptions() { private static Set<SocketOption<?>> defaultOptions() {
HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(8); HashSet<SocketOption<?>> set = new HashSet<SocketOption<?>>(8);
set.add(StandardSocketOption.SO_SNDBUF); set.add(StandardSocketOptions.SO_SNDBUF);
set.add(StandardSocketOption.SO_RCVBUF); set.add(StandardSocketOptions.SO_RCVBUF);
set.add(StandardSocketOption.SO_KEEPALIVE); set.add(StandardSocketOptions.SO_KEEPALIVE);
set.add(StandardSocketOption.SO_REUSEADDR); set.add(StandardSocketOptions.SO_REUSEADDR);
set.add(StandardSocketOption.SO_LINGER); set.add(StandardSocketOptions.SO_LINGER);
set.add(StandardSocketOption.TCP_NODELAY); set.add(StandardSocketOptions.TCP_NODELAY);
// additional options required by socket adaptor // additional options required by socket adaptor
set.add(StandardSocketOption.IP_TOS); set.add(StandardSocketOptions.IP_TOS);
set.add(ExtendedSocketOption.SO_OOBINLINE); set.add(ExtendedSocketOption.SO_OOBINLINE);
return Collections.unmodifiableSet(set); return Collections.unmodifiableSet(set);
} }
......
...@@ -105,16 +105,16 @@ abstract class AbstractPoller implements Runnable { ...@@ -105,16 +105,16 @@ abstract class AbstractPoller implements Runnable {
Set<WatchEvent.Kind<?>> eventSet = new HashSet<>(events.length); Set<WatchEvent.Kind<?>> eventSet = new HashSet<>(events.length);
for (WatchEvent.Kind<?> event: events) { for (WatchEvent.Kind<?> event: events) {
// standard events // standard events
if (event == StandardWatchEventKind.ENTRY_CREATE || if (event == StandardWatchEventKinds.ENTRY_CREATE ||
event == StandardWatchEventKind.ENTRY_MODIFY || event == StandardWatchEventKinds.ENTRY_MODIFY ||
event == StandardWatchEventKind.ENTRY_DELETE) event == StandardWatchEventKinds.ENTRY_DELETE)
{ {
eventSet.add(event); eventSet.add(event);
continue; continue;
} }
// OVERFLOW is ignored // OVERFLOW is ignored
if (event == StandardWatchEventKind.OVERFLOW) { if (event == StandardWatchEventKinds.OVERFLOW) {
if (events.length == 1) if (events.length == 1)
throw new IllegalArgumentException("No events to register"); throw new IllegalArgumentException("No events to register");
continue; continue;
......
...@@ -42,8 +42,8 @@ abstract class AbstractWatchKey implements WatchKey { ...@@ -42,8 +42,8 @@ abstract class AbstractWatchKey implements WatchKey {
/** /**
* Special event to signal overflow * Special event to signal overflow
*/ */
static final Event<Void> OVERFLOW_EVENT = static final Event<Object> OVERFLOW_EVENT =
new Event<Void>(StandardWatchEventKind.OVERFLOW, null); new Event<Object>(StandardWatchEventKinds.OVERFLOW, null);
/** /**
* Possible key states * Possible key states
...@@ -103,14 +103,14 @@ abstract class AbstractWatchKey implements WatchKey { ...@@ -103,14 +103,14 @@ abstract class AbstractWatchKey implements WatchKey {
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final void signalEvent(WatchEvent.Kind<?> kind, Object context) { final void signalEvent(WatchEvent.Kind<?> kind, Object context) {
boolean isModify = (kind == StandardWatchEventKind.ENTRY_MODIFY); boolean isModify = (kind == StandardWatchEventKinds.ENTRY_MODIFY);
synchronized (this) { synchronized (this) {
int size = events.size(); int size = events.size();
if (size > 0) { if (size > 0) {
// if the previous event is an OVERFLOW event or this is a // if the previous event is an OVERFLOW event or this is a
// repeated event then we simply increment the counter // repeated event then we simply increment the counter
WatchEvent<?> prev = events.get(size-1); WatchEvent<?> prev = events.get(size-1);
if ((prev.kind() == StandardWatchEventKind.OVERFLOW) || if ((prev.kind() == StandardWatchEventKinds.OVERFLOW) ||
((kind == prev.kind() && ((kind == prev.kind() &&
Objects.equals(context, prev.context())))) Objects.equals(context, prev.context()))))
{ {
...@@ -124,7 +124,7 @@ abstract class AbstractWatchKey implements WatchKey { ...@@ -124,7 +124,7 @@ abstract class AbstractWatchKey implements WatchKey {
if (isModify) { if (isModify) {
WatchEvent<?> ev = lastModifyEvents.get(context); WatchEvent<?> ev = lastModifyEvents.get(context);
if (ev != null) { if (ev != null) {
assert ev.kind() == StandardWatchEventKind.ENTRY_MODIFY; assert ev.kind() == StandardWatchEventKinds.ENTRY_MODIFY;
((Event<?>)ev).increment(); ((Event<?>)ev).increment();
return; return;
} }
...@@ -138,7 +138,7 @@ abstract class AbstractWatchKey implements WatchKey { ...@@ -138,7 +138,7 @@ abstract class AbstractWatchKey implements WatchKey {
// if the list has reached the limit then drop pending events // if the list has reached the limit then drop pending events
// and queue an OVERFLOW event // and queue an OVERFLOW event
if (size >= MAX_EVENT_LIST_SIZE) { if (size >= MAX_EVENT_LIST_SIZE) {
kind = StandardWatchEventKind.OVERFLOW; kind = StandardWatchEventKinds.OVERFLOW;
isModify = false; isModify = false;
context = null; context = null;
} }
...@@ -149,7 +149,7 @@ abstract class AbstractWatchKey implements WatchKey { ...@@ -149,7 +149,7 @@ abstract class AbstractWatchKey implements WatchKey {
new Event<Object>((WatchEvent.Kind<Object>)kind, context); new Event<Object>((WatchEvent.Kind<Object>)kind, context);
if (isModify) { if (isModify) {
lastModifyEvents.put(context, ev); lastModifyEvents.put(context, ev);
} else if (kind == StandardWatchEventKind.OVERFLOW) { } else if (kind == StandardWatchEventKinds.OVERFLOW) {
// drop all pending events // drop all pending events
events.clear(); events.clear();
lastModifyEvents.clear(); lastModifyEvents.clear();
......
...@@ -80,16 +80,16 @@ class PollingWatchService ...@@ -80,16 +80,16 @@ class PollingWatchService
new HashSet<WatchEvent.Kind<?>>(events.length); new HashSet<WatchEvent.Kind<?>>(events.length);
for (WatchEvent.Kind<?> event: events) { for (WatchEvent.Kind<?> event: events) {
// standard events // standard events
if (event == StandardWatchEventKind.ENTRY_CREATE || if (event == StandardWatchEventKinds.ENTRY_CREATE ||
event == StandardWatchEventKind.ENTRY_MODIFY || event == StandardWatchEventKinds.ENTRY_MODIFY ||
event == StandardWatchEventKind.ENTRY_DELETE) event == StandardWatchEventKinds.ENTRY_DELETE)
{ {
eventSet.add(event); eventSet.add(event);
continue; continue;
} }
// OVERFLOW is ignored // OVERFLOW is ignored
if (event == StandardWatchEventKind.OVERFLOW) { if (event == StandardWatchEventKinds.OVERFLOW) {
if (events.length == 1) if (events.length == 1)
throw new IllegalArgumentException("No events to register"); throw new IllegalArgumentException("No events to register");
continue; continue;
...@@ -355,16 +355,16 @@ class PollingWatchService ...@@ -355,16 +355,16 @@ class PollingWatchService
new CacheEntry(lastModified, tickCount)); new CacheEntry(lastModified, tickCount));
// queue ENTRY_CREATE if event enabled // queue ENTRY_CREATE if event enabled
if (events.contains(StandardWatchEventKind.ENTRY_CREATE)) { if (events.contains(StandardWatchEventKinds.ENTRY_CREATE)) {
signalEvent(StandardWatchEventKind.ENTRY_CREATE, entry.getFileName()); signalEvent(StandardWatchEventKinds.ENTRY_CREATE, entry.getFileName());
continue; continue;
} else { } else {
// if ENTRY_CREATE is not enabled and ENTRY_MODIFY is // if ENTRY_CREATE is not enabled and ENTRY_MODIFY is
// enabled then queue event to avoid missing out on // enabled then queue event to avoid missing out on
// modifications to the file immediately after it is // modifications to the file immediately after it is
// created. // created.
if (events.contains(StandardWatchEventKind.ENTRY_MODIFY)) { if (events.contains(StandardWatchEventKinds.ENTRY_MODIFY)) {
signalEvent(StandardWatchEventKind.ENTRY_MODIFY, entry.getFileName()); signalEvent(StandardWatchEventKinds.ENTRY_MODIFY, entry.getFileName());
} }
} }
continue; continue;
...@@ -372,8 +372,8 @@ class PollingWatchService ...@@ -372,8 +372,8 @@ class PollingWatchService
// check if file has changed // check if file has changed
if (e.lastModified != lastModified) { if (e.lastModified != lastModified) {
if (events.contains(StandardWatchEventKind.ENTRY_MODIFY)) { if (events.contains(StandardWatchEventKinds.ENTRY_MODIFY)) {
signalEvent(StandardWatchEventKind.ENTRY_MODIFY, signalEvent(StandardWatchEventKinds.ENTRY_MODIFY,
entry.getFileName()); entry.getFileName());
} }
} }
...@@ -403,8 +403,8 @@ class PollingWatchService ...@@ -403,8 +403,8 @@ class PollingWatchService
Path name = mapEntry.getKey(); Path name = mapEntry.getKey();
// remove from map and queue delete event (if enabled) // remove from map and queue delete event (if enabled)
i.remove(); i.remove();
if (events.contains(StandardWatchEventKind.ENTRY_DELETE)) { if (events.contains(StandardWatchEventKinds.ENTRY_DELETE)) {
signalEvent(StandardWatchEventKind.ENTRY_DELETE, name); signalEvent(StandardWatchEventKinds.ENTRY_DELETE, name);
} }
} }
} }
......
...@@ -24,22 +24,10 @@ ...@@ -24,22 +24,10 @@
*/ */
/* /*
* ===========================================================================
* IBM Confidential
* OCO Source Materials
* Licensed Materials - Property of IBM
* *
* (C) Copyright IBM Corp. 1999 All Rights Reserved. * (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. * Copyright 1997 The Open Group Research Institute. All rights reserved.
* ===========================================================================
*
*/ */
package sun.security.jgss.spi; package sun.security.jgss.spi;
import org.ietf.jgss.*; import org.ietf.jgss.*;
......
...@@ -62,7 +62,7 @@ final class JsseJce { ...@@ -62,7 +62,7 @@ final class JsseJce {
// Flag indicating whether EC crypto is available. // Flag indicating whether EC crypto is available.
// If null, then we have not checked yet. // If null, then we have not checked yet.
// If yes, then all the EC based crypto we need is available. // 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. // Flag indicating whether Kerberos crypto is available.
// If true, then all the Kerberos-based crypto we need is available. // If true, then all the Kerberos-based crypto we need is available.
...@@ -190,7 +190,7 @@ final class JsseJce { ...@@ -190,7 +190,7 @@ final class JsseJce {
// no instantiation of this class // no instantiation of this class
} }
static boolean isEcAvailable() { synchronized static boolean isEcAvailable() {
if (ecAvailable == null) { if (ecAvailable == null) {
try { try {
JsseJce.getSignature(SIGNATURE_ECDSA); JsseJce.getSignature(SIGNATURE_ECDSA);
...@@ -206,7 +206,7 @@ final class JsseJce { ...@@ -206,7 +206,7 @@ final class JsseJce {
return ecAvailable; return ecAvailable;
} }
static void clearEcAvailable() { synchronized static void clearEcAvailable() {
ecAvailable = null; ecAvailable = null;
} }
......
...@@ -27,17 +27,7 @@ ...@@ -27,17 +27,7 @@
*/ */
/* /*
* IBM Confidential * (C) Copyright IBM Corp. 1999 All Rights Reserved.
* 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.
*
*/ */
/* /*
......
...@@ -48,7 +48,7 @@ enum { ...@@ -48,7 +48,7 @@ enum {
JMM_VERSION_1_0 = 0x20010000, JMM_VERSION_1_0 = 0x20010000,
JMM_VERSION_1_1 = 0x20010100, // JDK 6 JMM_VERSION_1_1 = 0x20010100, // JDK 6
JMM_VERSION_1_2 = 0x20010200, // JDK 7 JMM_VERSION_1_2 = 0x20010200, // JDK 7
JMM_VERSION = 0x20010200 JMM_VERSION = 0x20010201
}; };
typedef struct { typedef struct {
...@@ -293,6 +293,9 @@ typedef struct jmmInterface_1_ { ...@@ -293,6 +293,9 @@ typedef struct jmmInterface_1_ {
jlongArray ids, jlongArray ids,
jboolean lockedMonitors, jboolean lockedMonitors,
jboolean lockedSynchronizers); jboolean lockedSynchronizers);
void (JNICALL *SetGCNotificationEnabled) (JNIEnv *env,
jobject mgr,
jboolean enabled);
} JmmInterface; } JmmInterface;
#ifdef __cplusplus #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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * 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 ...@@ -36,3 +36,17 @@ JNIEXPORT jlong JNICALL Java_sun_management_GarbageCollectorImpl_getCollectionTi
(JNIEnv *env, jobject mgr) { (JNIEnv *env, jobject mgr) {
return jmm_interface->GetLongAttribute(env, mgr, JMM_GC_TIME_MS); 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 ...@@ -95,6 +95,13 @@ Java_sun_management_VMManagementImpl_initOptionalSupportFields
value = mos.isThreadAllocatedMemorySupported; value = mos.isThreadAllocatedMemorySupported;
setStaticBooleanField(env, cls, "threadAllocatedMemorySupport", value); 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 JNIEXPORT jobjectArray JNICALL
......
...@@ -63,7 +63,7 @@ int main(int argc, const char* argv[]) { ...@@ -63,7 +63,7 @@ int main(int argc, const char* argv[]) {
out("// AUTOMATICALLY GENERATED FILE - DO NOT EDIT "); out("// AUTOMATICALLY GENERATED FILE - DO NOT EDIT ");
out("package sun.nio.ch; "); out("package sun.nio.ch; ");
out("import java.net.SocketOption; "); out("import java.net.SocketOption; ");
out("import java.net.StandardSocketOption; "); out("import java.net.StandardSocketOptions; ");
out("import java.net.ProtocolFamily; "); out("import java.net.ProtocolFamily; ");
out("import java.net.StandardProtocolFamily; "); out("import java.net.StandardProtocolFamily; ");
out("import java.util.Map; "); out("import java.util.Map; ");
...@@ -73,7 +73,7 @@ int main(int argc, const char* argv[]) { ...@@ -73,7 +73,7 @@ int main(int argc, const char* argv[]) {
out(" private static class RegistryKey { "); out(" private static class RegistryKey { ");
out(" private final SocketOption<?> name; "); out(" private final SocketOption<?> name; ");
out(" private final ProtocolFamily family; "); out(" private final ProtocolFamily family; ");
out(" RegistryKey(SocketOption<?> name, ProtocolFamily family) { "); out(" RegistryKey(SocketOption<?> name, ProtocolFamily family) { ");
out(" this.name = name; "); out(" this.name = name; ");
out(" this.family = family; "); out(" this.family = family; ");
out(" } "); out(" } ");
...@@ -95,23 +95,23 @@ int main(int argc, const char* argv[]) { ...@@ -95,23 +95,23 @@ int main(int argc, const char* argv[]) {
out(" Map<RegistryKey,OptionKey> map = "); out(" Map<RegistryKey,OptionKey> map = ");
out(" new HashMap<RegistryKey,OptionKey>(); "); out(" new HashMap<RegistryKey,OptionKey>(); ");
emit_unspec("StandardSocketOption.SO_BROADCAST", SOL_SOCKET, SO_BROADCAST); emit_unspec("StandardSocketOptions.SO_BROADCAST", SOL_SOCKET, SO_BROADCAST);
emit_unspec("StandardSocketOption.SO_KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE); emit_unspec("StandardSocketOptions.SO_KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE);
emit_unspec("StandardSocketOption.SO_LINGER", SOL_SOCKET, SO_LINGER); emit_unspec("StandardSocketOptions.SO_LINGER", SOL_SOCKET, SO_LINGER);
emit_unspec("StandardSocketOption.SO_SNDBUF", SOL_SOCKET, SO_SNDBUF); emit_unspec("StandardSocketOptions.SO_SNDBUF", SOL_SOCKET, SO_SNDBUF);
emit_unspec("StandardSocketOption.SO_RCVBUF", SOL_SOCKET, SO_RCVBUF); emit_unspec("StandardSocketOptions.SO_RCVBUF", SOL_SOCKET, SO_RCVBUF);
emit_unspec("StandardSocketOption.SO_REUSEADDR", SOL_SOCKET, SO_REUSEADDR); emit_unspec("StandardSocketOptions.SO_REUSEADDR", SOL_SOCKET, SO_REUSEADDR);
emit_unspec("StandardSocketOption.TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY); emit_unspec("StandardSocketOptions.TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY);
emit_inet("StandardSocketOption.IP_TOS", IPPROTO_IP, IP_TOS); emit_inet("StandardSocketOptions.IP_TOS", IPPROTO_IP, IP_TOS);
emit_inet("StandardSocketOption.IP_MULTICAST_IF", IPPROTO_IP, IP_MULTICAST_IF); emit_inet("StandardSocketOptions.IP_MULTICAST_IF", IPPROTO_IP, IP_MULTICAST_IF);
emit_inet("StandardSocketOption.IP_MULTICAST_TTL", IPPROTO_IP, IP_MULTICAST_TTL); emit_inet("StandardSocketOptions.IP_MULTICAST_TTL", IPPROTO_IP, IP_MULTICAST_TTL);
emit_inet("StandardSocketOption.IP_MULTICAST_LOOP", IPPROTO_IP, IP_MULTICAST_LOOP); emit_inet("StandardSocketOptions.IP_MULTICAST_LOOP", IPPROTO_IP, IP_MULTICAST_LOOP);
#ifdef AF_INET6 #ifdef AF_INET6
emit_inet6("StandardSocketOption.IP_MULTICAST_IF", IPPROTO_IPV6, IPV6_MULTICAST_IF); emit_inet6("StandardSocketOptions.IP_MULTICAST_IF", IPPROTO_IPV6, IPV6_MULTICAST_IF);
emit_inet6("StandardSocketOption.IP_MULTICAST_TTL", IPPROTO_IPV6, IPV6_MULTICAST_HOPS); emit_inet6("StandardSocketOptions.IP_MULTICAST_TTL", IPPROTO_IPV6, IPV6_MULTICAST_HOPS);
emit_inet6("StandardSocketOption.IP_MULTICAST_LOOP", IPPROTO_IPV6, IPV6_MULTICAST_LOOP); emit_inet6("StandardSocketOptions.IP_MULTICAST_LOOP", IPPROTO_IPV6, IPV6_MULTICAST_LOOP);
#endif #endif
emit_unspec("ExtendedSocketOption.SO_OOBINLINE", SOL_SOCKET, SO_OOBINLINE); emit_unspec("ExtendedSocketOption.SO_OOBINLINE", SOL_SOCKET, SO_OOBINLINE);
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.SocketAddress; import java.net.SocketAddress;
import java.net.StandardSocketOption; import java.net.StandardSocketOptions;
import java.nio.channels.*; import java.nio.channels.*;
import java.util.*; import java.util.*;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
...@@ -105,7 +105,7 @@ public class ChatServer implements Runnable { ...@@ -105,7 +105,7 @@ public class ChatServer implements Runnable {
*/ */
private AsynchronousServerSocketChannel createListener(AsynchronousChannelGroup channelGroup) throws IOException { private AsynchronousServerSocketChannel createListener(AsynchronousChannelGroup channelGroup) throws IOException {
final AsynchronousServerSocketChannel listener = openChannel(channelGroup); final AsynchronousServerSocketChannel listener = openChannel(channelGroup);
listener.setOption(StandardSocketOption.SO_REUSEADDR, true); listener.setOption(StandardSocketOptions.SO_REUSEADDR, true);
listener.bind(new InetSocketAddress(port)); listener.bind(new InetSocketAddress(port));
return listener; return listener;
} }
...@@ -123,7 +123,7 @@ public class ChatServer implements Runnable { ...@@ -123,7 +123,7 @@ public class ChatServer implements Runnable {
private void handleNewConnection(AsynchronousSocketChannel channel) { private void handleNewConnection(AsynchronousSocketChannel channel) {
Client client = new Client(channel, new ClientReader(this, new NameReader(this))); Client client = new Client(channel, new ClientReader(this, new NameReader(this)));
try { try {
channel.setOption(StandardSocketOption.TCP_NODELAY, true); channel.setOption(StandardSocketOptions.TCP_NODELAY, true);
} catch (IOException e) { } catch (IOException e) {
// ignore // ignore
} }
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
*/ */
import java.nio.file.*; import java.nio.file.*;
import static java.nio.file.StandardWatchEventKind.*; import static java.nio.file.StandardWatchEventKinds.*;
import static java.nio.file.LinkOption.*; import static java.nio.file.LinkOption.*;
import java.nio.file.attribute.*; import java.nio.file.attribute.*;
import java.io.IOException; import java.io.IOException;
......
...@@ -96,7 +96,7 @@ public class Reader { ...@@ -96,7 +96,7 @@ public class Reader {
family = StandardProtocolFamily.INET6; family = StandardProtocolFamily.INET6;
} }
DatagramChannel dc = DatagramChannel.open(family) DatagramChannel dc = DatagramChannel.open(family)
.setOption(StandardSocketOption.SO_REUSEADDR, true) .setOption(StandardSocketOptions.SO_REUSEADDR, true)
.bind(new InetSocketAddress(target.port())); .bind(new InetSocketAddress(target.port()));
if (includeList.isEmpty()) { if (includeList.isEmpty()) {
......
...@@ -59,7 +59,7 @@ public class Sender { ...@@ -59,7 +59,7 @@ public class Sender {
family = StandardProtocolFamily.INET6; family = StandardProtocolFamily.INET6;
DatagramChannel dc = DatagramChannel.open(family).bind(new InetSocketAddress(0)); DatagramChannel dc = DatagramChannel.open(family).bind(new InetSocketAddress(0));
if (target.interf() != null) { if (target.interf() != null) {
dc.setOption(StandardSocketOption.IP_MULTICAST_IF, target.interf()); dc.setOption(StandardSocketOptions.IP_MULTICAST_IF, target.interf());
} }
// send multicast packet // send multicast packet
......
...@@ -55,7 +55,7 @@ import com.sun.nio.sctp.SctpChannel; ...@@ -55,7 +55,7 @@ import com.sun.nio.sctp.SctpChannel;
import com.sun.nio.sctp.SctpSocketOption; import com.sun.nio.sctp.SctpSocketOption;
import sun.nio.ch.PollArrayWrapper; import sun.nio.ch.PollArrayWrapper;
import sun.nio.ch.SelChImpl; 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.SEND_FAILED;
import static sun.nio.ch.SctpResultContainer.ASSOCIATION_CHANGED; import static sun.nio.ch.SctpResultContainer.ASSOCIATION_CHANGED;
import static sun.nio.ch.SctpResultContainer.PEER_ADDRESS_CHANGED; import static sun.nio.ch.SctpResultContainer.PEER_ADDRESS_CHANGED;
......
...@@ -53,7 +53,7 @@ import com.sun.nio.sctp.MessageInfo; ...@@ -53,7 +53,7 @@ import com.sun.nio.sctp.MessageInfo;
import com.sun.nio.sctp.SctpChannel; import com.sun.nio.sctp.SctpChannel;
import com.sun.nio.sctp.SctpMultiChannel; import com.sun.nio.sctp.SctpMultiChannel;
import com.sun.nio.sctp.SctpSocketOption; 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.*; import static sun.nio.ch.SctpResultContainer.*;
/** /**
......
...@@ -35,7 +35,7 @@ import java.util.HashSet; ...@@ -35,7 +35,7 @@ import java.util.HashSet;
import java.security.AccessController; import java.security.AccessController;
import sun.security.action.GetPropertyAction; import sun.security.action.GetPropertyAction;
import com.sun.nio.sctp.SctpSocketOption; import com.sun.nio.sctp.SctpSocketOption;
import static com.sun.nio.sctp.SctpStandardSocketOption.*; import static com.sun.nio.sctp.SctpStandardSocketOptions.*;
public class SctpNet { public class SctpNet {
static final String osName = AccessController.doPrivileged( static final String osName = AccessController.doPrivileged(
......
...@@ -40,7 +40,7 @@ import com.sun.nio.sctp.IllegalUnbindException; ...@@ -40,7 +40,7 @@ import com.sun.nio.sctp.IllegalUnbindException;
import com.sun.nio.sctp.SctpChannel; import com.sun.nio.sctp.SctpChannel;
import com.sun.nio.sctp.SctpServerChannel; import com.sun.nio.sctp.SctpServerChannel;
import com.sun.nio.sctp.SctpSocketOption; import com.sun.nio.sctp.SctpSocketOption;
import com.sun.nio.sctp.SctpStandardSocketOption; import com.sun.nio.sctp.SctpStandardSocketOptions;
/** /**
* An implementation of SctpServerChannel * An implementation of SctpServerChannel
...@@ -386,7 +386,7 @@ public class SctpServerChannelImpl extends SctpServerChannel ...@@ -386,7 +386,7 @@ public class SctpServerChannelImpl extends SctpServerChannel
private static Set<SctpSocketOption<?>> defaultOptions() { private static Set<SctpSocketOption<?>> defaultOptions() {
HashSet<SctpSocketOption<?>> set = new HashSet<SctpSocketOption<?>>(1); HashSet<SctpSocketOption<?>> set = new HashSet<SctpSocketOption<?>>(1);
set.add(SctpStandardSocketOption.SCTP_INIT_MAXSTREAMS); set.add(SctpStandardSocketOptions.SCTP_INIT_MAXSTREAMS);
return Collections.unmodifiableSet(set); return Collections.unmodifiableSet(set);
} }
} }
......
...@@ -210,15 +210,15 @@ class LinuxWatchService ...@@ -210,15 +210,15 @@ class LinuxWatchService
int mask = 0; int mask = 0;
for (WatchEvent.Kind<?> event: events) { for (WatchEvent.Kind<?> event: events) {
if (event == StandardWatchEventKind.ENTRY_CREATE) { if (event == StandardWatchEventKinds.ENTRY_CREATE) {
mask |= IN_CREATE | IN_MOVED_TO; mask |= IN_CREATE | IN_MOVED_TO;
continue; continue;
} }
if (event == StandardWatchEventKind.ENTRY_DELETE) { if (event == StandardWatchEventKinds.ENTRY_DELETE) {
mask |= IN_DELETE | IN_MOVED_FROM; mask |= IN_DELETE | IN_MOVED_FROM;
continue; continue;
} }
if (event == StandardWatchEventKind.ENTRY_MODIFY) { if (event == StandardWatchEventKinds.ENTRY_MODIFY) {
mask |= IN_MODIFY | IN_ATTRIB; mask |= IN_MODIFY | IN_ATTRIB;
continue; continue;
} }
...@@ -378,17 +378,17 @@ class LinuxWatchService ...@@ -378,17 +378,17 @@ class LinuxWatchService
*/ */
private WatchEvent.Kind<?> maskToEventKind(int mask) { private WatchEvent.Kind<?> maskToEventKind(int mask) {
if ((mask & IN_MODIFY) > 0) if ((mask & IN_MODIFY) > 0)
return StandardWatchEventKind.ENTRY_MODIFY; return StandardWatchEventKinds.ENTRY_MODIFY;
if ((mask & IN_ATTRIB) > 0) if ((mask & IN_ATTRIB) > 0)
return StandardWatchEventKind.ENTRY_MODIFY; return StandardWatchEventKinds.ENTRY_MODIFY;
if ((mask & IN_CREATE) > 0) if ((mask & IN_CREATE) > 0)
return StandardWatchEventKind.ENTRY_CREATE; return StandardWatchEventKinds.ENTRY_CREATE;
if ((mask & IN_MOVED_TO) > 0) if ((mask & IN_MOVED_TO) > 0)
return StandardWatchEventKind.ENTRY_CREATE; return StandardWatchEventKinds.ENTRY_CREATE;
if ((mask & IN_DELETE) > 0) if ((mask & IN_DELETE) > 0)
return StandardWatchEventKind.ENTRY_DELETE; return StandardWatchEventKinds.ENTRY_DELETE;
if ((mask & IN_MOVED_FROM) > 0) if ((mask & IN_MOVED_FROM) > 0)
return StandardWatchEventKind.ENTRY_DELETE; return StandardWatchEventKinds.ENTRY_DELETE;
return null; return null;
} }
...@@ -400,7 +400,7 @@ class LinuxWatchService ...@@ -400,7 +400,7 @@ class LinuxWatchService
if ((mask & IN_Q_OVERFLOW) > 0) { if ((mask & IN_Q_OVERFLOW) > 0) {
for (Map.Entry<Integer,LinuxWatchKey> entry: wdToKey.entrySet()) { for (Map.Entry<Integer,LinuxWatchKey> entry: wdToKey.entrySet()) {
entry.getValue() entry.getValue()
.signalEvent(StandardWatchEventKind.OVERFLOW, null); .signalEvent(StandardWatchEventKinds.OVERFLOW, null);
} }
return; return;
} }
......
...@@ -486,7 +486,7 @@ class SolarisWatchService ...@@ -486,7 +486,7 @@ class SolarisWatchService
void processDirectoryEvents(SolarisWatchKey key, int mask) { void processDirectoryEvents(SolarisWatchKey key, int mask) {
if ((mask & (FILE_MODIFIED | FILE_ATTRIB)) != 0) { if ((mask & (FILE_MODIFIED | FILE_ATTRIB)) != 0) {
registerChildren(key.getDirectory(), key, registerChildren(key.getDirectory(), key,
key.events().contains(StandardWatchEventKind.ENTRY_CREATE)); key.events().contains(StandardWatchEventKinds.ENTRY_CREATE));
} }
} }
...@@ -504,14 +504,14 @@ class SolarisWatchService ...@@ -504,14 +504,14 @@ class SolarisWatchService
// entry modified // entry modified
if (((mask & (FILE_MODIFIED | FILE_ATTRIB)) != 0) && 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 // entry removed
if (((mask & (FILE_REMOVED)) != 0) && 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 // Due to 6636438/6636412 we may get a remove event for cases
// where a rmdir/unlink/rename is attempted but fails. Until // where a rmdir/unlink/rename is attempted but fails. Until
...@@ -527,7 +527,7 @@ class SolarisWatchService ...@@ -527,7 +527,7 @@ class SolarisWatchService
} catch (UnixException x) { } } catch (UnixException x) { }
if (removed) if (removed)
key.signalEvent(StandardWatchEventKind.ENTRY_DELETE, node.name()); key.signalEvent(StandardWatchEventKinds.ENTRY_DELETE, node.name());
} }
return false; return false;
} }
...@@ -547,7 +547,7 @@ class SolarisWatchService ...@@ -547,7 +547,7 @@ class SolarisWatchService
// if the ENTRY_MODIFY event is not enabled then we don't need // if the ENTRY_MODIFY event is not enabled then we don't need
// modification events for entries in the directory // modification events for entries in the directory
int events = FILE_NOFOLLOW; int events = FILE_NOFOLLOW;
if (parent.events().contains(StandardWatchEventKind.ENTRY_MODIFY)) if (parent.events().contains(StandardWatchEventKinds.ENTRY_MODIFY))
events |= (FILE_MODIFIED | FILE_ATTRIB); events |= (FILE_MODIFIED | FILE_ATTRIB);
DirectoryStream<Path> stream = null; DirectoryStream<Path> stream = null;
...@@ -567,7 +567,7 @@ class SolarisWatchService ...@@ -567,7 +567,7 @@ class SolarisWatchService
// send ENTRY_CREATE if enabled // send ENTRY_CREATE if enabled
if (sendEvents) { if (sendEvents) {
parent.signalEvent(StandardWatchEventKind.ENTRY_CREATE, name); parent.signalEvent(StandardWatchEventKinds.ENTRY_CREATE, name);
} }
// register it // register it
...@@ -602,12 +602,12 @@ class SolarisWatchService ...@@ -602,12 +602,12 @@ class SolarisWatchService
// update events, rembering if ENTRY_MODIFY was previously // update events, rembering if ENTRY_MODIFY was previously
// enabled or disabled. // enabled or disabled.
boolean wasModifyEnabled = key.events() boolean wasModifyEnabled = key.events()
.contains(StandardWatchEventKind.ENTRY_MODIFY); .contains(StandardWatchEventKinds.ENTRY_MODIFY);
key.setEvents(events); key.setEvents(events);
// check if ENTRY_MODIFY has changed // check if ENTRY_MODIFY has changed
boolean isModifyEnabled = events boolean isModifyEnabled = events
.contains(StandardWatchEventKind.ENTRY_MODIFY); .contains(StandardWatchEventKinds.ENTRY_MODIFY);
if (wasModifyEnabled == isModifyEnabled) { if (wasModifyEnabled == isModifyEnabled) {
return; return;
} }
......
...@@ -892,8 +892,9 @@ Java_sun_nio_fs_UnixNativeDispatcher_getpwuid(JNIEnv* env, jclass this, jint uid ...@@ -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') { if (res != 0 || p == NULL || p->pw_name == NULL || *(p->pw_name) == '\0') {
/* not found or error */ /* not found or error */
if (errno != 0 && errno != ENOENT) if (errno == 0)
throwUnixException(env, errno); errno = ENOENT;
throwUnixException(env, errno);
} else { } else {
jsize len = strlen(p->pw_name); jsize len = strlen(p->pw_name);
result = (*env)->NewByteArray(env, len); result = (*env)->NewByteArray(env, len);
...@@ -941,14 +942,14 @@ Java_sun_nio_fs_UnixNativeDispatcher_getgrgid(JNIEnv* env, jclass this, jint gid ...@@ -941,14 +942,14 @@ Java_sun_nio_fs_UnixNativeDispatcher_getgrgid(JNIEnv* env, jclass this, jint gid
retry = 0; retry = 0;
if (res != 0 || g == NULL || g->gr_name == NULL || *(g->gr_name) == '\0') { if (res != 0 || g == NULL || g->gr_name == NULL || *(g->gr_name) == '\0') {
/* not found or error */ /* not found or error */
if (errno != 0 && errno != ENOENT) { if (errno == ERANGE) {
if (errno == ERANGE) { /* insufficient buffer size so need larger buffer */
/* insufficient buffer size so need larger buffer */ buflen += ENT_BUF_SIZE;
buflen += ENT_BUF_SIZE; retry = 1;
retry = 1; } else {
} else { if (errno == 0)
throwUnixException(env, errno); errno = ENOENT;
} throwUnixException(env, errno);
} }
} else { } else {
jsize len = strlen(g->gr_name); jsize len = strlen(g->gr_name);
......
...@@ -464,15 +464,15 @@ class WindowsWatchService ...@@ -464,15 +464,15 @@ class WindowsWatchService
{ {
switch (action) { switch (action) {
case FILE_ACTION_MODIFIED : case FILE_ACTION_MODIFIED :
return StandardWatchEventKind.ENTRY_MODIFY; return StandardWatchEventKinds.ENTRY_MODIFY;
case FILE_ACTION_ADDED : case FILE_ACTION_ADDED :
case FILE_ACTION_RENAMED_NEW_NAME : case FILE_ACTION_RENAMED_NEW_NAME :
return StandardWatchEventKind.ENTRY_CREATE; return StandardWatchEventKinds.ENTRY_CREATE;
case FILE_ACTION_REMOVED : case FILE_ACTION_REMOVED :
case FILE_ACTION_RENAMED_OLD_NAME : case FILE_ACTION_RENAMED_OLD_NAME :
return StandardWatchEventKind.ENTRY_DELETE; return StandardWatchEventKinds.ENTRY_DELETE;
default : default :
return null; // action not recognized return null; // action not recognized
...@@ -548,7 +548,7 @@ class WindowsWatchService ...@@ -548,7 +548,7 @@ class WindowsWatchService
if (info.error() != 0) { if (info.error() != 0) {
// buffer overflow // buffer overflow
if (info.error() == ERROR_NOTIFY_ENUM_DIR) { if (info.error() == ERROR_NOTIFY_ENUM_DIR) {
key.signalEvent(StandardWatchEventKind.OVERFLOW, null); key.signalEvent(StandardWatchEventKinds.OVERFLOW, null);
} else { } else {
// other error so cancel key // other error so cancel key
implCancelKey(key); implCancelKey(key);
...@@ -562,7 +562,7 @@ class WindowsWatchService ...@@ -562,7 +562,7 @@ class WindowsWatchService
processEvents(key, info.bytesTransferred()); processEvents(key, info.bytesTransferred());
} else { } else {
// insufficient buffer size // insufficient buffer size
key.signalEvent(StandardWatchEventKind.OVERFLOW, null); key.signalEvent(StandardWatchEventKinds.OVERFLOW, null);
} }
// start read for next batch of changes // start read for next batch of changes
......
...@@ -705,7 +705,7 @@ JNIEXPORT jobject JNICALL Java_sun_security_mscapi_RSAKeyPairGenerator_generateR ...@@ -705,7 +705,7 @@ JNIEXPORT jobject JNICALL Java_sun_security_mscapi_RSAKeyPairGenerator_generateR
HCRYPTPROV hCryptProv = NULL; HCRYPTPROV hCryptProv = NULL;
HCRYPTKEY hKeyPair; HCRYPTKEY hKeyPair;
DWORD dwFlags = (keySize << 16) | CRYPT_EXPORTABLE; DWORD dwFlags = (keySize << 16) | CRYPT_EXPORTABLE;
jobject keypair; jobject keypair = NULL;
const char* pszKeyContainerName = NULL; // UUID const char* pszKeyContainerName = NULL; // UUID
__try __try
......
...@@ -195,6 +195,9 @@ java/beans/XMLEncoder/6329581/Test6329581.java generic-all ...@@ -195,6 +195,9 @@ java/beans/XMLEncoder/6329581/Test6329581.java generic-all
# jdk_lang # jdk_lang
# requires junit
java/lang/invoke/InvokeDynamicPrintArgs.java generic-all
# Times out on solaris 10 sparc # Times out on solaris 10 sparc
java/lang/ClassLoader/Assert.java generic-all 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; ...@@ -40,7 +40,7 @@ import com.sun.nio.sctp.SctpServerChannel;
import com.sun.nio.sctp.SctpSocketOption; import com.sun.nio.sctp.SctpSocketOption;
import java.security.AccessController; import java.security.AccessController;
import sun.security.action.GetPropertyAction; 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; import static java.lang.System.out;
public class SocketOptionTests { public class SocketOptionTests {
......
...@@ -48,7 +48,7 @@ import com.sun.nio.sctp.SctpServerChannel; ...@@ -48,7 +48,7 @@ import com.sun.nio.sctp.SctpServerChannel;
import com.sun.nio.sctp.SctpSocketOption; import com.sun.nio.sctp.SctpSocketOption;
import java.security.AccessController; import java.security.AccessController;
import sun.security.action.GetPropertyAction; 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; import static java.lang.System.out;
public class SocketOptionTests { public class SocketOptionTests {
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
import java.nio.channels.*; import java.nio.channels.*;
import java.net.*; import java.net.*;
import static java.net.StandardSocketOption.*; import static java.net.StandardSocketOptions.*;
import java.io.IOException; import java.io.IOException;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.*; import java.nio.channels.*;
import static java.net.StandardSocketOption.*; import static java.net.StandardSocketOptions.*;
import java.net.*; import java.net.*;
import java.util.Random; import java.util.Random;
import java.util.concurrent.*; import java.util.concurrent.*;
...@@ -383,7 +383,7 @@ public class Basic { ...@@ -383,7 +383,7 @@ public class Basic {
// write bytes and close connection // write bytes and close connection
SocketChannel sc = server.accept(); SocketChannel sc = server.accept();
ByteBuffer src = genBuffer(); ByteBuffer src = genBuffer();
sc.setOption(StandardSocketOption.SO_SNDBUF, src.remaining()); sc.setOption(StandardSocketOptions.SO_SNDBUF, src.remaining());
while (src.hasRemaining()) while (src.hasRemaining())
sc.write(src); sc.write(src);
sc.close(); sc.close();
......
...@@ -52,7 +52,7 @@ public class BasicMulticastTests { ...@@ -52,7 +52,7 @@ public class BasicMulticastTests {
StandardProtocolFamily.INET : StandardProtocolFamily.INET6; StandardProtocolFamily.INET : StandardProtocolFamily.INET6;
DatagramChannel dc = DatagramChannel.open(family) DatagramChannel dc = DatagramChannel.open(family)
.setOption(StandardSocketOption.SO_REUSEADDR, true) .setOption(StandardSocketOptions.SO_REUSEADDR, true)
.bind(new InetSocketAddress(source, 0)); .bind(new InetSocketAddress(source, 0));
// check existing key is returned // check existing key is returned
...@@ -115,7 +115,7 @@ public class BasicMulticastTests { ...@@ -115,7 +115,7 @@ public class BasicMulticastTests {
System.out.println("Exception Tests"); System.out.println("Exception Tests");
DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET) DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET)
.setOption(StandardSocketOption.SO_REUSEADDR, true) .setOption(StandardSocketOptions.SO_REUSEADDR, true)
.bind(new InetSocketAddress(0)); .bind(new InetSocketAddress(0));
InetAddress group = InetAddress.getByName("225.4.5.6"); InetAddress group = InetAddress.getByName("225.4.5.6");
......
...@@ -59,7 +59,7 @@ public class MulticastSendReceiveTests { ...@@ -59,7 +59,7 @@ public class MulticastSendReceiveTests {
StandardProtocolFamily.INET6 : StandardProtocolFamily.INET; StandardProtocolFamily.INET6 : StandardProtocolFamily.INET;
DatagramChannel dc = DatagramChannel.open(family) DatagramChannel dc = DatagramChannel.open(family)
.bind(new InetSocketAddress(local, 0)) .bind(new InetSocketAddress(local, 0))
.setOption(StandardSocketOption.IP_MULTICAST_IF, nif); .setOption(StandardSocketOptions.IP_MULTICAST_IF, nif);
int id = rand.nextInt(); int id = rand.nextInt();
byte[] msg = Integer.toString(id).getBytes("UTF-8"); byte[] msg = Integer.toString(id).getBytes("UTF-8");
ByteBuffer buf = ByteBuffer.wrap(msg); ByteBuffer buf = ByteBuffer.wrap(msg);
...@@ -146,7 +146,7 @@ public class MulticastSendReceiveTests { ...@@ -146,7 +146,7 @@ public class MulticastSendReceiveTests {
System.out.format("\nTest DatagramChannel to %s socket\n", family.name()); System.out.format("\nTest DatagramChannel to %s socket\n", family.name());
try (DatagramChannel dc = (family == UNSPEC) ? try (DatagramChannel dc = (family == UNSPEC) ?
DatagramChannel.open() : DatagramChannel.open(family)) { DatagramChannel.open() : DatagramChannel.open(family)) {
dc.setOption(StandardSocketOption.SO_REUSEADDR, true) dc.setOption(StandardSocketOptions.SO_REUSEADDR, true)
.bind(new InetSocketAddress(0)); .bind(new InetSocketAddress(0));
// join group // join group
......
...@@ -31,7 +31,7 @@ import java.nio.channels.*; ...@@ -31,7 +31,7 @@ import java.nio.channels.*;
import java.net.*; import java.net.*;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import static java.net.StandardSocketOption.*; import static java.net.StandardSocketOptions.*;
public class SocketOptionTests { public class SocketOptionTests {
......
...@@ -52,13 +52,16 @@ public class ClosedByInterrupt { ...@@ -52,13 +52,16 @@ public class ClosedByInterrupt {
fc.write(bb); fc.write(bb);
} }
// test with 1-8 concurrent threads // test with 1-16 concurrent threads
for (int i=1; i<=8; i++) { for (int i=1; i<=16; i++) {
System.out.format("%d thread(s)%n", i); System.out.format("%d thread(s)%n", i);
test(f, i); test(f, i);
if (failed) if (failed)
break; break;
} }
if (failed)
throw new RuntimeException("Test failed");
} }
/** /**
...@@ -132,12 +135,14 @@ public class ClosedByInterrupt { ...@@ -132,12 +135,14 @@ public class ClosedByInterrupt {
// give the interruptible thread a chance // give the interruptible thread a chance
try { try {
Thread.sleep(rand.nextInt(50)); Thread.sleep(rand.nextInt(50));
} catch (InterruptedException ignore) { } } catch (InterruptedException e) {
unexpected(e);
}
} }
} }
} catch (ClosedByInterruptException e) { } catch (ClosedByInterruptException e) {
if (interruptible) { if (interruptible) {
if (Thread.currentThread().isInterrupted()) { if (Thread.interrupted()) {
expected(e + " thrown and interrupt status set"); expected(e + " thrown and interrupt status set");
} else { } else {
unexpected(e + " thrown but interrupt status not set"); unexpected(e + " thrown but interrupt status not set");
...@@ -158,7 +163,7 @@ public class ClosedByInterrupt { ...@@ -158,7 +163,7 @@ public class ClosedByInterrupt {
} }
static void expected(Exception e) { 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) { static void expected(String msg) {
......
...@@ -32,7 +32,7 @@ import java.nio.channels.*; ...@@ -32,7 +32,7 @@ import java.nio.channels.*;
import java.net.*; import java.net.*;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import static java.net.StandardSocketOption.*; import static java.net.StandardSocketOptions.*;
public class SocketOptionTests { public class SocketOptionTests {
......
...@@ -39,7 +39,7 @@ public class Shutdown { ...@@ -39,7 +39,7 @@ public class Shutdown {
static void acceptAndReset(ServerSocketChannel ssc) throws IOException { static void acceptAndReset(ServerSocketChannel ssc) throws IOException {
SocketChannel peer = ssc.accept(); SocketChannel peer = ssc.accept();
try { try {
peer.setOption(StandardSocketOption.SO_LINGER, 0); peer.setOption(StandardSocketOptions.SO_LINGER, 0);
peer.configureBlocking(false); peer.configureBlocking(false);
peer.write(ByteBuffer.wrap(new byte[128*1024])); peer.write(ByteBuffer.wrap(new byte[128*1024]));
} finally { } finally {
......
...@@ -32,7 +32,7 @@ import java.nio.channels.*; ...@@ -32,7 +32,7 @@ import java.nio.channels.*;
import java.net.*; import java.net.*;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import static java.net.StandardSocketOption.*; import static java.net.StandardSocketOptions.*;
public class SocketOptionTests { public class SocketOptionTests {
......
...@@ -44,25 +44,25 @@ public class Standard { ...@@ -44,25 +44,25 @@ public class Standard {
"UTF-16BE", "UTF-16LE", "UTF-16" }; "UTF-16BE", "UTF-16LE", "UTF-16" };
public static void realMain(String[] args) { public static void realMain(String[] args) {
check(StandardCharset.US_ASCII instanceof Charset); check(StandardCharsets.US_ASCII instanceof Charset);
check(StandardCharset.ISO_8859_1 instanceof Charset); check(StandardCharsets.ISO_8859_1 instanceof Charset);
check(StandardCharset.UTF_8 instanceof Charset); check(StandardCharsets.UTF_8 instanceof Charset);
check(StandardCharset.UTF_16BE instanceof Charset); check(StandardCharsets.UTF_16BE instanceof Charset);
check(StandardCharset.UTF_16LE instanceof Charset); check(StandardCharsets.UTF_16LE instanceof Charset);
check(StandardCharset.UTF_16 instanceof Charset); check(StandardCharsets.UTF_16 instanceof Charset);
check("US-ASCII".equals(StandardCharset.US_ASCII.name())); check("US-ASCII".equals(StandardCharsets.US_ASCII.name()));
check("ISO-8859-1".equals(StandardCharset.ISO_8859_1.name())); check("ISO-8859-1".equals(StandardCharsets.ISO_8859_1.name()));
check("UTF-8".equals(StandardCharset.UTF_8.name())); check("UTF-8".equals(StandardCharsets.UTF_8.name()));
check("UTF-16BE".equals(StandardCharset.UTF_16BE.name())); check("UTF-16BE".equals(StandardCharsets.UTF_16BE.name()));
check("UTF-16LE".equals(StandardCharset.UTF_16LE.name())); check("UTF-16LE".equals(StandardCharsets.UTF_16LE.name()));
check("UTF-16".equals(StandardCharset.UTF_16.name())); check("UTF-16".equals(StandardCharsets.UTF_16.name()));
Set<String> charsets = new HashSet<>(); Set<String> charsets = new HashSet<>();
Field standardCharsetFields[] = StandardCharset.class.getFields(); Field standardCharsetFields[] = StandardCharsets.class.getFields();
for(Field charsetField : standardCharsetFields) { for(Field charsetField : standardCharsetFields) {
check(StandardCharset.class == charsetField.getDeclaringClass()); check(StandardCharsets.class == charsetField.getDeclaringClass());
check(Modifier.isFinal(charsetField.getModifiers())); check(Modifier.isFinal(charsetField.getModifiers()));
check(Modifier.isStatic(charsetField.getModifiers())); check(Modifier.isStatic(charsetField.getModifiers()));
check(Modifier.isPublic(charsetField.getModifiers())); check(Modifier.isPublic(charsetField.getModifiers()));
......
...@@ -540,7 +540,7 @@ public class CheckPermissions { ...@@ -540,7 +540,7 @@ public class CheckPermissions {
try (WatchService watcher = FileSystems.getDefault().newWatchService()) { try (WatchService watcher = FileSystems.getDefault().newWatchService()) {
prepare(); prepare();
testdir.register(watcher, StandardWatchEventKind.ENTRY_DELETE); testdir.register(watcher, StandardWatchEventKinds.ENTRY_DELETE);
assertCheckRead(testdir); assertCheckRead(testdir);
} }
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
*/ */
import java.nio.file.*; import java.nio.file.*;
import static java.nio.file.StandardWatchEventKind.*; import static java.nio.file.StandardWatchEventKinds.*;
import java.nio.file.attribute.*; import java.nio.file.attribute.*;
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
...@@ -100,7 +100,7 @@ public class Basic { ...@@ -100,7 +100,7 @@ public class Basic {
// remove key and check that we got the ENTRY_CREATE event // remove key and check that we got the ENTRY_CREATE event
takeExpectedKey(watcher, myKey); takeExpectedKey(watcher, myKey);
checkExpectedEvent(myKey.pollEvents(), checkExpectedEvent(myKey.pollEvents(),
StandardWatchEventKind.ENTRY_CREATE, name); StandardWatchEventKinds.ENTRY_CREATE, name);
System.out.println("reset key"); System.out.println("reset key");
if (!myKey.reset()) if (!myKey.reset())
...@@ -121,7 +121,7 @@ public class Basic { ...@@ -121,7 +121,7 @@ public class Basic {
Files.delete(file); Files.delete(file);
takeExpectedKey(watcher, myKey); takeExpectedKey(watcher, myKey);
checkExpectedEvent(myKey.pollEvents(), checkExpectedEvent(myKey.pollEvents(),
StandardWatchEventKind.ENTRY_DELETE, name); StandardWatchEventKinds.ENTRY_DELETE, name);
System.out.println("reset key"); System.out.println("reset key");
if (!myKey.reset()) if (!myKey.reset())
...@@ -149,7 +149,7 @@ public class Basic { ...@@ -149,7 +149,7 @@ public class Basic {
// remove key and check that we got the ENTRY_MODIFY event // remove key and check that we got the ENTRY_MODIFY event
takeExpectedKey(watcher, myKey); takeExpectedKey(watcher, myKey);
checkExpectedEvent(myKey.pollEvents(), checkExpectedEvent(myKey.pollEvents(),
StandardWatchEventKind.ENTRY_MODIFY, name); StandardWatchEventKinds.ENTRY_MODIFY, name);
System.out.println("OKAY"); System.out.println("OKAY");
// done // done
...@@ -424,7 +424,7 @@ public class Basic { ...@@ -424,7 +424,7 @@ public class Basic {
// check that key1 got ENTRY_CREATE // check that key1 got ENTRY_CREATE
takeExpectedKey(watcher1, key1); takeExpectedKey(watcher1, key1);
checkExpectedEvent(key1.pollEvents(), checkExpectedEvent(key1.pollEvents(),
StandardWatchEventKind.ENTRY_CREATE, name2); StandardWatchEventKinds.ENTRY_CREATE, name2);
// check that key2 got zero events // check that key2 got zero events
WatchKey key = watcher2.poll(); WatchKey key = watcher2.poll();
...@@ -437,7 +437,7 @@ public class Basic { ...@@ -437,7 +437,7 @@ public class Basic {
// check that key2 got ENTRY_DELETE // check that key2 got ENTRY_DELETE
takeExpectedKey(watcher2, key2); takeExpectedKey(watcher2, key2);
checkExpectedEvent(key2.pollEvents(), checkExpectedEvent(key2.pollEvents(),
StandardWatchEventKind.ENTRY_DELETE, name1); StandardWatchEventKinds.ENTRY_DELETE, name1);
// check that key1 got zero events // check that key1 got zero events
key = watcher1.poll(); key = watcher1.poll();
...@@ -458,7 +458,7 @@ public class Basic { ...@@ -458,7 +458,7 @@ public class Basic {
Files.createFile(file1); Files.createFile(file1);
takeExpectedKey(watcher2, key2); takeExpectedKey(watcher2, key2);
checkExpectedEvent(key2.pollEvents(), checkExpectedEvent(key2.pollEvents(),
StandardWatchEventKind.ENTRY_CREATE, name1); StandardWatchEventKinds.ENTRY_CREATE, name1);
System.out.println("OKAY"); System.out.println("OKAY");
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
*/ */
import java.nio.file.*; import java.nio.file.*;
import static java.nio.file.StandardWatchEventKind.*; import static java.nio.file.StandardWatchEventKinds.*;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.*; import java.util.*;
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
*/ */
import java.nio.file.*; import java.nio.file.*;
import static java.nio.file.StandardWatchEventKind.*; import static java.nio.file.StandardWatchEventKinds.*;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.*; import java.util.*;
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
*/ */
import java.nio.file.*; import java.nio.file.*;
import static java.nio.file.StandardWatchEventKind.*; import static java.nio.file.StandardWatchEventKinds.*;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Random; import java.util.Random;
......
...@@ -66,7 +66,7 @@ public class WithSecurityManager { ...@@ -66,7 +66,7 @@ public class WithSecurityManager {
// attempt to register directory // attempt to register directory
try { try {
dir.register(dir.getFileSystem().newWatchService(), dir.register(dir.getFileSystem().newWatchService(),
new WatchEvent.Kind<?>[]{ StandardWatchEventKind.ENTRY_CREATE }, new WatchEvent.Kind<?>[]{ StandardWatchEventKinds.ENTRY_CREATE },
modifiers); modifiers);
if (expectedToFail) if (expectedToFail)
throw new RuntimeException("SecurityException not thrown"); throw new RuntimeException("SecurityException not thrown");
......
/*
* 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 6487638 7041595
* @summary Calling LogManager.addLogger() and Logger.getLogger() cause deadlock
* @author Serguei Spitsyn
* @build LoggingDeadlock3
* @run main/timeout=15 LoggingDeadlock3
*/
import java.io.*;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class LoggingDeadlock3 {
static final int ITER_CNT = 50000;
static final String MSG_PASSED = "LoggingDeadlock3: passed";
static final LogManager logMgr = LogManager.getLogManager();
static final PrintStream out = System.out;
public static void main(String args[]) throws Exception {
String tstSrc = System.getProperty("test.src");
File fname = new File(tstSrc, "LoggingDeadlock3.props");
String prop = fname.getCanonicalPath();
System.setProperty("java.util.logging.config.file", prop);
logMgr.readConfiguration();
Thread t1 = new Thread(new AddLogger());
Thread t2 = new Thread(new GetLogger());
t1.start(); t2.start();
t1.join(); t2.join();
out.println("\n" + MSG_PASSED);
}
public static class MyLogger extends Logger {
protected MyLogger(String name) { super(name, null); }
}
public static class GetLogger implements Runnable {
public void run() {
for (int cnt = 0; cnt < ITER_CNT * 8; cnt++) {
Logger logger = Logger.getLogger("com.sun.Hello"+cnt/10);
if (cnt % 1000 == 0) out.print("1");
if (cnt % 10000 == 0) out.println();
}
}
}
public static class AddLogger implements Runnable {
public void run() {
for (int cnt = 0; cnt < ITER_CNT; cnt++) {
Logger addLogger = new MyLogger("com.sun.Hello"+cnt);
logMgr.addLogger(addLogger);
if (cnt % 100 == 0) out.print("2");
if (cnt % 1000 == 0) out.println();
}
}
}
}
com.sun.LEVEL=FINE
com.sun.level=FINE
com.sun.Hello.level=INFO
/*
* 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 6977677
* @summary Deadlock between LogManager.<clinit> and Logger.getLogger()
* @author Daniel D. Daugherty
* @build LoggingDeadlock4
* @run main/timeout=15 LoggingDeadlock4
*/
import java.awt.Container;
import java.util.concurrent.CountDownLatch;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class LoggingDeadlock4 {
private static CountDownLatch barrier = new CountDownLatch(1);
private static CountDownLatch lmIsRunning = new CountDownLatch(1);
private static CountDownLatch logIsRunning = new CountDownLatch(1);
public static void main(String[] args) {
System.out.println("main: LoggingDeadlock4 is starting.");
// Loading the java.awt.Container class will create a
// sun.util.logging.PlatformLogger$JavaLogger object
// that has to be redirected when the LogManager class
// is initialized. This can cause a deadlock between
// LogManager.<clinit> and Logger.getLogger().
try {
Class.forName("java.awt.Container");
} catch (ClassNotFoundException cnfe) {
throw new RuntimeException("Test failed: could not load"
+ " java.awt.Container." + cnfe);
}
Thread lmThread = new Thread("LogManagerThread") {
public void run() {
// let main know LogManagerThread is running
lmIsRunning.countDown();
System.out.println(Thread.currentThread().getName()
+ ": is running.");
try {
barrier.await(); // wait for race to start
} catch (InterruptedException e) {
}
LogManager manager = LogManager.getLogManager();
}
};
lmThread.start();
Thread logThread = new Thread("LoggerThread") {
public void run() {
// let main know LoggerThread is running
logIsRunning.countDown();
System.out.println(Thread.currentThread().getName()
+ ": is running.");
try {
barrier.await(); // wait for race to start
} catch (InterruptedException e) {
}
Logger foo = Logger.getLogger("foo logger");
}
};
logThread.start();
try {
// wait for LogManagerThread and LoggerThread to get going
lmIsRunning.await();
logIsRunning.await();
} catch (InterruptedException e) {
}
barrier.countDown(); // start the race
try {
lmThread.join();
logThread.join();
} catch (InterruptedException ie) {
}
System.out.println("main: LoggingDeadlock4 is done.");
}
}
/*
* Copyright (c) 2008, 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 6659215
* @summary Test on timer start method with past notifications
* @author Shanliang JIANG
* @run clean StartTest
* @run build StartTest
* @run main StartTest
*/
import java.util.Date;
import javax.management.timer.Timer;
import javax.management.Notification;
import javax.management.NotificationListener;
public class StartTest {
public static void main(String[] args) throws Exception {
System.out.println(
">>> Test on timer start method with past notifications.");
System.out.println(">>> Create a Timer object.");
Timer timer = new Timer();
System.out.println(
">>> Set the flag (setSendPastNotification) to true.");
timer.setSendPastNotifications(true);
timer.addNotificationListener(myListener, null, null);
System.out.println(">>> Add notifications: " + SENT);
Date date = new Date();
for (int i = 0; i < SENT; i++) {
timer.addNotification(
"testType" + i, "testMsg" + i, "testData" + i, date);
}
System.out.println(">>> The notifications should be sent at " + date);
System.out.println(">>> Sleep 100 ms to have past notifications.");
Thread.sleep(100);
System.out.println(">>> Start the timer at " + new Date());
timer.start();
System.out.println(">>> Stop the timer.");
Thread.sleep(100);
stopping = true;
timer.stop();
if (received != SENT) {
throw new RuntimeException(
"Expected to receive " + SENT + " but got " + received);
}
System.out.println(">>> Received all expected notifications.");
System.out.println(">>> Bye bye!");
}
private static NotificationListener myListener =
new NotificationListener() {
public void handleNotification(Notification n, Object hb) {
if (!stopping) {
received++;
System.out.println(
">>> myListener-handleNotification: received " +
n.getSequenceNumber());
}
}
};
private static int SENT = 10;
private static volatile int received = 0;
private static volatile boolean stopping = false;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册