/*
 * 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;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

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);
        }
    }

    /**
     * Close all closeables in closeables. If any of them throw then throw that exception.
     * If multiple closeables throw an exception when being closed, then throw an exception that contains
     * all of them as suppressed exceptions.
     *
     * @param closeables to be closed.
     */
    public static void closeAll(final List<? extends AutoCloseable> closeables)
    {
        if (closeables == null)
        {
            return;
        }

        List<Exception> exceptions = null;
        for (final AutoCloseable closeable : closeables)
        {
            if (closeable != null)
            {
                try
                {
                    closeable.close();
                }
                catch (final Exception ex)
                {
                    if (exceptions == null)
                    {
                        exceptions = new ArrayList<>();
                    }
                    exceptions.add(ex);
                }
            }
        }

        if (exceptions != null)
        {
            final Exception exception = exceptions.remove(0);
            exceptions.forEach(exception::addSuppressed);
            LangUtil.rethrowUnchecked(exception);
        }
    }

    /**
     * Close all closeables in closeables. If any of them throw then throw that exception.
     * If multiple closeables throw an exception when being closed, then throw an exception that contains
     * all of them as suppressed exceptions.
     *
     * @param closeables to be closed.
     */
    public static void closeAll(final AutoCloseable... closeables)
    {
        closeAll(Arrays.asList(closeables));
    }
}

@@ -1128,32 +1128,1021 @@
        %7D%0A    %7D%0A%0A
+    /**%0A     * Close all closeables in closeables. All exceptions and nulls will be ignored.%0A     *%0A     * @param closeables to be closed.%0A     */%0A    public static void quietCloseAll(final List%3C? extends AutoCloseable%3E closeables)%0A    %7B%0A        if (closeables == null)%0A        %7B%0A            return;%0A        %7D%0A%0A        for (int i = 0, size = closeables.size(); i %3C size; i++)%0A        %7B%0A            final AutoCloseable closeable = closeables.get(i);%0A            if (closeable != null)%0A            %7B%0A                try%0A                %7B%0A                    closeable.close();%0A                %7D%0A                catch (final Exception ignore)%0A                %7B%0A                %7D%0A            %7D%0A        %7D%0A    %7D%0A%0A    /**%0A     * Close all closeables in closeables. All exceptions and nulls will be ignored.%0A     *%0A     * @param closeables to be closed.%0A     */%0A    public static void quietCloseAll(final AutoCloseable... closeables)%0A    %7B%0A        quietCloseAll(Arrays.asList(closeables));%0A    %7D%0A%0A
     /**%0A     * C
@@ -2211,24 +2211,24 @@
 exceptions.%0A
-
      * This 
@@ -3150,16 +3150,90 @@
    for (
+int i = 0, size = closeables.size(); i %3C size; i++)%0A        %7B%0A            
 final Au
@@ -3254,17 +3254,17 @@
 oseable 
-:
+=
  closeab
@@ -3266,27 +3266,24 @@
 oseables
-)%0A        %7B
+.get(i);
 %0A       

Add quietCloseAll and avoid allocation of iterators.