summaryrefslogtreecommitdiff
path: root/rtl/objpas/classes/reader.inc
diff options
context:
space:
mode:
Diffstat (limited to 'rtl/objpas/classes/reader.inc')
-rw-r--r--rtl/objpas/classes/reader.inc35
1 files changed, 30 insertions, 5 deletions
diff --git a/rtl/objpas/classes/reader.inc b/rtl/objpas/classes/reader.inc
index cc99a8f299..1a37021a64 100644
--- a/rtl/objpas/classes/reader.inc
+++ b/rtl/objpas/classes/reader.inc
@@ -609,14 +609,34 @@ begin
If (Stream=Nil) then
Raise EReadError.Create(SEmptyStreamIllegalReader);
FDriver := CreateDriver(Stream, BufSize);
+{$ifdef FPC_HAS_FEATURE_THREADING}
+ InitCriticalSection(FLock);
+{$ENDIF}
end;
destructor TReader.Destroy;
begin
+{$ifdef FPC_HAS_FEATURE_THREADING}
+ DoneCriticalSection(FLock);
+{$ENDIF}
FDriver.Free;
inherited Destroy;
end;
+procedure TReader.Lock;
+begin
+{$ifdef FPC_HAS_FEATURE_THREADING}
+ EnterCriticalSection(FLock);
+{$ENDIF}
+end;
+
+procedure TReader.Unlock;
+begin
+{$ifdef FPC_HAS_FEATURE_THREADING}
+ LeaveCriticalSection(FLock);
+{$ENDIF}
+end;
+
procedure TReader.FlushBuffer;
begin
Driver.FlushBuffer;
@@ -1476,12 +1496,17 @@ begin
{ Don't use Result.Name directly, as this would influence
FindGlobalComponent in successive loop runs }
ResultName := CompName;
- while Assigned(FindGlobalComponent(ResultName)) do
- begin
- Inc(i);
- ResultName := CompName + '_' + IntToStr(i);
+ Lock;
+ try
+ while Assigned(FindGlobalComponent(ResultName)) do
+ begin
+ Inc(i);
+ ResultName := CompName + '_' + IntToStr(i);
+ end;
+ Result.Name := ResultName;
+ finally
+ Unlock;
end;
- Result.Name := ResultName;
end;
end;