* ensure that FLock is released in case of an exception

git-svn-id: trunk@37385 -
This commit is contained in:
svenbarth 2017-10-02 18:51:52 +00:00
parent 1bf758c997
commit 794eb7c122

View File

@ -619,10 +619,13 @@ begin
Exit(Nil); Exit(Nil);
{$ifdef FPC_HAS_FEATURE_THREADING} {$ifdef FPC_HAS_FEATURE_THREADING}
EnterCriticalsection(FLock); EnterCriticalsection(FLock);
try
{$endif} {$endif}
Result := Copy(FTypesList, 0, FTypeCount); Result := Copy(FTypesList, 0, FTypeCount);
{$ifdef FPC_HAS_FEATURE_THREADING} {$ifdef FPC_HAS_FEATURE_THREADING}
LeaveCriticalsection(FLock); finally
LeaveCriticalsection(FLock);
end;
{$endif} {$endif}
end; end;
@ -634,38 +637,41 @@ begin
Exit(Nil); Exit(Nil);
{$ifdef FPC_HAS_FEATURE_THREADING} {$ifdef FPC_HAS_FEATURE_THREADING}
EnterCriticalsection(FLock); EnterCriticalsection(FLock);
try
{$endif} {$endif}
Result := Nil; Result := Nil;
for i := 0 to FTypeCount - 1 do for i := 0 to FTypeCount - 1 do
begin begin
if FTypesList[i].FTypeInfo = ATypeInfo then if FTypesList[i].FTypeInfo = ATypeInfo then
begin begin
Result := FTypesList[i]; Result := FTypesList[i];
Break; Break;
end; end;
end; end;
if not Assigned(Result) then if not Assigned(Result) then
begin begin
if FTypeCount = Length(FTypesList) then if FTypeCount = Length(FTypesList) then
begin begin
SetLength(FTypesList, FTypeCount * 2); SetLength(FTypesList, FTypeCount * 2);
end; end;
case ATypeInfo^.Kind of case ATypeInfo^.Kind of
tkClass : Result := TRttiInstanceType.Create(ATypeInfo); tkClass : Result := TRttiInstanceType.Create(ATypeInfo);
tkSString, tkSString,
tkLString, tkLString,
tkAString, tkAString,
tkUString, tkUString,
tkWString : Result := TRttiStringType.Create(ATypeInfo); tkWString : Result := TRttiStringType.Create(ATypeInfo);
tkFloat : Result := TRttiFloatType.Create(ATypeInfo); tkFloat : Result := TRttiFloatType.Create(ATypeInfo);
else else
Result := TRttiType.Create(ATypeInfo); Result := TRttiType.Create(ATypeInfo);
end;
FTypesList[FTypeCount] := Result;
Inc(FTypeCount);
end; end;
FTypesList[FTypeCount] := Result;
Inc(FTypeCount);
end;
{$ifdef FPC_HAS_FEATURE_THREADING} {$ifdef FPC_HAS_FEATURE_THREADING}
LeaveCriticalsection(FLock); finally
LeaveCriticalsection(FLock);
end;
{$endif} {$endif}
end; end;