View Javadoc
1   /*
2    * Copyright 2017 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  
17  package io.netty5.util;
18  
19  import io.netty5.util.internal.ObjectUtil;
20  import io.netty5.util.internal.SystemPropertyUtil;
21  
22  import java.util.Locale;
23  
24  /**
25   * A utility class for wrapping calls to {@link Runtime}.
26   */
27  public final class NettyRuntime {
28  
29      /**
30       * Holder class for available processors to enable testing.
31       */
32      static class AvailableProcessorsHolder {
33  
34          private int availableProcessors;
35  
36          /**
37           * Set the number of available processors.
38           *
39           * @param availableProcessors the number of available processors
40           * @throws IllegalArgumentException if the specified number of available processors is non-positive
41           * @throws IllegalStateException    if the number of available processors is already configured
42           */
43          synchronized void setAvailableProcessors(final int availableProcessors) {
44              ObjectUtil.checkPositive(availableProcessors, "availableProcessors");
45              if (this.availableProcessors != 0) {
46                  final String message = String.format(
47                          Locale.ROOT,
48                          "availableProcessors is already set to [%d], rejecting [%d]",
49                          this.availableProcessors,
50                          availableProcessors);
51                  throw new IllegalStateException(message);
52              }
53              this.availableProcessors = availableProcessors;
54          }
55  
56          /**
57           * Get the configured number of available processors. The default is {@link Runtime#availableProcessors()}.
58           * This can be overridden by setting the system property "io.netty5.availableProcessors" or by invoking
59           * {@link #setAvailableProcessors(int)} before any calls to this method.
60           *
61           * @return the configured number of available processors
62           */
63          @SuppressForbidden(reason = "to obtain default number of available processors")
64          synchronized int availableProcessors() {
65              if (this.availableProcessors == 0) {
66                  final int availableProcessors =
67                          SystemPropertyUtil.getInt(
68                                  "io.netty5.availableProcessors",
69                                  Runtime.getRuntime().availableProcessors());
70                  setAvailableProcessors(availableProcessors);
71              }
72              return this.availableProcessors;
73          }
74      }
75  
76      private static final AvailableProcessorsHolder holder = new AvailableProcessorsHolder();
77  
78      /**
79       * Set the number of available processors.
80       *
81       * @param availableProcessors the number of available processors
82       * @throws IllegalArgumentException if the specified number of available processors is non-positive
83       * @throws IllegalStateException    if the number of available processors is already configured
84       */
85      @SuppressWarnings("unused,WeakerAccess") // this method is part of the public API
86      public static void setAvailableProcessors(final int availableProcessors) {
87          holder.setAvailableProcessors(availableProcessors);
88      }
89  
90      /**
91       * Get the configured number of available processors. The default is {@link Runtime#availableProcessors()}. This
92       * can be overridden by setting the system property "io.netty5.availableProcessors" or by invoking
93       * {@link #setAvailableProcessors(int)} before any calls to this method.
94       *
95       * @return the configured number of available processors
96       */
97      public static int availableProcessors() {
98          return holder.availableProcessors();
99      }
100 
101     /**
102      * No public constructor to prevent instances from being created.
103      */
104     private NettyRuntime() {
105     }
106 }