예제 #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);
        }
예제 #2
0
파일: Session.cs 프로젝트: mpvyard/Quanta
        internal long CalculateSize(TMeta metadata, int count)
        {
            long metaSize   = MetaFormatter.Serialize <TMeta>(metadata).Length;
            long headerSize = Unsafe.SizeOf <Header>();
            long dataSize   = Unsafe.SizeOf <TStruct>() * count;

            return(metaSize + headerSize + dataSize);
        }
예제 #3
0
        public TestCommand(ILogger <TestCommand> logger, EgretConsole console, ConfigDeserializer serializer, TestCommandOptions options, Executor executor, MetaFormatter metaFormatter
                           )
        {
            this.serializer = serializer;
            this.options    = options;
            this.executor   = executor;
            this.logger     = logger;
            this.console    = console;

            resultFormatter = metaFormatter;
        }
예제 #4
0
파일: Session.cs 프로젝트: mpvyard/Quanta
        public void Write(TSet items, WriteType writeType = WriteType.Update)
        {
            if (!_initialized)
            {
                throw new NotSupportedException("Writing to an uninitialized Session is not supported");
            }

            _syncLock.EnterWriteLock();
            try
            {
                _data = Read();
                if (_data.Count == 0 || writeType == WriteType.Overwrite)
                {
                    _data = items;
                }
                else
                {
                    if (writeType == WriteType.Update)
                    {
                        _data.Update(items);
                        _data.MetaData = items.MetaData;
                    }
                    else if (writeType == WriteType.Append)
                    {
                        _data.Append(items);
                        _data.MetaData = items.MetaData;
                    }
                }

                long fileSize = CalculateSize(_data.MetaData, _data.Count);

                byte[] metaBytes = MetaFormatter.Serialize <TMeta>(_data.MetaData);

                long headerSize = Unsafe.SizeOf <Header>();
                long dataStart  = Unsafe.SizeOf <Header>() + metaBytes.Length;
                long dataEnd    = dataStart + (Unsafe.SizeOf <TStruct>() * items.Count);

                Header info = new Header
                {
                    MetaLen   = metaBytes.Length,
                    ItemCount = items.Count
                };


                using (MemoryMappedFile memFile = MemoryMappedFile.CreateFromFile(_fileName, FileMode.Create, _mapName, fileSize, MemoryMappedFileAccess.ReadWrite))
                    using (MemoryMappedViewStream view = memFile.CreateViewStream(0, 0, MemoryMappedFileAccess.Write))
                    {
                        TMap map = new TMap();

                        RuntimeHelpers.PrepareConstrainedRegions();
                        byte *ptr = (byte *)0;
                        try
                        {
                            view.SafeMemoryMappedViewHandle.AcquirePointer(ref ptr);
                            byte *start = ptr;
                            byte *end   = ptr + fileSize;

                            Unsafe.Write <Header>(start, info);
                            start += headerSize;

                            Marshal.Copy(metaBytes, 0, IntPtr.Add(new IntPtr(ptr), (int)headerSize), metaBytes.Length);
                            start += metaBytes.Length;

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

                            foreach (TData item in items)
                            {
                                TStruct strct = map.ToStruct(item);
                                Unsafe.Write <TStruct>(start, strct);
                                start += len;
                            }
                        }
                        finally
                        {
                            if (ptr != null)
                            {
                                view.SafeMemoryMappedViewHandle.ReleasePointer();
                            }
                        }
                    }
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                _syncLock.ExitWriteLock();
            }
        }