Example #1
0
 public StreamHeader(StreamID streamID, IStreamProvider provider) : base()
 {
     _streamID = streamID;
     _provider = provider;
                 #if LOCKSTREAMS
     FLockID = new LockID(this, AStreamID.ToString());
                 #endif
 }
Example #2
0
        public override void Deallocate(StreamID streamID)
        {
            lock (this)
            {
                StreamHeader header = GetStreamHeader(streamID);
                if (StreamTracingEnabled)
                {
                    StreamEvents.Deallocate(streamID);
                }

                _headers.Remove(streamID);

                StreamID sourceStreamID;;
                if (!_referencingHeaders.TryGetValue(streamID, out sourceStreamID))
                {
                    // if this stream is a referenced stream
                    if (header.References.Count > 0)
                    {
                        // select a referencing stream to be the new source stream
                        StreamID     newStreamID = header.References[0];
                        StreamHeader newHeader   = GetStreamHeader(newStreamID);

                        // reassign the stream id for the stream in the provider (from this stream to the new source stream id)
                        header.Provider.Reassign(header.StreamID, newStreamID);

                        // change the provider in the header for the new source stream id
                        newHeader.Provider = header.Provider;
                        if (newHeader.Stream != null)
                        {
                            newHeader.Stream.SourceStream = newHeader.Provider.Open(newStreamID);                             // TODO: Shouldn't this close the old stream?
                        }
                        // dereference the new header
                        _referencingHeaders.Remove(newStreamID);
                        header.References.RemoveAt(0);

                        // move all references to this stream to the new source stream
                        MoveReferences(header, newHeader);
                    }
                    else
                    {
                        // destroy this stream
                        header.Provider.Destroy(streamID);
                    }
                }
                else
                {
                    // if this stream is a reference stream
                    StreamHeader sourceHeader = GetStreamHeader(sourceStreamID);

                    // move all references to this stream to the source stream
                    MoveReferences(header, sourceHeader);

                    // dereference the source stream
                    sourceHeader.References.Remove(streamID);
                    _referencingHeaders.Remove(streamID);
                }
            }
        }
Example #3
0
 public override void Destroy(StreamID streamID)
 {
     lock (this)
     {
         FileStreamHeader header = GetStreamHeader(streamID);
         _headers.Remove(streamID);
         header.Dispose();
     }
 }
Example #4
0
        // IStreamManager
        public StreamID Allocate()
        {
            // Allocates a new stream in the source stream manager, and saves the header and local cache for it locally
            StreamID          streamID = _sourceStreamManager.Allocate();
            LocalStreamHeader header   = new LocalStreamHeader(streamID);

            _headers.Add(header);
            return(streamID);
        }
Example #5
0
 public override void Reassign(StreamID oldStreamID, StreamID newStreamID)
 {
     lock (this)
     {
         FileStreamHeader oldHeader = GetStreamHeader(oldStreamID);
         _headers.Remove(oldStreamID);
         oldHeader.StreamID = newStreamID;
         _headers.Add(oldHeader);
     }
 }
Example #6
0
        public void Flush(StreamID streamID)
        {
            // Ensures that the given local cache is flushed to the source stream manager
            LocalStreamHeader header;

            if (_headers.TryGetValue(streamID, out header) && (header.Stream != null))
            {
                header.Stream.Flush();
            }
        }
Example #7
0
        private FileStreamHeader GetStreamHeader(StreamID streamID)
        {
            FileStreamHeader header;

            if (!_headers.TryGetValue(streamID, out header))
            {
                throw new StreamsException(StreamsException.Codes.StreamIDNotFound, streamID.ToString());
            }
            return(header);
        }
Example #8
0
 public void Unregister(StreamID streamID)
 {
     lock (this)
     {
         if (StreamTracingEnabled)
         {
             StreamEvents.Deallocate(streamID);
         }
         InternalUnregister(streamID);
     }
 }
Example #9
0
 public void Deallocate(StreamID streamID)
 {
     for (int index = 0; index < Count; index++)
     {
         if (this[index].StreamID == streamID)
         {
             this[index].Deallocated = true;
             break;
         }
     }
 }
Example #10
0
        public int CompareTo(object AObject)
        {
            if (!(AObject is StreamID))
            {
                throw new StreamsException(StreamsException.Codes.InvalidComparison, AObject.GetType().Name);
            }

            StreamID LValue = (StreamID)AObject;

            return(LValue.Value == Value ? 0 : (LValue.Value > Value ? 1 : -1));
        }
Example #11
0
 public void Close(StreamID streamID)
 {
     for (int index = 0; index < Count; index++)
     {
         if (this[index].StreamID == streamID)
         {
             this[index].OpenCount--;
             break;
         }
     }
 }
Example #12
0
        public IRemoteStream OpenRemote(StreamID streamID, LockMode mode)
        {
            Stream        stream = Open(streamID, mode);
            IRemoteStream result = stream as IRemoteStream;

            if (result != null)
            {
                return(result);
            }
            return(new CoverStream(stream));
        }
Example #13
0
 public StreamID Register(IStreamProvider provider)
 {
     lock (this)
     {
         StreamID streamID = InternalGetNextStreamID();
         InternalRegister(streamID, provider);
         if (StreamTracingEnabled)
         {
             StreamEvents.Add(new RegisterStreamEvent(streamID));
         }
         return(streamID);
     }
 }
