Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 15 additions & 15 deletions Joveler.Compression.XZ/XZLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -148,17 +148,17 @@ protected override void ResetFunctions()
#region Base - LzmaCode, LzmaEnd, LzmaGetProgress
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate LzmaRet lzma_code(
LzmaStream strm,
ref LzmaStream strm,
LzmaAction action);
internal lzma_code? LzmaCode;

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void lzma_end(LzmaStream strm);
internal delegate void lzma_end(ref LzmaStream strm);
internal lzma_end? LzmaEnd;

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void lzma_get_progress(
LzmaStream strm,
ref LzmaStream strm,
ref ulong progress_in,
ref ulong progress_out);
internal lzma_get_progress? LzmaGetProgress;
Expand All @@ -175,14 +175,14 @@ internal delegate void lzma_get_progress(

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate LzmaRet lzma_easy_encoder(
LzmaStream strm,
ref LzmaStream strm,
uint preset,
LzmaCheck check);
internal lzma_easy_encoder? LzmaEasyEncoder;

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate LzmaRet lzma_stream_encoder(
LzmaStream strm,
ref LzmaStream strm,
[MarshalAs(UnmanagedType.LPArray)] LzmaFilter[] filters,
LzmaCheck check);
internal lzma_stream_encoder? LzmaStreamEncoder;
Expand All @@ -193,7 +193,7 @@ internal delegate LzmaRet lzma_stream_encoder(

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate LzmaRet lzma_stream_encoder_mt(
LzmaStream strm,
ref LzmaStream strm,
LzmaMt options);
internal lzma_stream_encoder_mt? LzmaStreamEncoderMt;

Expand Down Expand Up @@ -252,7 +252,7 @@ internal delegate LzmaRet lzma_stream_encoder_mt(
/// </returns>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate LzmaRet lzma_microlzma_encoder(
LzmaStream strm,
ref LzmaStream strm,
lzma_options_lzma options);
internal lzma_microlzma_encoder LzmaMicroLzmaEncoder;
#endif
Expand All @@ -279,7 +279,7 @@ internal delegate LzmaRet lzma_microlzma_encoder(
/// </returns>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate LzmaRet lzma_stream_decoder(
LzmaStream strm,
ref LzmaStream strm,
ulong memlimit,
LzmaDecodingFlag flags);
internal lzma_stream_decoder? LzmaStreamDecoder;
Expand Down Expand Up @@ -312,7 +312,7 @@ internal delegate LzmaRet lzma_stream_decoder(
/// </returns>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate LzmaRet lzma_stream_decoder_mt(
LzmaStream strm,
ref LzmaStream strm,
LzmaMt options);
internal lzma_stream_decoder_mt? LzmaStreamDecoderMt;

Expand Down Expand Up @@ -355,7 +355,7 @@ internal delegate LzmaRet lzma_stream_decoder_mt(
/// </returns>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate LzmaRet lzma_auto_decoder(
LzmaStream strm,
ref LzmaStream strm,
ulong memlimit,
LzmaDecodingFlag flags);
internal lzma_auto_decoder? LzmaAutoDecoder;
Expand All @@ -382,7 +382,7 @@ internal delegate LzmaRet lzma_auto_decoder(
/// </returns>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate LzmaRet lzma_alone_decoder(
LzmaStream strm,
ref LzmaStream strm,
ulong memlimit);
internal lzma_alone_decoder? LzmaAloneDecoder;

Expand Down Expand Up @@ -445,7 +445,7 @@ internal delegate LzmaRet lzma_alone_decoder(
/// </returns>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate LzmaRet lzma_lzip_decoder(
LzmaStream strm,
ref LzmaStream strm,
ulong memlimit,
LzmaDecodingFlag flags);
internal lzma_lzip_decoder? LzmaLZipDecoder;
Expand Down Expand Up @@ -519,7 +519,7 @@ internal delegate ulong lzma_mt_block_size(
/// If this function isn't supported by *strm or some other error occurs, zero is returned.
/// </returns>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate ulong lzma_memusage(LzmaStream strm);
internal delegate ulong lzma_memusage(ref LzmaStream strm);
internal lzma_memusage? LzmaMemusage;

/// <summary>
Expand All @@ -531,7 +531,7 @@ internal delegate ulong lzma_mt_block_size(
/// (always non-zero). On error, zero is returned.
/// </returns>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate ulong lzma_memlimit_get(LzmaStream strm);
internal delegate ulong lzma_memlimit_get(ref LzmaStream strm);
internal lzma_memlimit_get? LzmaMemlimitGet;

/// <summary>
Expand All @@ -557,7 +557,7 @@ internal delegate ulong lzma_mt_block_size(
/// - LZMA_PROG_ERROR: Invalid arguments, e.g. *strm doesn't support memory usage limit.
/// </returns>
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate ulong lzma_memlimit_set(LzmaStream strm);
internal delegate ulong lzma_memlimit_set(ref LzmaStream strm);
internal lzma_memlimit_set? LzmaMemlimitSet;
#endif
#endregion
Expand Down
43 changes: 21 additions & 22 deletions Joveler.Compression.XZ/XZStreams.cs
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,7 @@ protected enum CoderFormat
private readonly bool _leaveOpen;
private bool _disposed = false;

private LzmaStream? _lzmaStream;
private LzmaStream _lzmaStream;
private GCHandle _lzmaStreamPin;

private readonly int _bufferSize = DefaultBufferSize;
Expand Down Expand Up @@ -573,7 +573,7 @@ protected unsafe XZStreamBase(Stream baseStream, XZCompressOptions compOpts)
CheckPreset(preset);

// Initialize the encoder
LzmaRet ret = XZInit.Lib.LzmaEasyEncoder!(_lzmaStream, preset, compOpts.Check);
LzmaRet ret = XZInit.Lib.LzmaEasyEncoder!(ref _lzmaStream, preset, compOpts.Check);
XZException.CheckReturnValueNormal(ret);

// Set possible max memory usage.
Expand Down Expand Up @@ -618,7 +618,7 @@ protected unsafe XZStreamBase(Stream baseStream, XZCompressOptions compOpts, XZP
CheckPreset(mt.Preset);

// Initialize the encoder
LzmaRet ret = XZInit.Lib.LzmaStreamEncoderMt!(_lzmaStream, mt);
LzmaRet ret = XZInit.Lib.LzmaStreamEncoderMt!(ref _lzmaStream, mt);
XZException.CheckReturnValueNormal(ret);

// Set possible max memory usage.
Expand Down Expand Up @@ -665,16 +665,16 @@ protected unsafe XZStreamBase(Stream baseStream, XZDecompressOptions decompOpts,
switch (fileFormat)
{
case CoderFormat.XZ:
ret = XZInit.Lib.LzmaStreamDecoder!(_lzmaStream, decompOpts.MemLimit, decompOpts.DecodeFlags);
ret = XZInit.Lib.LzmaStreamDecoder!(ref _lzmaStream, decompOpts.MemLimit, decompOpts.DecodeFlags);
break;
case CoderFormat.Auto:
ret = XZInit.Lib.LzmaAutoDecoder!(_lzmaStream, decompOpts.MemLimit, decompOpts.DecodeFlags);
ret = XZInit.Lib.LzmaAutoDecoder!(ref _lzmaStream, decompOpts.MemLimit, decompOpts.DecodeFlags);
break;
case CoderFormat.LegacyLzma:
ret = XZInit.Lib.LzmaAloneDecoder!(_lzmaStream, decompOpts.MemLimit);
ret = XZInit.Lib.LzmaAloneDecoder!(ref _lzmaStream, decompOpts.MemLimit);
break;
case CoderFormat.LZip:
ret = XZInit.Lib.LzmaLZipDecoder!(_lzmaStream, decompOpts.MemLimit, decompOpts.DecodeFlags);
ret = XZInit.Lib.LzmaLZipDecoder!(ref _lzmaStream, decompOpts.MemLimit, decompOpts.DecodeFlags);
break;
}
XZException.CheckReturnValueNormal(ret);
Expand Down Expand Up @@ -718,7 +718,7 @@ protected unsafe XZStreamBase(Stream baseStream, XZDecompressOptions decompOpts,
LzmaMt mt = decompOpts.ToLzmaMt(threadOpts);

// Initialize the decoder
LzmaRet ret = XZInit.Lib.LzmaStreamDecoderMt!(_lzmaStream, mt);
LzmaRet ret = XZInit.Lib.LzmaStreamDecoderMt!(ref _lzmaStream, mt);
XZException.CheckReturnValueNormal(ret);
}
#endregion
Expand All @@ -733,7 +733,7 @@ protected override void Dispose(bool disposing)
{
if (disposing && !_disposed)
{
if (_lzmaStream != null)
if (_lzmaStreamPin.IsAllocated)
{
if (_isAborted == false)
{
Expand All @@ -751,7 +751,6 @@ protected override void Dispose(bool disposing)
}

_lzmaStreamPin.Free();
_lzmaStream = null;
}

if (BaseStream != null)
Expand All @@ -774,9 +773,9 @@ private void FreeLzmaStream()

// lzma_end frees memory allocated for coder data structures.
// It must be called to avoid memory leak.
if (_lzmaStream != null)
if (_lzmaStream is LzmaStream stream)
{
XZInit.Lib.LzmaEnd!(_lzmaStream);
XZInit.Lib.LzmaEnd!(ref stream);
}
}

Expand Down Expand Up @@ -825,7 +824,7 @@ public unsafe int Read(Span<byte> span)
{ // For Decompress
if (XZInit.Lib == null)
throw new ObjectDisposedException(nameof(XZInit));
if (_lzmaStream == null)
if (!_lzmaStreamPin.IsAllocated)
throw new ObjectDisposedException(nameof(XZStreamBase));
if (BaseStream == null)
throw new ObjectDisposedException(nameof(XZStreamBase));
Expand Down Expand Up @@ -864,7 +863,7 @@ public unsafe int Read(Span<byte> span)
ulong bakAvailIn = _lzmaStream.AvailIn;
ulong bakAvailOut = _lzmaStream.AvailOut;

LzmaRet ret = XZInit.Lib.LzmaCode!(_lzmaStream, action);
LzmaRet ret = XZInit.Lib.LzmaCode!(ref _lzmaStream, action);

_workBufPos += (int)(bakAvailIn - _lzmaStream.AvailIn);
readSize += (int)(bakAvailOut - _lzmaStream.AvailOut);
Expand Down Expand Up @@ -918,7 +917,7 @@ public unsafe void Write(ReadOnlySpan<byte> span)
{ // For Compress
if (XZInit.Lib == null)
throw new ObjectDisposedException(nameof(XZInit));
if (_lzmaStream == null)
if (!_lzmaStreamPin.IsAllocated)
throw new ObjectDisposedException(nameof(XZStreamBase));
if (BaseStream == null)
throw new ObjectDisposedException(nameof(XZStreamBase));
Expand All @@ -939,7 +938,7 @@ public unsafe void Write(ReadOnlySpan<byte> span)
// Return condition : _lzmaStream.AvailIn == 0
while (_lzmaStream.AvailIn != 0)
{
LzmaRet ret = XZInit.Lib.LzmaCode!(_lzmaStream, LzmaAction.Run);
LzmaRet ret = XZInit.Lib.LzmaCode!(ref _lzmaStream, LzmaAction.Run);
_workBufPos = (int)((ulong)_workBuf.Length - _lzmaStream.AvailOut);

// If the output buffer is full, write the data from the output bufffer to the output file.
Expand All @@ -965,7 +964,7 @@ private unsafe void FinishWrite()
{
if (XZInit.Lib == null)
throw new ObjectDisposedException(nameof(XZInit));
if (_lzmaStream == null)
if (!_lzmaStreamPin.IsAllocated)
throw new ObjectDisposedException(nameof(XZStreamBase));
if (BaseStream == null)
throw new ObjectDisposedException(nameof(XZStreamBase));
Expand All @@ -983,7 +982,7 @@ private unsafe void FinishWrite()
while (ret != LzmaRet.StreamEnd)
{
ulong bakAvailOut = _lzmaStream.AvailOut;
ret = XZInit.Lib.LzmaCode!(_lzmaStream, LzmaAction.Finish);
ret = XZInit.Lib.LzmaCode!(ref _lzmaStream, LzmaAction.Finish);
_workBufPos = (int)(bakAvailOut - _lzmaStream.AvailOut);

// If the compression finished successfully,
Expand Down Expand Up @@ -1022,7 +1021,7 @@ public override unsafe void Flush()

if (XZInit.Lib == null)
throw new ObjectDisposedException(nameof(XZInit));
if (_lzmaStream == null)
if (!_lzmaStreamPin.IsAllocated)
throw new ObjectDisposedException(nameof(XZStreamBase));

fixed (byte* writePtr = _workBuf)
Expand All @@ -1039,7 +1038,7 @@ public override unsafe void Flush()
if (_lzmaStream.AvailOut != 0)
{
ulong bakAvailOut = _lzmaStream.AvailOut;
ret = XZInit.Lib.LzmaCode!(_lzmaStream, LzmaAction.FullFlush);
ret = XZInit.Lib.LzmaCode!(ref _lzmaStream, LzmaAction.FullFlush);
writeSize += (int)(bakAvailOut - _lzmaStream.AvailOut);
}
_workBufPos += writeSize;
Expand Down Expand Up @@ -1132,12 +1131,12 @@ public void GetProgress(out ulong progressIn, out ulong progressOut)
{
if (XZInit.Lib == null)
throw new ObjectDisposedException(nameof(XZInit));
if (_lzmaStream == null)
if (!_lzmaStreamPin.IsAllocated)
throw new ObjectDisposedException(nameof(XZStreamBase));

progressIn = 0;
progressOut = 0;
XZInit.Lib.LzmaGetProgress!(_lzmaStream, ref progressIn, ref progressOut);
XZInit.Lib.LzmaGetProgress!(ref _lzmaStream, ref progressIn, ref progressOut);
}
#endregion

Expand Down
4 changes: 3 additions & 1 deletion Joveler.Compression.XZ/XZStructs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,10 @@ namespace Joveler.Compression.XZ
/// values from lzma_get_progress().
/// </remarks>
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
internal unsafe class LzmaStream
internal unsafe struct LzmaStream
{
public LzmaStream() { }

/// <summary>
/// Pointer to the next input byte.
/// </summary>
Expand Down