| /* |
| * Copyright (C) 2008, Google Inc. |
| * Copyright (C) 2006-2008, Shawn O. Pearce <spearce@spearce.org> and others |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Distribution License v. 1.0 which is available at |
| * https://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| package org.eclipse.jgit.lib; |
| |
| import java.util.zip.Inflater; |
| |
| /** |
| * Creates zlib based inflaters as necessary for object decompression. |
| */ |
| public class InflaterCache { |
| private static final int SZ = 4; |
| |
| private static final Inflater[] inflaterCache; |
| |
| private static int openInflaterCount; |
| |
| static { |
| inflaterCache = new Inflater[SZ]; |
| } |
| |
| /** |
| * Obtain an Inflater for decompression. |
| * <p> |
| * Inflaters obtained through this cache should be returned (if possible) by |
| * {@link #release(Inflater)} to avoid garbage collection and reallocation. |
| * |
| * @return an available inflater. Never null. |
| */ |
| public static Inflater get() { |
| final Inflater r = getImpl(); |
| return r != null ? r : new Inflater(false); |
| } |
| |
| private static synchronized Inflater getImpl() { |
| if (openInflaterCount > 0) { |
| final Inflater r = inflaterCache[--openInflaterCount]; |
| inflaterCache[openInflaterCount] = null; |
| return r; |
| } |
| return null; |
| } |
| |
| /** |
| * Release an inflater previously obtained from this cache. |
| * |
| * @param i |
| * the inflater to return. May be null, in which case this method |
| * does nothing. |
| */ |
| public static void release(Inflater i) { |
| if (i != null) { |
| i.reset(); |
| if (releaseImpl(i)) |
| i.end(); |
| } |
| } |
| |
| private static synchronized boolean releaseImpl(Inflater i) { |
| if (openInflaterCount < SZ) { |
| inflaterCache[openInflaterCount++] = i; |
| return false; |
| } |
| return true; |
| } |
| |
| private InflaterCache() { |
| throw new UnsupportedOperationException(); |
| } |
| } |