Example #14
0
 public override StreamID Allocate()
 {
     lock (this)
     {
         StreamID streamID = InternalGetNextStreamID();
         if (StreamTracingEnabled)
         {
             StreamEvents.Add(new AllocateStreamEvent(streamID));
         }
         _defaultProvider.Create(streamID);
         InternalRegister(streamID, _defaultProvider);
         return(streamID);
     }
 }
Example #15
0
 public override StreamID Reference(StreamID streamID)
 {
     lock (this)
     {
         StreamID     localStreamID = InternalGetNextStreamID();
         StreamHeader header        = GetStreamHeader(streamID);
         if (StreamTracingEnabled)
         {
             StreamEvents.Add(new ReferenceStreamEvent(localStreamID, header.StreamID));
         }
         header.References.Add(localStreamID);
         _referencingHeaders.Add(localStreamID, streamID);
         InternalRegister(localStreamID, _defaultProvider);
         return(localStreamID);
     }
 }
Example #16
0
        public Stream Open(StreamID streamID, LockMode mode)
        {
            // Ensures that the given stream is supported by a local cache and returns a stream accessing it
            LocalStreamHeader header;

            if (!_headers.TryGetValue(streamID, out header))
            {
                header = new LocalStreamHeader(streamID, new LocalStream(this, streamID, mode));                 //FSourceStreamManager.Open(AStreamID, AMode)));
                _headers.Add(header);
            }
            else if (header.Stream == null)
            {
                header.Stream = new LocalStream(this, streamID, mode);                 //, FSourceStreamManager.Open(AStreamID, AMode));
            }
            return(new CoverStream(header.Stream));
        }
Example #17
0
 public override void Close(int ownerID, StreamID streamID)
 {
     lock (this)
     {
                         #if DEBUG
         _closeCount++;
                         #endif
         if (_streamTracingEnabled)
         {
             StreamEvents.Close(streamID);
             StreamOpens.Add(String.Format("Close {0}", streamID.Value.ToString()));
         }
         StreamHeader header = GetStreamHeader(streamID);
         InternalClose(header);
     }
 }
Example #18
0
 public override Stream Open(int ownerID, StreamID streamID, LockMode mode)
 {
     lock (this)
     {
                         #if DEBUG
         _openCount++;
                         #endif
         if (_streamTracingEnabled)
         {
             StreamEvents.Open(streamID);
             StreamOpens.Add(String.Format("Open {0}", streamID.Value.ToString()));
         }
         StreamHeader header = GetStreamHeader(streamID);
         return(new ManagedStream(this, ownerID, streamID, InternalOpen(header, false)));
     }
 }
Example #19
0
        public void Release(StreamID streamID)
        {
            // Ensures that the given local cache is flushed and closes the stream obtained from the source stream manager
            LocalStreamHeader header;

            if (_headers.TryGetValue(streamID, out header))
            {
                if (header.Stream != null)
                {
                    header.Stream.Flush();
                                        #if UNMANAGEDSTREAM
                    FSourceStreamManager.Close(AStreamID);
                                        #else
                    header.Stream.Close();
                                        #endif
                    header.Stream = null;
                }
                _headers.Remove(header.StreamID);
                header.Dispose();
            }
        }
Example #20
0
        protected void MoveReferences(StreamHeader fromHeader, StreamHeader toHeader)
        {
            for (int index = fromHeader.References.Count - 1; index >= 0; index--)
            {
                StreamID streamID = fromHeader.References[index];

                // Remove the reference to the from header
                fromHeader.References.RemoveAt(index);
                _referencingHeaders.Remove(streamID);

                // Add the reference to the to header
                toHeader.References.Add(streamID);
                _referencingHeaders.Add(streamID, toHeader.StreamID);

                // Make sure the referencing header has the right stream
                StreamHeader referenceHeader = GetStreamHeader(streamID);
                if (referenceHeader.Stream != null)
                {
                    referenceHeader.Stream.SourceStream = toHeader.Provider.Open(toHeader.StreamID);                     // TODO: Shouldn't this close the old stream?
                }
            }
        }
Example #21
0
 public abstract StreamID Reference(StreamID streamID);
Example #22
0
 public abstract void Reassign(StreamID oldStreamID, StreamID newStreamID);
Example #23
0
 public abstract void Destroy(StreamID streamID);
Example #24
0
 public abstract void Close(StreamID streamID);
Example #25
0
 public abstract Stream Open(StreamID streamID);
Example #26
0
 public abstract void Close(int ownerID, StreamID streamID);
Example #27
0
 public IRemoteStream OpenRemote(int ownerID, StreamID streamID, LockMode mode)
 {
     return((IRemoteStream)Open(ownerID, streamID, mode));
 }
Example #28
0
 public abstract Stream Open(int ownerID, StreamID streamID, LockMode mode);
Example #29
0
 public abstract void Deallocate(StreamID streamID);
Example #30
0
 public void Close(StreamID streamID)
 {
     // Close takes no action, the local cache is still maintained, so the remote stream is kept open
     // a call to flush is required to force the data back to the remote stream manager
 }