diff --git a/rtl/inc/heap.inc b/rtl/inc/heap.inc index febfe2356c..138eac9522 100644 --- a/rtl/inc/heap.inc +++ b/rtl/inc/heap.inc @@ -455,9 +455,6 @@ type {$ifdef FPC_HAS_FEATURE_THREADING} lock: TRTLCriticalSection; lockUse: int32; - - { Data from dead threads (“orphaned”), protected by gs.lock. } - varOS: pVarOSChunk; {$ifndef HAS_SYSOSFREE} freeOS: FreeOSChunkList; {$endif not HAS_SYSOSFREE} @@ -1464,7 +1461,7 @@ type procedure HeapInc.ThreadState.Orphan; var arena: pFixedArena; - vOs, nextVOs, lastVOs: pVarOSChunk; + vOs: pVarOSChunk; {$ifndef HAS_SYSOSFREE} lastFree, nextFree: pFreeOSChunk; {$endif not HAS_SYSOSFREE} @@ -1496,20 +1493,11 @@ type gs.freeOS.first := freeOS.first; end; {$endif not HAS_SYSOSFREE} - { Prepend varOS to gs.varOS. } vOs := varOS; - if Assigned(vOs) then + while Assigned(vOs) do begin - nextVOs := gs.varOS; - gs.varOS := vOs; - repeat - lastVOs := vOs; - ChangeThreadState(vOs, nil); - vOs := vOs^.next; - until not Assigned(vOs); - lastVOs^.next := nextVOs; - if Assigned(nextVOs) then - nextVOs^.prev := lastVOs; + ChangeThreadState(vOs, nil); + vOs := vOs^.next; end; if gs.lockUse > 0 then LeaveCriticalSection(gs.lock); @@ -1550,23 +1538,15 @@ type var prevSize, statv: SizeUint; h: uint32; - vOs, osPrev, osNext: pVarOSChunk; + vOs, osNext: pVarOSChunk; begin repeat prevSize := pVarHeader(p - VarHeaderSize)^.prevSize; dec(p, prevSize); until prevSize = 0; - { Move OS chunk from gs.varOS to varOS. } + { Add OS chunk to varOS. } vOs := p - (VarOSChunkDataOffset + VarHeaderSize); - osPrev := vOs^.prev; - osNext := vOs^.next; - if Assigned(osPrev) then - osPrev^.next := osNext - else - gs.varOS := osNext; - if Assigned(osNext) then - osNext^.prev := osPrev; vOs^.prev := nil; osNext := varOS; vOs^.next := osNext;