public BaseSharedChannelBenchmark() { globalChannelMemoryRegionView = SharedMemoryRegionView.CreateNew <MlosProxyInternal.GlobalMemoryRegion>(GlobalMemoryMapName, SharedMemorySize); sharedChannelMemoryMapView = SharedMemoryMapView.CreateNew(SharedChannelMemoryMapName, SharedMemorySize); MlosProxyInternal.GlobalMemoryRegion globalMemoryRegion = globalChannelMemoryRegionView.MemoryRegion(); sharedChannel = new TestSharedChannel(sharedChannelMemoryMapView, globalMemoryRegion.ControlChannelSynchronization); settingsAssemblyManager.RegisterAssembly(typeof(MlosContext).Assembly); settingsAssemblyManager.RegisterAssembly(typeof(AssemblyInitializer).Assembly); // Preallocate class type messages to avoid heap allocations. // stringViewArray = new StringViewArray(); stringViewArray.Id = 1; stringViewArray.Strings[0].Value = "12345"; stringViewArray.Strings[1].Value = "54321"; stringViewArray.Strings[2].Value = "abc"; stringViewArray.Strings[3].Value = "cba"; stringViewArray.Strings[4].Value = "sbs"; wideStringMultiMessage = new WideStringMultiMessage(); wideStringMultiMessage.StringMessages[0].Id = 4; wideStringMultiMessage.StringMessages[0].Strings[0].Value = "Test_Name9876"; wideStringMultiMessage.StringMessages[0].Strings[1].Value = "Test_Name19876"; wideStringMultiMessage.StringMessages[0].Strings[2].Value = "Test_Name1239876"; wideStringMultiMessage.StringMessages[0].Strings[3].Value = "Test_Name45659876"; wideStringMultiMessage.StringMessages[0].Strings[4].Value = "Test_Name901239876"; pointMessage.X = 4; pointMessage.Y = 5; }
/// <summary> /// Tries to open a shared memory map. /// </summary> /// <param name="globalMemoryRegion"></param> /// <param name="memoryRegionId"></param> /// <param name="sharedMemoryMapView"></param> /// <returns></returns> public static bool TryOpenExisting( this GlobalMemoryRegion globalMemoryRegion, MlosInternal.MemoryRegionId memoryRegionId, out SharedMemoryMapView sharedMemoryMapView) { MlosInternal.RegisteredMemoryRegionConfig.CodegenKey registeredMemoryLookupKey = default; registeredMemoryLookupKey.MemoryRegionId = memoryRegionId; // Locate shared memory region config. // SharedConfig <MlosProxyInternal.RegisteredMemoryRegionConfig> registeredMemoryRegionSharedConfig = SharedConfigManager.Lookup(globalMemoryRegion.SharedConfigDictionary, registeredMemoryLookupKey); if (!registeredMemoryRegionSharedConfig.HasSharedConfig) { sharedMemoryMapView = null; return(false); } // Config exists, create a shared config memory region. // MlosProxyInternal.RegisteredMemoryRegionConfig registeredMemoryRegionConfig = registeredMemoryRegionSharedConfig.Config; sharedMemoryMapView = SharedMemoryMapView.OpenExisting( registeredMemoryRegionConfig.MemoryMapName.Value, registeredMemoryRegionConfig.MemoryRegionSize); return(true); }
/// <summary> /// Register shared config memory region. /// </summary> /// <param name="msg"></param> private static void RegisterSharedConfigMemoryRegionRequestMessageCallback(MlosProxyInternal.RegisterSharedConfigMemoryRegionRequestMessage msg) { // Store shared config memory region. // SharedMemoryMapView sharedConfigMemoryMapView = MemoryRegions[msg.MemoryRegionId]; SharedConfigManager.SetMemoryRegion(new MlosProxyInternal.SharedConfigMemoryRegion() { Buffer = sharedConfigMemoryMapView.Buffer }); }
/// <summary> /// Register memory region. /// </summary> /// <param name="msg"></param> private static void RegisterMemoryRegionMessageCallback(MlosProxyInternal.RegisterMemoryRegionRequestMessage msg) { if (!MemoryRegions.ContainsKey(msg.MemoryRegionId)) { SharedMemoryMapView sharedMemoryMapView = SharedMemoryMapView.Open( msg.Name.Value, msg.MemoryRegionSize); MemoryRegions.Add(msg.MemoryRegionId, sharedMemoryMapView); } }
public SharedChannelTests() { // Load the registry settings assemblies. // _ = SettingsAssemblyInitializer.GetGlobalDispatchTable(); // Initialize shared channel. // globalChannelMemoryRegionView = SharedMemoryRegionView.Create <MlosProxyInternal.GlobalMemoryRegion>(GlobalMemoryMapName, SharedMemorySize); sharedChannelMemoryMapView = SharedMemoryMapView.Create(SharedChannelMemoryMapName, SharedMemorySize); MlosProxyInternal.GlobalMemoryRegion globalMemoryRegion = globalChannelMemoryRegionView.MemoryRegion(); sharedChannel = new TestSharedChannel(sharedChannelMemoryMapView, globalMemoryRegion.ControlChannelSynchronization); }
public void VerifySharedMemoryMapUnlink() { // Create a new shared memory maps. // var newSharedChannelMemoryMap = SharedMemoryMapView.CreateNew(SharedMemoryMapName, SharedMemorySize); newSharedChannelMemoryMap.CleanupOnClose = true; newSharedChannelMemoryMap.Dispose(); try { // Verify we can open already created shared memory. // using var openedSharedChannelMemoryMap = SharedMemoryMapView.OpenExisting(SharedMemoryMapName, SharedMemorySize); openedSharedChannelMemoryMap.CleanupOnClose = true; Assert.False(true, "Shared memory map should be deleted"); } catch (FileNotFoundException) { // We are expecting failure. // } }
/// <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); } }