Pārlūkot izejas kodu

LZMACompressor: Release locks with InterlockedExchange.

Not sure if ordinary stores can be reordered under Windows on Arm's x86 emulator.
InterlockedExchange provides a full barrier.

Jordan Russell 10 mēneši atpakaļ
vecāks
revīzija
0e3bd960f8

+ 3 - 3
Projects/Src/Compression.LZMACompressor.pas

@@ -605,7 +605,7 @@ begin
     Exit;
   end;
   Result := FillBuffer(False, @Data, Size, ProcessedSize);
-  FReadLock := 0;
+  InterlockedExchange(FReadLock, 0);
 end;
 
 function TLZMAWorkerThread.Write(const Data; Size: Cardinal;
@@ -618,7 +618,7 @@ begin
     Exit;
   end;
   Result := FillBuffer(True, @Data, Size, ProcessedSize);
-  FWriteLock := 0;
+  InterlockedExchange(FWriteLock, 0);
 end;
 
 function TLZMAWorkerThread.ProgressMade(const TotalBytesProcessed: Integer64): HRESULT;
@@ -645,7 +645,7 @@ begin
     end;
     Result := WakeMainAndWaitUntil(FEvents.WorkerHasProgressEvent,
       FEvents.EndWaitOnProgressEvent);
-    FProgressLock := 0;
+    InterlockedExchange(FProgressLock, 0);
   end
   else
     Result := S_OK;

+ 3 - 3
Projects/Src/Compression.LZMACompressor/islzma/islzma_exe.c

@@ -217,7 +217,7 @@ static HRESULT Read(void *Data, size_t Size, size_t *ProcessedSize)
 		return E_FAIL;
 	}
 	Result = FillBuffer(FALSE, Data, Size, ProcessedSize);
-	FReadLock = 0;
+	InterlockedExchange(&FReadLock, 0);
 
 	return Result;
 }
@@ -232,7 +232,7 @@ static HRESULT Write(const void *Data, size_t Size, size_t *ProcessedSize)
 		return E_FAIL;
 	}
 	Result = FillBuffer(TRUE, (void *)Data, Size, ProcessedSize);
-	FWriteLock = 0;
+	InterlockedExchange(&FWriteLock, 0);
 
 	return Result;
 }
@@ -262,7 +262,7 @@ static HRESULT ProgressMade(const UInt64 TotalBytesProcessed)
 		Result = WakeMainAndWaitUntil(
 			THandle32ToHandle(FEvents->WorkerHasProgressEvent),
 			THandle32ToHandle(FEvents->EndWaitOnProgressEvent));
-		FProgressLock = 0;
+		InterlockedExchange(&FProgressLock, 0);
 	} else {
 		Result = S_OK;
 	}