View Javadoc
1   /*
2    * Copyright 2014 The Netty Project
3    *
4    * The Netty Project licenses this file to you under the Apache License,
5    * version 2.0 (the "License"); you may not use this file except in compliance
6    * with the License. You may obtain a copy of the License at:
7    *
8    *   https://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13   * License for the specific language governing permissions and limitations
14   * under the License.
15   */
16  package io.netty5.channel.unix;
17  
18  import io.netty5.util.internal.ClassInitializerUtil;
19  import io.netty5.util.internal.UnstableApi;
20  
21  import java.io.IOException;
22  import java.net.InetSocketAddress;
23  import java.net.PortUnreachableException;
24  import java.nio.channels.ClosedChannelException;
25  import java.util.concurrent.atomic.AtomicBoolean;
26  
27  /**
28   * Tells if <a href="https://netty.io/wiki/native-transports.html">{@code netty-transport-native-unix}</a> is
29   * supported.
30   */
31  public final class Unix {
32      private static final AtomicBoolean registered = new AtomicBoolean();
33  
34      static {
35          // Preload all classes that will be used in the OnLoad(...) function of JNI to eliminate the possiblity of a
36          // class-loader deadlock. This is a workaround for https://github.com/netty/netty/issues/11209.
37  
38          // This needs to match all the classes that are loaded via NETTY_JNI_UTIL_LOAD_CLASS or looked up via
39          // NETTY_JNI_UTIL_FIND_CLASS.
40          ClassInitializerUtil.tryLoadClasses(Unix.class,
41                  // netty_unix_errors
42                  OutOfMemoryError.class, RuntimeException.class, ClosedChannelException.class,
43                  IOException.class, PortUnreachableException.class,
44  
45                  // netty_unix_socket
46                  DatagramSocketAddress.class, DomainDatagramSocketAddress.class, InetSocketAddress.class
47          );
48      }
49  
50      /**
51       * Internal method... Should never be called from the user.
52       *
53       * @param registerTask The task to run if this thread caused registration.
54       */
55      @UnstableApi
56      public static synchronized void registerInternal(Runnable registerTask) {
57          registerTask.run();
58          Socket.initialize();
59      }
60  
61      /**
62       * Returns {@code true} if and only if the <a href="https://netty.io/wiki/native-transports.html">{@code
63       * netty_transport_native_unix}</a> is available.
64       */
65      @Deprecated
66      public static boolean isAvailable() {
67          return false;
68      }
69  
70      /**
71       * Ensure that <a href="https://netty.io/wiki/native-transports.html">{@code netty_transport_native_unix}</a> is
72       * available.
73       *
74       * @throws UnsatisfiedLinkError if unavailable
75       */
76      @Deprecated
77      public static void ensureAvailability() {
78         throw new UnsupportedOperationException();
79      }
80  
81      /**
82       * Returns the cause of unavailability of <a href="https://netty.io/wiki/native-transports.html">
83       * {@code netty_transport_native_unix}</a>.
84       *
85       * @return the cause if unavailable. {@code null} if available.
86       */
87      @Deprecated
88      public static Throwable unavailabilityCause() {
89          return new UnsupportedOperationException();
90      }
91  
92      private Unix() {
93      }
94  }