pooled window for rar unpackv1

This commit is contained in:
majorro
2025-01-12 16:01:59 +03:00
parent f8e033e560
commit 44998a2a2b
4 changed files with 51 additions and 10 deletions

View File

@@ -14,8 +14,8 @@ namespace SharpCompress.Archives.Rar;
public class RarArchive : AbstractArchive<RarArchiveEntry, RarVolume>
{
internal Lazy<IRarUnpack> UnpackV2017 { get; } =
new(() => new Compressors.Rar.UnpackV2017.Unpack());
private bool _disposed;
internal Lazy<IRarUnpack> UnpackV2017 { get; } = new(() => new Compressors.Rar.UnpackV2017.Unpack());
internal Lazy<IRarUnpack> UnpackV1 { get; } = new(() => new Compressors.Rar.UnpackV1.Unpack());
/// <summary>
@@ -25,6 +25,20 @@ public class RarArchive : AbstractArchive<RarArchiveEntry, RarVolume>
private RarArchive(SourceStream sourceStream)
: base(ArchiveType.Rar, sourceStream) { }
public override void Dispose()
{
if (!_disposed)
{
if (UnpackV1.IsValueCreated && UnpackV1.Value is IDisposable unpackV1)
{
unpackV1.Dispose();
}
_disposed = true;
base.Dispose();
}
}
protected override IEnumerable<RarArchiveEntry> LoadEntries(IEnumerable<RarVolume> volumes) =>
RarArchiveEntryFactory.GetEntries(this, volumes, ReaderOptions);

View File

@@ -1,6 +1,7 @@
#nullable disable
using System;
using System.Buffers;
using System.Collections.Generic;
using System.IO;
using SharpCompress.Common;
@@ -12,14 +13,27 @@ using SharpCompress.Compressors.Rar.VM;
namespace SharpCompress.Compressors.Rar.UnpackV1;
internal sealed partial class Unpack : BitInput, IRarUnpack
internal sealed partial class Unpack : BitInput, IRarUnpack, IDisposable
{
private readonly BitInput Inp;
private bool disposed;
public Unpack() =>
// to ease in porting Unpack50.cs
Inp = this;
public void Dispose()
{
if (!disposed)
{
if (!externalWindow)
{
ArrayPool<byte>.Shared.Return(window);
}
disposed = true;
}
}
public bool FileExtracted { get; private set; }
public long DestSize
@@ -74,7 +88,7 @@ internal sealed partial class Unpack : BitInput, IRarUnpack
private BlockTypes unpBlockType;
//private bool externalWindow;
private bool externalWindow;
private long writtenFileSize;
@@ -113,13 +127,12 @@ internal sealed partial class Unpack : BitInput, IRarUnpack
{
if (window is null)
{
this.window = new byte[PackDef.MAXWINSIZE];
this.window = ArrayPool<byte>.Shared.Rent(PackDef.MAXWINSIZE);
}
else
{
this.window = window;
//externalWindow = true;
externalWindow = true;
}
inAddr = 0;
UnpInitData(false);

View File

@@ -44,7 +44,7 @@ public abstract class AbstractReader<TEntry, TVolume> : IReader, IReaderExtracti
#region IDisposable Members
public void Dispose()
public virtual void Dispose()
{
_entriesForCurrentReadStream?.Dispose();
Volume?.Dispose();

View File

@@ -13,14 +13,28 @@ namespace SharpCompress.Readers.Rar;
/// </summary>
public abstract class RarReader : AbstractReader<RarReaderEntry, RarVolume>
{
private bool _disposed;
private RarVolume? volume;
private Lazy<IRarUnpack> UnpackV2017 { get; } =
new(() => new Compressors.Rar.UnpackV2017.Unpack());
private Lazy<IRarUnpack> UnpackV2017 { get; } = new(() => new Compressors.Rar.UnpackV2017.Unpack());
private Lazy<IRarUnpack> UnpackV1 { get; } = new(() => new Compressors.Rar.UnpackV1.Unpack());
internal RarReader(ReaderOptions options)
: base(options, ArchiveType.Rar) { }
public override void Dispose()
{
if (!_disposed)
{
if (UnpackV1.IsValueCreated && UnpackV1.Value is IDisposable unpackV1)
{
unpackV1.Dispose();
}
_disposed = true;
base.Dispose();
}
}
protected abstract void ValidateArchive(RarVolume archive);
public override RarVolume? Volume => volume;