* Create container with unique name, improve thread-safety

This commit is contained in:
Michaël Van Canneyt 2023-01-28 16:26:01 +01:00
parent cdc6ff0a30
commit fc6c3cf487

View File

@ -356,6 +356,7 @@ Type
TCustomJSONRPCHandlerManager = Class(TComponent) TCustomJSONRPCHandlerManager = Class(TComponent)
Private Private
FRegistering: Boolean; FRegistering: Boolean;
FHandlerCount : Int64;
Protected Protected
procedure Initialize; virtual; procedure Initialize; virtual;
procedure DoClear; virtual; procedure DoClear; virtual;
@ -1542,7 +1543,7 @@ begin
If Assigned(FDataModuleClass) then If Assigned(FDataModuleClass) then
begin begin
{$ifdef wmdebug}SendDebug(Format('Creating datamodule from class %d ',[Ord(Assigned(FDataModuleClass))]));{$endif} {$ifdef wmdebug}SendDebug(Format('Creating datamodule from class %d ',[Ord(Assigned(FDataModuleClass))]));{$endif}
DM:=FDataModuleClass.Create(AOwner); DM:=FDataModuleClass.Create(Nil);
{$ifdef wmdebug}SendDebug(Format('Created datamodule from class %s ',[DM.ClassName]));{$endif} {$ifdef wmdebug}SendDebug(Format('Created datamodule from class %s ',[DM.ClassName]));{$endif}
I:=0; I:=0;
While (Result=Nil) and (I<DM.ComponentCount) do While (Result=Nil) and (I<DM.ComponentCount) do
@ -1559,7 +1560,7 @@ begin
end; end;
end end
else else
DM:=TDataModule.CreateNew(AOwner,0); DM:=TDataModule.CreateNew(Nil,0);
AContainer:=DM; AContainer:=DM;
If (Result=Nil) then If (Result=Nil) then
begin begin
@ -1796,6 +1797,7 @@ Function TCustomJSONRPCHandlerManager.GetHandler(
): TCustomJSONRPCHandler; ): TCustomJSONRPCHandler;
Var Var
N : String;
O : TComponent; O : TComponent;
begin begin
@ -1803,7 +1805,13 @@ begin
O:=Self O:=Self
else else
O:=AOwner; O:=AOwner;
Result:=ADef.CreateInstance(O,AContainer); Result:=ADef.CreateInstance(Nil,AContainer);
N:=aContainer.Name;
if N='' then
N:=aContainer.ClassName;
N:=N+IntToStr(InterlockedIncrement64(FHandlerCount));
aContainer.Name:=N;
O.InsertComponent(aContainer);
end; end;
Function TCustomJSONRPCHandlerManager.GetHandler(Const AClassName, Function TCustomJSONRPCHandlerManager.GetHandler(Const AClassName,