/// <summary> /// Initialize shared channel. /// </summary> public static void InitializeSharedChannel() { // Create or open the memory mapped files. // globalMemoryRegionView = SharedMemoryRegionView.CreateOrOpen <MlosProxyInternal.GlobalMemoryRegion>(GlobalMemoryMapName, SharedMemorySize); controlChannelMemoryMapView = SharedMemoryMapView.CreateOrOpen(ControlChannelMemoryMapName, SharedMemorySize); feedbackChannelMemoryMapView = SharedMemoryMapView.CreateOrOpen(FeedbackChannelMemoryMapName, SharedMemorySize); sharedConfigMemoryMapView = SharedMemoryRegionView.CreateOrOpen <MlosProxyInternal.SharedConfigMemoryRegion>(SharedConfigMemoryMapName, SharedMemorySize); // Create channel synchronization primitives. // controlChannelNamedEvent = NamedEvent.CreateOrOpen(ControlChannelSemaphoreName); feedbackChannelNamedEvent = NamedEvent.CreateOrOpen(FeedbackChannelSemaphoreName); // Setup feedback channel. // MlosProxyInternal.GlobalMemoryRegion globalMemoryRegion = globalMemoryRegionView.MemoryRegion(); // Enable channels. // globalMemoryRegion.ControlChannelSynchronization.TerminateChannel.Store(false); globalMemoryRegion.FeedbackChannelSynchronization.TerminateChannel.Store(false); var feedbackChannel = new SharedChannel <InterProcessSharedChannelPolicy, SharedChannelSpinPolicy>( buffer: feedbackChannelMemoryMapView.Buffer, size: (uint)feedbackChannelMemoryMapView.MemSize, sync: globalMemoryRegion.FeedbackChannelSynchronization); feedbackChannel.ChannelPolicy.NotificationEvent = feedbackChannelNamedEvent; // Set SharedConfig memory region. // SharedConfigManager.SetMemoryRegion(new MlosProxyInternal.SharedConfigMemoryRegion() { Buffer = sharedConfigMemoryMapView.MemoryRegion().Buffer }); // Setup MlosContext. // MlosContext.FeedbackChannel = feedbackChannel; MlosContext.SharedConfigManager = SharedConfigManager; // Initialize callbacks. // MlosProxyInternal.RegisterAssemblyRequestMessage.Callback = RegisterAssemblyCallback; MlosProxyInternal.RegisterMemoryRegionRequestMessage.Callback = RegisterMemoryRegionMessageCallback; MlosProxyInternal.RegisterSharedConfigMemoryRegionRequestMessage.Callback = RegisterSharedConfigMemoryRegionRequestMessageCallback; MlosProxy.TerminateReaderThreadRequestMessage.Callback = TerminateReaderThreadRequestMessageCallback; // Register Mlos.Core assembly. // RegisterAssembly(typeof(MlosContext).Assembly, dispatchTableBaseIndex: 0); // Register assemblies from the shared config. // Assembly Mlos.NetCore does not have a config, as it is always registered first. // for (uint index = 1; index < globalMemoryRegion.RegisteredSettingsAssemblyCount.Load(); index++) { RegisterSettingsAssembly(assemblyIndex: index); } }
public void Insert() { using var sharedMemoryRegionView = SharedMemoryRegionView.Create <MlosProxyInternal.SharedConfigMemoryRegion>(SharedMemoryMapName, SharedMemorySize); sharedMemoryRegionView.CleanupOnClose = true; MlosProxyInternal.SharedConfigMemoryRegion sharedConfigMemoryRegion = sharedMemoryRegionView.MemoryRegion(); var hashTable = new SharedConfigManager(); hashTable.SetMemoryRegion(sharedConfigMemoryRegion); for (int i = 0; i < 500; i++) { { TestComponentConfig config = default; config.ComponentType = (uint)(i + 1); config.Category = 2; config.Delay = 5; var componentConfig = ComponentConfig.Create(config); hashTable.Insert(componentConfig); } { var componentConfig = new ComponentConfig <TestComponentConfig, UnitTestProxy.TestComponentConfig>(); componentConfig.Config.ComponentType = (uint)(i + 1); componentConfig.Config.Category = 2; hashTable.UpdateConfig(componentConfig); Assert.Equal <double>(5, componentConfig.Config.Delay); } { var componentConfig = new ComponentConfig <TestComponentStatistics, UnitTestProxy.TestComponentStatistics>(); componentConfig.Config.Id = i; componentConfig.Config.RefCount.Value = 5; componentConfig.Config.Counters[0].Value = 2; hashTable.Insert(componentConfig); } } for (int i = 0; i < 500; i++) { { var componentConfig = new ComponentConfig <TestComponentConfig, UnitTestProxy.TestComponentConfig>(); componentConfig.Config.ComponentType = (uint)(i + 1); componentConfig.Config.Category = 2; hashTable.UpdateConfig(componentConfig); Assert.Equal <double>(5, componentConfig.Config.Delay); } { var componentConfig = new ComponentConfig <TestComponentStatistics, UnitTestProxy.TestComponentStatistics>(); componentConfig.Config.Id = i; hashTable.UpdateConfig(componentConfig); Assert.Equal <ulong>(5, componentConfig.Config.RefCount.Value); Assert.Equal <ulong>(2, componentConfig.Config.Counters[0].Value); } { var componentStatistics = new TestComponentStatistics() { Id = i }; SharedConfig <UnitTestProxy.TestComponentStatistics> sharedConfig = hashTable.Lookup(componentStatistics); } { TestComponentStatistics.CodegenKey codegenKey = default; codegenKey.Id = i; SharedConfig <UnitTestProxy.TestComponentStatistics> sharedConfig = hashTable.Lookup(codegenKey); Assert.Equal <ulong>(5, sharedConfig.Config.RefCount.Load()); Assert.Equal <ulong>(2, sharedConfig.Config.Counters[0].Load()); } } }
/// <summary> /// Creates AnonymousMemoryMlosContext. /// </summary> /// <returns></returns> public static AnonymousMemoryMlosContext Create() { var fdExchangeServer = new FileDescriptorExchangeServer(DefaultSocketFolderPath); fdExchangeServer.HandleRequests(); SharedMemoryRegionView <MlosProxyInternal.GlobalMemoryRegion> globalMemoryRegionView = SharedMemoryRegionView.OpenFromFileDescriptor <MlosProxyInternal.GlobalMemoryRegion>( fdExchangeServer.GetSharedMemoryFd(GlobalMemoryMapName)); // Create channel synchronization primitives. // MlosProxyInternal.GlobalMemoryRegion globalMemoryRegion = globalMemoryRegionView.MemoryRegion(); // Control channel. // globalMemoryRegion.TryGetSharedMemoryName( new MlosInternal.MemoryRegionId { Type = MemoryRegionType.ControlChannel, Index = 0 }, out string sharedMemoryMapName); SharedMemoryMapView controlChannelMemoryMapView = SharedMemoryMapView.OpenFromFileDescriptor( fdExchangeServer.GetSharedMemoryFd(sharedMemoryMapName)); // Feedback channel. // globalMemoryRegion.TryGetSharedMemoryName( new MlosInternal.MemoryRegionId { Type = MemoryRegionType.FeedbackChannel, Index = 0 }, out sharedMemoryMapName); SharedMemoryMapView feedbackChannelMemoryMapView = SharedMemoryMapView.OpenFromFileDescriptor( fdExchangeServer.GetSharedMemoryFd(sharedMemoryMapName)); // Shared config. // globalMemoryRegion.TryGetSharedMemoryName( new MlosInternal.MemoryRegionId { Type = MemoryRegionType.SharedConfig, Index = 0 }, out sharedMemoryMapName); SharedMemoryMapView sharedConfigMemoryMapView = SharedMemoryMapView.OpenFromFileDescriptor( fdExchangeServer.GetSharedMemoryFd(sharedMemoryMapName)); var sharedConfigMemoryRegionView = new SharedMemoryRegionView <MlosProxyInternal.SharedConfigMemoryRegion>(sharedConfigMemoryMapView); globalMemoryRegion.TryOpenExisting( new MlosInternal.MemoryRegionId { Type = MemoryRegionType.ControlChannel, Index = 0, }, out NamedEvent controlChannelNamedEvent); globalMemoryRegion.TryOpenExisting( new MlosInternal.MemoryRegionId { Type = MemoryRegionType.FeedbackChannel, Index = 0, }, out NamedEvent feedbackChannelNamedEvent); return(new AnonymousMemoryMlosContext( globalMemoryRegionView, controlChannelMemoryMapView, feedbackChannelMemoryMapView, sharedConfigMemoryRegionView, controlChannelNamedEvent, feedbackChannelNamedEvent, fdExchangeServer)); }
public void Insert() { // Create a shared memory map. // using var sharedMemoryRegionView = SharedMemoryRegionView.CreateNew <MlosProxyInternal.SharedConfigMemoryRegion>(SharedMemoryMapName, SharedMemorySize); sharedMemoryRegionView.CleanupOnClose = true; // Create a shared config manager, and register created test shared memory map. // using var sharedConfigManager = new SharedConfigManager(); sharedConfigManager.RegisterSharedConfigMemoryRegion(sharedMemoryRegionView); sharedConfigManager.CleanupOnClose = true; for (int i = 0; i < 500; i++) { { TestComponentConfig config = default; config.ComponentType = (uint)(i + 1); config.Category = 2; config.Delay = 5; var componentConfig = ComponentConfig.Create(config); sharedConfigManager.Insert(componentConfig); } { var componentConfig = new ComponentConfig <TestComponentConfig, UnitTestProxy.TestComponentConfig>(); componentConfig.Config.ComponentType = (uint)(i + 1); componentConfig.Config.Category = 2; sharedConfigManager.UpdateConfig(componentConfig); Assert.Equal <double>(5, componentConfig.Config.Delay); } { var componentConfig = new ComponentConfig <TestComponentStatistics, UnitTestProxy.TestComponentStatistics>(); componentConfig.Config.Id = i; componentConfig.Config.RefCount.Value = 5; componentConfig.Config.Counters[0].Value = 2; sharedConfigManager.Insert(componentConfig); } } for (int i = 0; i < 500; i++) { { var componentConfig = new ComponentConfig <TestComponentConfig, UnitTestProxy.TestComponentConfig>(); componentConfig.Config.ComponentType = (uint)(i + 1); componentConfig.Config.Category = 2; sharedConfigManager.UpdateConfig(componentConfig); Assert.Equal <double>(5, componentConfig.Config.Delay); } { var componentConfig = new ComponentConfig <TestComponentStatistics, UnitTestProxy.TestComponentStatistics>(); componentConfig.Config.Id = i; sharedConfigManager.UpdateConfig(componentConfig); Assert.Equal <ulong>(5, componentConfig.Config.RefCount.Value); Assert.Equal <ulong>(2, componentConfig.Config.Counters[0].Value); } { var componentStatistics = new TestComponentStatistics() { Id = i }; SharedConfig <UnitTestProxy.TestComponentStatistics> sharedConfig = sharedConfigManager.Lookup(componentStatistics); } { TestComponentStatistics.CodegenKey codegenKey = default; codegenKey.Id = i; SharedConfig <UnitTestProxy.TestComponentStatistics> sharedConfig = sharedConfigManager.Lookup(codegenKey); Assert.Equal <ulong>(5, sharedConfig.Config.RefCount.Load()); Assert.Equal <ulong>(2, sharedConfig.Config.Counters[0].Load()); } } }