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  package io.netty.util.internal;
17  
18  import java.nio.ByteBuffer;
19  
20  /**
21   * Allows to free direct {@link ByteBuffer}s.
22   */
23  interface Cleaner {
24      /**
25       * Create a direct {@link ByteBuffer} and return it alongside its cleaning mechanism,
26       * in a {@link CleanableDirectBuffer}.
27       *
28       * @param capacity The desired capacity of the direct buffer.
29       * @return The new {@link CleanableDirectBuffer} instance.
30       */
31      CleanableDirectBuffer allocate(int capacity);
32  
33      /**
34       * Reallocate a direct buffer with a new capacity. The old buffer is consumed and
35       * must not be used after this call.
36       * <p>
37       * The default implementation allocates a new buffer, copies the data, and frees the old one.
38       * Implementations may override this to provide more efficient reallocation (e.g. via
39       * {@code Unsafe.reallocateMemory}).
40       */
41      default CleanableDirectBuffer reallocate(CleanableDirectBuffer old, int newCapacity) {
42          CleanableDirectBuffer newBuf = allocate(newCapacity);
43          ByteBuffer oldBB = old.buffer();
44          ByteBuffer newBB = newBuf.buffer();
45          int bytesToCopy = Math.min(oldBB.capacity(), newCapacity);
46          oldBB.position(0).limit(bytesToCopy);
47          newBB.position(0).limit(bytesToCopy);
48          newBB.put(oldBB).clear();
49          old.clean();
50          return newBuf;
51      }
52  
53      /**
54       * Free a direct {@link ByteBuffer} if possible
55       *
56       * @deprecated Instead allocate buffers from {@link #allocate(int)}
57       * and use the associated {@link CleanableDirectBuffer#clean()} method.
58       */
59      @Deprecated
60      void freeDirectBuffer(ByteBuffer buffer);
61  
62      /**
63       * Check if the clean operation is "relatively expensive".
64       * Expensive clean operations are fine for pooling allocators, but should be avoided for unpooled buffers.
65       * @return {@code true} if this Cleaner has an expensive clean
66       * (i.e. {@link CleanableDirectBuffer#clean()}) operation.
67       */
68      boolean hasExpensiveClean();
69  }