Example #1
0
        public Heap(Stream stream, bool useCompression = false, AllocationStrategy strategy = AllocationStrategy.FromTheCurrentBlock)
        {
            stream.Seek(0, SeekOrigin.Begin); //support Seek?

            Stream = stream;

            space = new Space();

            used     = new Dictionary <long, Pointer>();
            reserved = new Dictionary <long, Pointer>();

            if (stream.Length < AtomicHeader.SIZE) //create new
            {
                header = new AtomicHeader();
                header.UseCompression = useCompression;
                space.Add(new Ptr(AtomicHeader.SIZE, long.MaxValue - AtomicHeader.SIZE));
            }
            else //open exist (ignore the useCompression flag)
            {
                header = AtomicHeader.Deserialize(Stream);
                stream.Seek(header.SystemData.Position, SeekOrigin.Begin);
                Deserialize(new BinaryReader(stream));

                //manual alloc header.SystemData
                var ptr = space.Alloc(header.SystemData.Size);
                if (ptr.Position != header.SystemData.Position)
                {
                    throw new Exception("Logical error.");
                }
            }

            Strategy = strategy;

            currentVersion++;
        }
Example #2
0
        public static AtomicHeader Deserialize(Stream stream)
        {
            AtomicHeader header = new AtomicHeader();

            stream.Seek(0, SeekOrigin.Begin);

            byte[] buffer = new byte[SIZE];
            if (stream.Read(buffer, 0, SIZE) != SIZE)
            {
                throw new Exception(String.Format("Invalid {0} header.", TITLE));
            }

            using (MemoryStream ms = new MemoryStream(buffer))
            {
                BinaryReader reader = new BinaryReader(ms);

                string title = reader.ReadString();
                if (title != TITLE)
                {
                    throw new Exception(String.Format("Invalid {0} header.", TITLE));
                }

                header.Version        = reader.ReadInt32();
                header.UseCompression = reader.ReadBoolean();

                //last flush location
                header.SystemData = Ptr.Deserialize(reader);

                //tag
                int tagLength = reader.ReadInt32();
                header.Tag = tagLength >= 0 ? reader.ReadBytes(tagLength) : null;
            }

            return(header);
        }
Example #3
0
        public Heap(Stream stream, bool useCompression = false, AllocationStrategy strategy = AllocationStrategy.FromTheCurrentBlock)
        {
            stream.Seek(0, SeekOrigin.Begin); //support Seek?

            Stream = stream;

            space = new Space();

            used = new Dictionary<long, Pointer>();
            reserved = new Dictionary<long, Pointer>();

            if (stream.Length < AtomicHeader.SIZE) //create new
            {
                header = new AtomicHeader();
                header.UseCompression = useCompression;
                space.Add(new Ptr(AtomicHeader.SIZE, long.MaxValue - AtomicHeader.SIZE));
            }
            else //open exist (ignore the useCompression flag)
            {
                header = AtomicHeader.Deserialize(Stream);
                stream.Seek(header.SystemData.Position, SeekOrigin.Begin);
                Deserialize(new BinaryReader(stream));

                //manual alloc header.SystemData
                var ptr = space.Alloc(header.SystemData.Size);
                if (ptr.Position != header.SystemData.Position)
                    throw new Exception("Logical error.");
            }

            Strategy = strategy;

            currentVersion++;
        }
Example #4
0
        public static AtomicHeader Deserialize(Stream stream)
        {
            AtomicHeader header = new AtomicHeader();

            stream.Seek(0, SeekOrigin.Begin);

            byte[] buffer = new byte[SIZE];
            if (stream.Read(buffer, 0, SIZE) != SIZE)
                throw new Exception(String.Format("Invalid {0} header.", TITLE));

            using (MemoryStream ms = new MemoryStream(buffer))
            {
                BinaryReader reader = new BinaryReader(ms);

                string title = reader.ReadString();
                if (title != TITLE)
                    throw new Exception(String.Format("Invalid {0} header.", TITLE));

                header.Version = reader.ReadInt32();
                header.UseCompression = reader.ReadBoolean();

                //last flush location
                header.SystemData = Ptr.Deserialize(reader);

                //tag
                int tagLength = reader.ReadInt32();
                header.Tag = tagLength >= 0 ? reader.ReadBytes(tagLength) : null;
            }

            return header;
        }
Example #5
0
        public static AtomicHeader Deserialize(Stream system)
        {
            AtomicHeader header = new AtomicHeader();

            system.Seek(POSITION, SeekOrigin.Begin);
            byte[] buffer = new byte[SIZE];

            if (system.Read(buffer, 0, buffer.Length) != SIZE)
            {
                return(header);
            }

            using (MemoryStream ms = new MemoryStream(buffer))
            {
                BinaryReader br = new BinaryReader(ms);

                //last flush location
                header.LastFlush = Ptr.Deserialize(br);

                //tag
                int tagLength = br.ReadInt32();
                header.Tag = tagLength >= 0 ? br.ReadBytes(tagLength) : null;
            }

            return(header);
        }
Example #6
0
        public Heap(Stream system, Stream data, long initialFreeSize, bool useCompression)
        {
            system.Seek(0, SeekOrigin.Begin); //support Seek?
            data.Seek(0, SeekOrigin.Begin);   //support Seek?

            System = system;
            Data   = data;

            header   = AtomicHeader.Deserialize(System);
            space    = new Space();
            used     = new Dictionary <long, Pointer>();
            reserved = new Dictionary <long, Pointer>();

            if (header.LastFlush == Ptr.NULL)
            {
                space.Add(new Ptr(0, initialFreeSize));
            }
            else
            {
                system.Seek(header.LastFlush.Position, SeekOrigin.Begin);
                Deserialize(new BinaryReader(system));
            }

            UseCompression = useCompression;

            currentVersion++;
        }