Example #1
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 #2
0
 public void Unregister(StreamID streamID)
 {
     lock (this)
     {
         if (StreamTracingEnabled)
         {
             StreamEvents.Deallocate(streamID);
         }
         InternalUnregister(streamID);
     }
 }
Example #3
0
 public StreamID Register(IStreamProvider provider)
 {
     lock (this)
     {
         StreamID streamID = InternalGetNextStreamID();
         InternalRegister(streamID, provider);
         if (StreamTracingEnabled)
         {
             StreamEvents.Add(new RegisterStreamEvent(streamID));
         }
         return(streamID);
     }
 }
Example #4
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 #5
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 #6
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 #7
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);
     }
 }