/*
 * Copyright 2014-2019 Real Logic Ltd.
 *
 * 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 org.agrona;

public class CloseHelper
{
    /**
     * Quietly close a {@link java.lang.AutoCloseable} dealing with nulls and exceptions.
     *
     * @param closeable to be closed.
     */
    public static void quietClose(final AutoCloseable closeable)
    {
        try
        {
            if (null != closeable)
            {
                closeable.close();
            }
        }
        catch (final Exception ignore)
        {
        }
    }

    /**
     * Close a {@link java.lang.AutoCloseable} dealing with nulls and exceptions.
     * This version re-throws exceptions as runtime exceptions.
     *
     * @param closeable to be closed.
     */
    public static void close(final AutoCloseable closeable)
    {
        try
        {
            if (null != closeable)
            {
                closeable.close();
            }
        }
        catch (final Exception e)
        {
            LangUtil.rethrowUnchecked(e);
        }
    }
}

@@ -614,16 +614,93 @@
 grona;%0A%0A
+import java.util.ArrayList;%0Aimport java.util.Arrays;%0Aimport java.util.List;%0A%0A
 public c
@@ -1640,11 +1640,1552 @@
  %7D%0A    %7D
+%0A%0A    /**%0A     * Close all closeables in closeables. If any of them throw then throw that exception.%0A     * If multiple closeables throw an exception when being closed, then throw an exception that contains%0A     * all of them as suppressed exceptions.%0A     *%0A     * @param closeables to be closed.%0A     */%0A    public static void closeAll(final List%3C? extends AutoCloseable%3E closeables)%0A    %7B%0A        if (closeables == null)%0A        %7B%0A            return;%0A        %7D%0A%0A        final List%3CException%3E exceptions = new ArrayList%3C%3E();%0A        for (final AutoCloseable closeable : closeables)%0A        %7B%0A            if (closeable != null)%0A            %7B%0A                try%0A                %7B%0A                    closeable.close();%0A                %7D%0A                catch (final Exception ex)%0A                %7B%0A                    exceptions.add(ex);%0A                %7D%0A            %7D%0A        %7D%0A%0A        if (!exceptions.isEmpty())%0A        %7B%0A            final Exception exception = exceptions.remove(0);%0A            exceptions.forEach(exception::addSuppressed);%0A            LangUtil.rethrowUnchecked(exception);%0A        %7D%0A    %7D%0A%0A    /**%0A     * Close all closeables in closeables. If any of them throw then throw that exception.%0A     * If multiple closeables throw an exception when being closed, then throw an exception that contains%0A     * all of them as suppressed exceptions.%0A     *%0A     * @param closeables to be closed.%0A     */%0A    public static void closeAll(final AutoCloseable... closeables)%0A    %7B%0A        closeAll(Arrays.asList(closeables));%0A    %7D
 %0A%7D%0A

add a pair of close all methods