Type registration : complex objects serialization's helpers are now fully created at registration time.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@808 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa
2009-05-25 16:08:42 +00:00
parent 1ce28d56b6
commit 4d76fe4edd
4 changed files with 64 additions and 69 deletions

View File

@ -100,20 +100,10 @@ type
TBaseComplexTypeRegistryItem = class(TTypeRegistryItem)
private
FGetterLock : TCriticalSection;
FSerializer : TObjectSerializer;
FGetFunction : TGetSerializerFunction;
FFuncIsNotReady : Boolean;
private
function FirstGetter() : TObjectSerializer;
function StaticGetter() : TObjectSerializer;
protected
procedure Init(); override;
public
constructor Create(
AOwner : TTypeRegistry;
ANameSpace : string;
ADataType : PTypeInfo;
Const ADeclaredName : string = ''
);override;
destructor Destroy();override;
function GetSerializer() : TObjectSerializer;{$IFDEF USE_INLINE}inline;{$ENDIF}
end;
@ -1354,52 +1344,21 @@ end;
{ TBaseComplexTypeRegistryItem }
function TBaseComplexTypeRegistryItem.FirstGetter() : TObjectSerializer;
procedure TBaseComplexTypeRegistryItem.Init();
begin
FGetterLock.Acquire();
try
if ( FSerializer = nil ) then begin
FSerializer := TObjectSerializer.Create(TBaseComplexRemotableClass(GetTypeData(DataType)^.ClassType),Owner);
FFuncIsNotReady := True;
FGetFunction := {$IFDEF FPC}@{$ENDIF}StaticGetter;
FFuncIsNotReady := False;
end;
finally
FGetterLock.Release();
end;
Result := FSerializer;
end;
function TBaseComplexTypeRegistryItem.StaticGetter() : TObjectSerializer;
begin
Result := FSerializer;
end;
constructor TBaseComplexTypeRegistryItem.Create(
AOwner : TTypeRegistry;
ANameSpace : string;
ADataType : PTypeInfo;
const ADeclaredName : string
);
begin
inherited Create(AOwner, ANameSpace, ADataType, ADeclaredName);
FGetFunction := {$IFDEF FPC}@{$ENDIF}FirstGetter;
FGetterLock := TCriticalSection.Create();
inherited Init();
FSerializer := TObjectSerializer.Create(TBaseComplexRemotableClass(GetTypeData(DataType)^.ClassType),Owner);
end;
destructor TBaseComplexTypeRegistryItem.Destroy();
begin
FGetterLock.Free();
FSerializer.Free();
inherited Destroy();
end;
function TBaseComplexTypeRegistryItem.GetSerializer() : TObjectSerializer;
begin
while FFuncIsNotReady do begin
//busy wait
end;
Result := FGetFunction();
Result := FSerializer;
end;
end.