From 8c601c01839333641f0a1bbb4dd1600586227633 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Fri, 14 Feb 2025 21:07:29 +0300 Subject: [PATCH] =?UTF-8?q?=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=85=D0=BE=D1=81=D1=82=D0=BE=D0=B2=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=B8=D0=B4=D0=B5=D0=BD=D1=82=D0=B8=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D1=80=D0=B0=20=D0=B2=D0=BB=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BE=D0=B7?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=B7=D0=B0=D1=88=D0=B0=D1=80?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BE=D0=B1=D1=8A=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Example.Frontend/Program.cs | 2 +- mROA/Abstract/IOwnershipRepository.cs | 1 + .../Backend/JsonSerialisationModule.cs | 13 +++++++------ .../Backend/MultiClientOwnershipRepository.cs | 13 +++++++++---- .../Frontend/StaticOwnershipRepository.cs | 5 +++++ mROA/Implementation/RemoteContextRepository.cs | 9 ++++----- mROA/Implementation/SharedObject.cs | 2 ++ 7 files changed, 29 insertions(+), 16 deletions(-) diff --git a/Example.Frontend/Program.cs b/Example.Frontend/Program.cs index 670e075..74ce553 100644 --- a/Example.Frontend/Program.cs +++ b/Example.Frontend/Program.cs @@ -37,7 +37,7 @@ var printer = factory.Create("Test"); var name = printer.Value.GetName(); Console.WriteLine("Printer name : {0}", name); -factory.Register(new SharedObject(new ClientBasedPrinter())); +// factory.Register(new SharedObject(new ClientBasedPrinter())); var page = await printer.Value.Print("Test Page", new CancellationToken()); var data = page.Value.GetData(); diff --git a/mROA/Abstract/IOwnershipRepository.cs b/mROA/Abstract/IOwnershipRepository.cs index 81735af..deccfe9 100644 --- a/mROA/Abstract/IOwnershipRepository.cs +++ b/mROA/Abstract/IOwnershipRepository.cs @@ -3,4 +3,5 @@ public interface IOwnershipRepository { int GetOwnershipId(); + int GetHostOwnershipId(); } \ No newline at end of file diff --git a/mROA/Implementation/Backend/JsonSerialisationModule.cs b/mROA/Implementation/Backend/JsonSerialisationModule.cs index 511f42b..f945b95 100644 --- a/mROA/Implementation/Backend/JsonSerialisationModule.cs +++ b/mROA/Implementation/Backend/JsonSerialisationModule.cs @@ -1,6 +1,4 @@ -using System.Net.Sockets; -using System.Text; -using System.Text.Json; +using System.Text.Json; using mROA.Abstract; namespace mROA.Implementation.Backend; @@ -13,11 +11,13 @@ public class JsonSerialisationModule : ISerialisationModule public void HandleIncomingRequest(int clientId, byte[] message) { + var ownership = TransmissionConfig.OwnershipRepository as MultiClientOwnershipRepository ?? throw new Exception("Set ownership repository type is incorrect"); + ownership.RegisterOwnership(clientId); NetworkMessage input = JsonSerializer.Deserialize(message)!; - + if (input.SchemaId == MessageType.CallRequest) { - var command = JsonSerializer.Deserialize(input.Data); + var command = JsonSerializer.Deserialize(input.Data)!; if (command.Parameter is not null) { var parameter = _methodRepository!.GetMethod(command.CommandId).GetParameters().First().ParameterType; @@ -37,6 +37,7 @@ public class JsonSerialisationModule : ISerialisationModule Data = JsonSerializer.SerializeToUtf8Bytes(response, response.GetType()) }, clientId); } + ownership.FreeOwnership(); } public void PostResponse(NetworkMessage message, int clientId) @@ -46,7 +47,7 @@ public class JsonSerialisationModule : ISerialisationModule public void SendWelcomeMessage(int clientId) { - _dataSource.SendTo(clientId, JsonSerializer.SerializeToUtf8Bytes(new NetworkMessage { Data = JsonSerializer.SerializeToUtf8Bytes(new IdAssingnment { Id = clientId }), SchemaId = MessageType.IdAssigning})); + _dataSource!.SendTo(clientId, JsonSerializer.SerializeToUtf8Bytes(new NetworkMessage { Data = JsonSerializer.SerializeToUtf8Bytes(new IdAssingnment { Id = clientId }), SchemaId = MessageType.IdAssigning})); } public void Inject(T dependency) diff --git a/mROA/Implementation/Backend/MultiClientOwnershipRepository.cs b/mROA/Implementation/Backend/MultiClientOwnershipRepository.cs index 170cc3c..93f8aa8 100644 --- a/mROA/Implementation/Backend/MultiClientOwnershipRepository.cs +++ b/mROA/Implementation/Backend/MultiClientOwnershipRepository.cs @@ -11,13 +11,18 @@ public class MultiClientOwnershipRepository : IOwnershipRepository return _ownerships.GetValueOrDefault(Environment.CurrentManagedThreadId, 0); } - public void RegisterOwnership(int ownershipId, int threadId) + public int GetHostOwnershipId() { - _ownerships.TryAdd(ownershipId, threadId); + return 0; } - public void FreeOwnership(int ownershipId) + public void RegisterOwnership(int ownershipId) { - _ownerships.Remove(ownershipId); + _ownerships.TryAdd(Environment.CurrentManagedThreadId, ownershipId); + } + + public void FreeOwnership() + { + _ownerships.Remove(Environment.CurrentManagedThreadId); } } \ No newline at end of file diff --git a/mROA/Implementation/Frontend/StaticOwnershipRepository.cs b/mROA/Implementation/Frontend/StaticOwnershipRepository.cs index 2963087..bbc0d9b 100644 --- a/mROA/Implementation/Frontend/StaticOwnershipRepository.cs +++ b/mROA/Implementation/Frontend/StaticOwnershipRepository.cs @@ -8,4 +8,9 @@ public class StaticOwnershipRepository(int id) : IOwnershipRepository { return id; } + + public int GetHostOwnershipId() + { + return id; + } } \ No newline at end of file diff --git a/mROA/Implementation/RemoteContextRepository.cs b/mROA/Implementation/RemoteContextRepository.cs index 670a565..8c30743 100644 --- a/mROA/Implementation/RemoteContextRepository.cs +++ b/mROA/Implementation/RemoteContextRepository.cs @@ -6,8 +6,7 @@ namespace mROA.Implementation; public class RemoteContextRepository : IContextRepository { - private ISerialisationModuleProducer _serialisationModule; - private ISerialisationModuleProducer _producer; + private ISerialisationModuleProducer _serialisationProducer; public static FrozenDictionary RemoteTypes; public int ResisterObject(object o) { @@ -28,7 +27,7 @@ public class RemoteContextRepository : IContextRepository { if (RemoteTypes.TryGetValue(typeof(T), out var remoteType)) { - var remote = (T)Activator.CreateInstance(remoteType, id, _serialisationModule.Produce(TransmissionConfig.OwnershipRepository.GetOwnershipId()))!; + var remote = (T)Activator.CreateInstance(remoteType, id, _serialisationProducer.Produce(TransmissionConfig.OwnershipRepository!.GetOwnershipId()))!; return remote; } throw new NotSupportedException(); @@ -36,7 +35,7 @@ public class RemoteContextRepository : IContextRepository public object GetSingleObject(Type type) { - return Activator.CreateInstance(RemoteTypes[type], -1, _serialisationModule.Produce(TransmissionConfig.OwnershipRepository.GetOwnershipId()))!; + return Activator.CreateInstance(RemoteTypes[type], -1, _serialisationProducer.Produce(TransmissionConfig.OwnershipRepository.GetOwnershipId()))!; } public int GetObjectIndex(object o) @@ -51,6 +50,6 @@ public class RemoteContextRepository : IContextRepository public void Inject(T dependency) { if (dependency is ISerialisationModuleProducer serialisationModule) - _serialisationModule = serialisationModule; + _serialisationProducer = serialisationModule; } } \ No newline at end of file diff --git a/mROA/Implementation/SharedObject.cs b/mROA/Implementation/SharedObject.cs index d7de458..0a4d18b 100644 --- a/mROA/Implementation/SharedObject.cs +++ b/mROA/Implementation/SharedObject.cs @@ -68,6 +68,8 @@ public class SharedObject where T : notnull _ownerId = ro.OwnerId; _contextId = ro.Id; } + + _ownerId = TransmissionConfig.OwnershipRepository!.GetHostOwnershipId(); } public static implicit operator T(SharedObject value) => value.Value;