62 lines
1.9 KiB
Java
62 lines
1.9 KiB
Java
/* GENERATED SOURCE. DO NOT MODIFY. */
|
|
/*
|
|
* Copyright (C) 2014 Square, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package com.android.okhttp.okio;
|
|
|
|
/**
|
|
* A collection of unused segments, necessary to avoid GC churn and zero-fill.
|
|
* This pool is a thread-safe static singleton.
|
|
*/
|
|
final class SegmentPool {
|
|
/** The maximum number of bytes to pool. */
|
|
// TODO: Is 64 KiB a good maximum size? Do we ever have that many idle segments?
|
|
static final long MAX_SIZE = 64 * 1024; // 64 KiB.
|
|
|
|
/** Singly-linked list of segments. */
|
|
static Segment next;
|
|
|
|
/** Total bytes in this pool. */
|
|
static long byteCount;
|
|
|
|
private SegmentPool() {
|
|
}
|
|
|
|
static Segment take() {
|
|
synchronized (SegmentPool.class) {
|
|
if (next != null) {
|
|
Segment result = next;
|
|
next = result.next;
|
|
result.next = null;
|
|
byteCount -= Segment.SIZE;
|
|
return result;
|
|
}
|
|
}
|
|
return new Segment(); // Pool is empty. Don't zero-fill while holding a lock.
|
|
}
|
|
|
|
static void recycle(Segment segment) {
|
|
if (segment.next != null || segment.prev != null) throw new IllegalArgumentException();
|
|
if (segment.shared) return; // This segment cannot be recycled.
|
|
synchronized (SegmentPool.class) {
|
|
if (byteCount + Segment.SIZE > MAX_SIZE) return; // Pool is full.
|
|
byteCount += Segment.SIZE;
|
|
segment.next = next;
|
|
segment.pos = segment.limit = 0;
|
|
next = segment;
|
|
}
|
|
}
|
|
}
|