예제 #1
0
파일: Session.cs 프로젝트: mpvyard/Quanta
        public virtual TSet Read()
        {
            if (!_initialized)
            {
                throw new NotSupportedException("Reading from an uninitialized Session is not supported");
            }

            if (_data != null)
            {
                return(_data);
            }
            _data = new TSet();

            if (!File.Exists(_fileName))
            {
                return(_data);
            }

            using (MemoryMappedFile memFile = MemoryMappedFile.CreateFromFile(_fileName, FileMode.Open, _mapName, 0, MemoryMappedFileAccess.Read))
                using (MemoryMappedViewStream view = memFile.CreateViewStream(0, 0, MemoryMappedFileAccess.Read))
                {
                    RuntimeHelpers.PrepareConstrainedRegions();
                    long  headerSize = Unsafe.SizeOf <Header>();
                    TMap  map        = new TMap();
                    byte *ptr        = (byte *)0;

                    try
                    {
                        view.SafeMemoryMappedViewHandle.AcquirePointer(ref ptr);
                        byte *loc = ptr;

                        Header info = Unsafe.Read <Header>(loc);
                        loc += headerSize;

                        byte[] metaBytes = new byte[info.MetaLen];

                        Marshal.Copy((IntPtr)loc, metaBytes, 0, info.MetaLen);
                        loc           += info.MetaLen;
                        _data.MetaData = MetaFormatter.Deserialize <TMeta>(metaBytes);

                        int len = Unsafe.SizeOf <TStruct>();

                        for (int i = 0; i < info.ItemCount; ++i)
                        {
                            _data.Add(map.ToData(Unsafe.Read <TStruct>(loc), _data.MetaData));
                            loc += len;
                        }
                    }
                    finally
                    {
                        if (ptr != null)
                        {
                            view.SafeMemoryMappedViewHandle.ReleasePointer();
                        }
                    }
                }

            return(_data);
        }