mirror of
https://github.com/bdunderscore/modular-avatar.git
synced 2025-01-01 20:25:07 +08:00
fix: try to protect against segment double free a bit more (#766)
This commit is contained in:
parent
fe8eeb1124
commit
a801f0ee76
@ -7,7 +7,7 @@ using System.Collections.Generic;
|
|||||||
|
|
||||||
namespace nadena.dev.modular_avatar.core.armature_lock
|
namespace nadena.dev.modular_avatar.core.armature_lock
|
||||||
{
|
{
|
||||||
internal interface ISegment
|
internal interface ISegment : IDisposable
|
||||||
{
|
{
|
||||||
AllocationMap.DefragmentCallback Defragment { get; set; }
|
AllocationMap.DefragmentCallback Defragment { get; set; }
|
||||||
int Offset { get; }
|
int Offset { get; }
|
||||||
@ -25,16 +25,24 @@ namespace nadena.dev.modular_avatar.core.armature_lock
|
|||||||
public int _length;
|
public int _length;
|
||||||
public bool _inUse;
|
public bool _inUse;
|
||||||
|
|
||||||
public AllocationMap.DefragmentCallback Defragment { get; set; }
|
private Action<Segment> _onDispose;
|
||||||
|
public DefragmentCallback Defragment { get; set; }
|
||||||
public int Offset => _offset;
|
public int Offset => _offset;
|
||||||
public int Length => _length;
|
public int Length => _length;
|
||||||
|
|
||||||
internal Segment(int offset, int length, bool inUse)
|
internal Segment(Action<Segment> onDispose, int offset, int length, bool inUse)
|
||||||
{
|
{
|
||||||
|
_onDispose = onDispose;
|
||||||
_offset = offset;
|
_offset = offset;
|
||||||
_length = length;
|
_length = length;
|
||||||
_inUse = inUse;
|
_inUse = inUse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
_onDispose?.Invoke(this);
|
||||||
|
_onDispose = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -62,6 +70,7 @@ namespace nadena.dev.modular_avatar.core.armature_lock
|
|||||||
if (segment._length > requestedLength)
|
if (segment._length > requestedLength)
|
||||||
{
|
{
|
||||||
var remaining = new Segment(
|
var remaining = new Segment(
|
||||||
|
FreeSegment,
|
||||||
segment._offset + requestedLength,
|
segment._offset + requestedLength,
|
||||||
segment._length - requestedLength,
|
segment._length - requestedLength,
|
||||||
false
|
false
|
||||||
@ -77,6 +86,7 @@ namespace nadena.dev.modular_avatar.core.armature_lock
|
|||||||
|
|
||||||
// Add a new in-use segment at the end
|
// Add a new in-use segment at the end
|
||||||
var newSegment = new Segment(
|
var newSegment = new Segment(
|
||||||
|
FreeSegment,
|
||||||
segments.Count == 0 ? 0 : segments[segments.Count - 1]._offset + segments[segments.Count - 1]._length,
|
segments.Count == 0 ? 0 : segments[segments.Count - 1]._offset + segments[segments.Count - 1]._length,
|
||||||
requestedLength,
|
requestedLength,
|
||||||
true
|
true
|
||||||
@ -113,7 +123,7 @@ namespace nadena.dev.modular_avatar.core.armature_lock
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Replace with a fresh segment object to avoid any issues with leaking old references to the segment
|
// Replace with a fresh segment object to avoid any issues with leaking old references to the segment
|
||||||
segments[index] = new Segment(s._offset, s._length, false);
|
segments[index] = new Segment(FreeSegment, s._offset, s._length, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -121,7 +131,7 @@ namespace nadena.dev.modular_avatar.core.armature_lock
|
|||||||
/// and then the callback associated with the segment (if any) is also invoked.
|
/// and then the callback associated with the segment (if any) is also invoked.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="callback"></param>
|
/// <param name="callback"></param>
|
||||||
public void Defragment(AllocationMap.DefragmentCallback callback)
|
public void Defragment(DefragmentCallback callback)
|
||||||
{
|
{
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
|
||||||
|
@ -227,7 +227,7 @@ namespace nadena.dev.modular_avatar.core.armature_lock
|
|||||||
|
|
||||||
_jobs[index] = null;
|
_jobs[index] = null;
|
||||||
|
|
||||||
_memoryManager.Free(job.Segment);
|
job.Segment.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EnsureJobFlagCapacity()
|
private void EnsureJobFlagCapacity()
|
||||||
|
Loading…
Reference in New Issue
Block a user