< prev index next >
src/java.base/share/classes/java/net/DatagramSocket.java
Print this page
rev 57619 : [mq]: MulticastSocketAdaptor
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 1995, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2020, 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
@@ -113,24 +113,23 @@
*/
public class DatagramSocket implements java.io.Closeable {
/**
* Various states of this socket.
*/
- private boolean created = false;
private boolean bound = false;
private boolean closed = false;
private Object closeLock = new Object();
/*
* The implementation of this DatagramSocket.
*/
- DatagramSocketImpl impl;
+ private final DatagramSocketImpl impl;
/**
* Are we using an older DatagramSocketImpl?
*/
- boolean oldImpl = false;
+ final boolean oldImpl;
/**
* Set when a socket is ST_CONNECTED until we are certain
* that any packets which might have been received prior
* to calling connect() but not read by the application
@@ -253,11 +252,11 @@
*/
protected DatagramSocket(DatagramSocketImpl impl) {
if (impl == null)
throw new NullPointerException();
this.impl = impl;
- checkOldImpl();
+ this.oldImpl = checkOldImpl(impl);
}
/**
* Creates a datagram socket, bound to the specified local
* socket address.
@@ -280,12 +279,21 @@
*
* @see SecurityManager#checkListen
* @since 1.4
*/
public DatagramSocket(SocketAddress bindaddr) throws SocketException {
+ // Special case initialization for the DatagramChannel socket adaptor.
+ if (this instanceof sun.nio.ch.DatagramSocketAdaptor) {
+ this.impl = null; // no DatagramSocketImpl
+ this.oldImpl = false;
+ return;
+ }
+
// create a datagram socket.
- createImpl();
+ boolean multicast = (this instanceof MulticastSocket);
+ this.impl = createImpl(multicast);
+ this.oldImpl = checkOldImpl(impl);
if (bindaddr != null) {
try {
bind(bindaddr);
} finally {
if (!isBound())
@@ -344,13 +352,15 @@
*/
public DatagramSocket(int port, InetAddress laddr) throws SocketException {
this(new InetSocketAddress(laddr, port));
}
- private void checkOldImpl() {
- if (impl == null)
- return;
+ /**
+ * Return true if the given DatagramSocketImpl is an "old" impl. An old impl
+ * is one that doesn't implement the abstract methods added in Java SE 1.4.
+ */
+ private static boolean checkOldImpl(DatagramSocketImpl impl) {
// DatagramSocketImpl.peekData() is a protected method, therefore we need to use
// getDeclaredMethod, therefore we need permission to access the member
try {
AccessController.doPrivileged(
new PrivilegedExceptionAction<>() {
@@ -359,46 +369,44 @@
cl[0] = DatagramPacket.class;
impl.getClass().getDeclaredMethod("peekData", cl);
return null;
}
});
+ return false;
} catch (java.security.PrivilegedActionException e) {
- oldImpl = true;
+ return true;
}
}
static Class<?> implClass = null;
- void createImpl() throws SocketException {
- if (impl == null) {
+ /**
+ * Creates a DatagramSocketImpl.
+ * @param multicast true if the DatagramSocketImpl is for a MulticastSocket
+ */
+ private static DatagramSocketImpl createImpl(boolean multicast) throws SocketException {
+ DatagramSocketImpl impl;
+ DatagramSocketImplFactory factory = DatagramSocket.factory;
if (factory != null) {
impl = factory.createDatagramSocketImpl();
- checkOldImpl();
} else {
- boolean isMulticast = (this instanceof MulticastSocket) ? true : false;
- impl = DefaultDatagramSocketImplFactory.createDatagramSocketImpl(isMulticast);
-
- checkOldImpl();
- }
+ impl = DefaultDatagramSocketImplFactory.createDatagramSocketImpl(multicast);
}
// creates a udp socket
impl.create();
- created = true;
+ return impl;
}
/**
- * Get the {@code DatagramSocketImpl} attached to this socket,
- * creating it if necessary.
+ * Return the {@code DatagramSocketImpl} attached to this socket.
*
* @return the {@code DatagramSocketImpl} attached to that
* DatagramSocket
- * @throws SocketException if creation fails.
+ * @throws SocketException never thrown
* @since 1.4
*/
DatagramSocketImpl getImpl() throws SocketException {
- if (!created)
- createImpl();
return impl;
}
/**
* Binds this DatagramSocket to a specific address and port.
@@ -1319,11 +1327,11 @@
}
/**
* User defined factory for all datagram sockets.
*/
- static DatagramSocketImplFactory factory;
+ private static volatile DatagramSocketImplFactory factory;
/**
* Sets the datagram socket implementation factory for the
* application. The factory can be specified only once.
* <p>
< prev index next >