Example #1
0
        public async Task GetObject_SharedMemoryObject_VerifyMatches(string content)
        {
            using (SharedMemoryManager manager = new SharedMemoryManager(_loggerFactory, _mapAccessor))
            {
                // Put content into shared memory
                SharedMemoryMetadata metadata = await manager.PutObjectAsync(content);

                // Get object from shared memory
                object readObject = await manager.GetObjectAsync(metadata.MemoryMapName, 0, content.Length, typeof(SharedMemoryObject));

                SharedMemoryObject readContent       = readObject as SharedMemoryObject;
                Stream             readContentStream = readContent.Content;

                Assert.NotNull(readContentStream);
                Assert.Equal(metadata.MemoryMapName, readContent.MemoryMapName);
                Assert.Equal(metadata.Count, readContent.Count);

                using (StreamReader reader = new StreamReader(readContentStream))
                {
                    string readContentString = await reader.ReadToEndAsync();

                    // Verify read content matches the content that was written
                    Assert.Equal(content, readContentString);
                }
            }
        }
Example #2
0
        static void Main(string[] args)
        {
            Console.WriteLine($"Process start (EnvironmentVersion:{Environment.Version.ToString()} ProcessName:{Process.GetCurrentProcess().ProcessName} Is64BitProcess:{Environment.Is64BitProcess})");
            Console.WriteLine("Press Enter:Add shared memory value\nPress Q:Exit\n");
            using (var shareMem = new SharedMemoryObject <double>("Memory1", Length))
            {
                var span = shareMem.AsSpan();

                while (true)
                {
                    var keyInfo = Console.ReadKey(true);
                    var rand    = new Random();

                    switch (keyInfo.Key)
                    {
                    case ConsoleKey.Enter:
                        for (int i = 0; i < Length; i++)
                        {
                            var addVal = rand.NextDouble();
                            span[i] += addVal;
                            Console.WriteLine($"span[{i}]={span[i]} (+{addVal})");
                        }
                        break;

                    case ConsoleKey.Q:
                        return;
                    }
                }
            }
        }
        public async Task ToObject_Bytes_FunctionDataCacheEnabled_VerifySuccess()
        {
            ILogger <RpcSharedMemory> logger = NullLogger <RpcSharedMemory> .Instance;
            string invocationId = Guid.NewGuid().ToString();
            long   contentSize  = 16 * 1024; // 16KB, enough to try out the functionality we need to test

            using (SharedMemoryManager manager = new SharedMemoryManager(_loggerFactory, _mapAccessor))
            {
                // Create a SharedMemoryMap
                string          mapName         = Guid.NewGuid().ToString();
                SharedMemoryMap sharedMemoryMap = CreateSharedMemoryMap(mapName, contentSize);

                // Wite content into it
                byte[] content      = TestUtils.GetRandomBytesInArray((int)contentSize);
                long   bytesWritten = await sharedMemoryMap.PutBytesAsync(content);

                Assert.Equal(contentSize, bytesWritten);

                // Create a RpcSharedMemory object pointing to the shared memory region we created earlier
                RpcSharedMemory rpcSharedMemory = new RpcSharedMemory
                {
                    Name   = mapName,
                    Count  = contentSize,
                    Offset = 0,
                    Type   = RpcDataType.Bytes
                };

                // Convert RpcSharedMemory object into byte[]
                object rpcObj = await rpcSharedMemory.ToObjectAsync(logger, invocationId, manager, isFunctionDataCacheEnabled : true);

                Assert.NotNull(rpcObj);

                // Since the FunctionDataCache is enabled, the object should be a SharedMemoryObject
                Assert.IsType <SharedMemoryObject>(rpcObj);
                SharedMemoryObject sharedMemoryObject = rpcObj as SharedMemoryObject;

                // Verify that the read object is correct
                Assert.Equal(mapName, sharedMemoryObject.MemoryMapName);
                Assert.Equal(contentSize, sharedMemoryObject.Count);

                // Since the FunctionDataCache is enabled, ensure that the SharedMemoryManager is tracking the object that was read
                Assert.Equal(1, manager.AllocatedSharedMemoryMaps.Count);
                Assert.True(manager.AllocatedSharedMemoryMaps.TryGetValue(mapName, out _));

                // Dispose off the created resources
                sharedMemoryMap.Dispose();
            }
        }