docs: public void close(final LogNode log) {
          if (!closed.getAndSet(true)) {
              if (inflaterRecycler != null) {
                  inflaterRecycler.forceClose();
                  inflaterRecycler = null;
              }
              if (moduleRefToModuleReaderProxyRecyclerMap != null) {
                  try {
                      for (final Recycler<ModuleReaderProxy, IOException> recycler : //
                      moduleRefToModuleReaderProxyRecyclerMap.values()) {
                          recycler.forceClose();
                      }
                  } catch (final InterruptedException e) {
                      interruptionChecker.interrupt();
                  }
                  moduleRefToModuleReaderProxyRecyclerMap.clear();
                  moduleRefToModuleReaderProxyRecyclerMap = null;
              }
              if (zipFileSliceToLogicalZipFileMap != null) {
                  zipFileSliceToLogicalZipFileMap.clear();
                  zipFileSliceToLogicalZipFileMap = null;
              }
              if (nestedPathToLogicalZipFileAndPackageRootMap != null) {
                  nestedPathToLogicalZipFileAndPackageRootMap.clear();
                  nestedPathToLogicalZipFileAndPackageRootMap = null;
              }
              for (LogicalZipFile logicalZipFile; (logicalZipFile = allocatedLogicalZipFiles.poll()) != null;) {
                  logicalZipFile.close();
              }
              if (canonicalFileToPhysicalZipFileMap != null) {
                  try {
                      for (final PhysicalZipFile physicalZipFile : canonicalFileToPhysicalZipFileMap.values()) {
                          physicalZipFile.close();
                      }
                  } catch (final InterruptedException e) {
                      interruptionChecker.interrupt();
                  }
                  canonicalFileToPhysicalZipFileMap.clear();
                  canonicalFileToPhysicalZipFileMap = null;
              }
              if (additionalAllocatedPhysicalZipFiles != null) {
                  for (PhysicalZipFile physicalZipFile; (physicalZipFile = additionalAllocatedPhysicalZipFiles
                          .poll()) != null;) {
                      physicalZipFile.close();
                  }
                  additionalAllocatedPhysicalZipFiles.clear();
                  additionalAllocatedPhysicalZipFiles = null;
              }
              if (fastZipEntryToZipFileSliceMap != null) {
                  fastZipEntryToZipFileSliceMap.clear();
                  fastZipEntryToZipFileSliceMap = null;
              }
              // Temp files have to be deleted last, after all PhysicalZipFiles are closed
              if (tempFiles != null) {
                  final LogNode rmLog = tempFiles.isEmpty() || log == null ? null
                          : log.log("Removing temporary files");
                  while (!tempFiles.isEmpty()) {
                      final File tempFile = tempFiles.removeLast();
                      try {
                          Files.delete(tempFile.toPath());
                      } catch (final IOException | SecurityException e) {
                          if (rmLog != null) {
                              rmLog.log("Removing temporary file failed: " + e);
                          }
                      }
                  }
                  tempFiles.clear();
                  tempFiles = null;
              }
          }
      }