9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.nio;
27
28 import jdk.internal.access.JavaLangRefAccess;
29 import jdk.internal.access.JavaNioAccess;
30 import jdk.internal.access.SharedSecrets;
31 import jdk.internal.misc.Unsafe;
32 import jdk.internal.misc.VM;
33
34 import java.util.concurrent.atomic.AtomicLong;
35
36 /**
37 * Access to bits, native and otherwise.
38 */
39
40 class Bits { // package-private
41
42 private Bits() { }
43
44
45 // -- Swapping --
46
47 static short swap(short x) {
48 return Short.reverseBytes(x);
49 }
50
51 static char swap(char x) {
52 return Character.reverseBytes(x);
193 long totalCap;
194 while (cap <= MAX_MEMORY - (totalCap = TOTAL_CAPACITY.get())) {
195 if (TOTAL_CAPACITY.compareAndSet(totalCap, totalCap + cap)) {
196 RESERVED_MEMORY.addAndGet(size);
197 COUNT.incrementAndGet();
198 return true;
199 }
200 }
201
202 return false;
203 }
204
205
206 static void unreserveMemory(long size, int cap) {
207 long cnt = COUNT.decrementAndGet();
208 long reservedMem = RESERVED_MEMORY.addAndGet(-size);
209 long totalCap = TOTAL_CAPACITY.addAndGet(-cap);
210 assert cnt >= 0 && reservedMem >= 0 && totalCap >= 0;
211 }
212
213 static final JavaNioAccess.BufferPool BUFFER_POOL = new JavaNioAccess.BufferPool() {
214 @Override
215 public String getName() {
216 return "direct";
217 }
218 @Override
219 public long getCount() {
220 return Bits.COUNT.get();
221 }
222 @Override
223 public long getTotalCapacity() {
224 return Bits.TOTAL_CAPACITY.get();
225 }
226 @Override
227 public long getMemoryUsed() {
228 return Bits.RESERVED_MEMORY.get();
229 }
230 };
231
232 // These numbers represent the point at which we have empirically
233 // determined that the average cost of a JNI call exceeds the expense
|
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.nio;
27
28 import jdk.internal.access.JavaLangRefAccess;
29 import jdk.internal.access.SharedSecrets;
30 import jdk.internal.misc.Unsafe;
31 import jdk.internal.misc.VM;
32 import jdk.internal.misc.VM.BufferPool;
33
34 import java.util.concurrent.atomic.AtomicLong;
35
36 /**
37 * Access to bits, native and otherwise.
38 */
39
40 class Bits { // package-private
41
42 private Bits() { }
43
44
45 // -- Swapping --
46
47 static short swap(short x) {
48 return Short.reverseBytes(x);
49 }
50
51 static char swap(char x) {
52 return Character.reverseBytes(x);
193 long totalCap;
194 while (cap <= MAX_MEMORY - (totalCap = TOTAL_CAPACITY.get())) {
195 if (TOTAL_CAPACITY.compareAndSet(totalCap, totalCap + cap)) {
196 RESERVED_MEMORY.addAndGet(size);
197 COUNT.incrementAndGet();
198 return true;
199 }
200 }
201
202 return false;
203 }
204
205
206 static void unreserveMemory(long size, int cap) {
207 long cnt = COUNT.decrementAndGet();
208 long reservedMem = RESERVED_MEMORY.addAndGet(-size);
209 long totalCap = TOTAL_CAPACITY.addAndGet(-cap);
210 assert cnt >= 0 && reservedMem >= 0 && totalCap >= 0;
211 }
212
213 static final BufferPool BUFFER_POOL = new BufferPool() {
214 @Override
215 public String getName() {
216 return "direct";
217 }
218 @Override
219 public long getCount() {
220 return Bits.COUNT.get();
221 }
222 @Override
223 public long getTotalCapacity() {
224 return Bits.TOTAL_CAPACITY.get();
225 }
226 @Override
227 public long getMemoryUsed() {
228 return Bits.RESERVED_MEMORY.get();
229 }
230 };
231
232 // These numbers represent the point at which we have empirically
233 // determined that the average cost of a JNI call exceeds the expense
|