コード例 #1
0
            /// <summary>
            /// Initializes an <see cref="Enumerator"/> structure.
            /// </summary>
            /// <param name="root">The root of the set to be enumerated.</param>
            /// <param name="builder">The builder, if applicable.</param>
            /// <param name="startIndex">The index of the first element to enumerate.</param>
            /// <param name="count">The number of elements in this collection.</param>
            /// <param name="reversed"><c>true</c> if the list should be enumerated in reverse order.</param>
            internal Enumerator(Node root, Builder builder = null, int startIndex = -1, int count = -1, bool reversed = false)
            {
                Requires.NotNull(root, nameof(root));
                Requires.Range(startIndex >= -1, nameof(startIndex));
                Requires.Range(count >= -1, nameof(count));
                Requires.Argument(reversed || count == -1 || (startIndex == -1 ? 0 : startIndex) + count <= root.Count);
                Requires.Argument(!reversed || count == -1 || (startIndex == -1 ? root.Count - 1 : startIndex) - count + 1 >= 0);

                _root                      = root;
                _builder                   = builder;
                _current                   = null;
                _startIndex                = startIndex >= 0 ? startIndex : (reversed ? root.Count - 1 : 0);
                _count                     = count == -1 ? root.Count : count;
                _remainingCount            = _count;
                _reversed                  = reversed;
                _enumeratingBuilderVersion = builder != null ? builder.Version : -1;
                _poolUserId                = SecureObjectPool.NewId();
                _stack                     = null;
                if (_count > 0)
                {
                    if (!s_EnumeratingStacks.TryTake(this, out _stack))
                    {
                        _stack = s_EnumeratingStacks.PrepNew(this, new Stack <RefAsValueType <Node> >(root.Height));
                    }

                    this.ResetStack();
                }
            }
コード例 #2
0
 public void TryAdd(TCaller caller, SecurePooledObject <T> item)
 {
     lock (item) {
         if (caller.PoolUserId == item.Owner)
         {
             item.Owner = Guid.Empty;
             this.pool.TryAdd(item);
         }
     }
 }
コード例 #3
0
 public bool TryTake(TCaller caller, out SecurePooledObject <T> item)
 {
     if (caller.PoolUserId != Guid.Empty && this.pool.TryTake(out item))
     {
         item.Owner = caller.PoolUserId;
         return(true);
     }
     item = null;
     return(false);
 }
コード例 #4
0
 /// <summary>
 /// Disposes of this enumerator and returns the stack reference to the resource pool.
 /// </summary>
 public void Dispose()
 {
     _root    = null !;
     _current = null;
     if (_stack != null && _stack.TryUse(ref this, out Stack <RefAsValueType <Node> >?stack))
     {
         stack.ClearFastWhenEmpty();
         s_enumeratingStacks.TryAdd(this, _stack !);
         _stack = null;
     }
 }
コード例 #5
0
            /// <summary>
            /// Disposes of this enumerator and returns the stack reference to the resource pool.
            /// </summary>
            public void Dispose()
            {
                _root    = null !;
                _current = null;
                if (_stack != null && _stack.TryUse(ref this, out Stack <RefAsValueType <Node> >?stack))
                {
                    stack.ClearFastWhenEmpty();
                    SecureObjectPool <Stack <RefAsValueType <Node> >, Enumerator> .TryAdd(this, _stack !);
                }

                _stack = null;
            }
コード例 #6
0
            /// <summary>
            /// Disposes of this enumerator and returns the stack reference to the resource pool.
            /// </summary>
            public void Dispose()
            {
                _root    = null;
                _current = null;
                Stack <RefAsValueType <SortedInt32KeyNode <TValue> > > stack;

                if (_stack != null && _stack.TryUse(ref this, out stack))
                {
                    stack.ClearFastWhenEmpty();
                    s_enumeratingStacks.TryAdd(this, _stack);
                }

                _stack = null;
            }
コード例 #7
0
            /// <summary>
            /// Initializes an <see cref="Enumerator"/> structure.
            /// </summary>
            /// <param name="root">The root of the set to be enumerated.</param>
            internal Enumerator(SortedInt32KeyNode <TValue> root)
            {
                Requires.NotNull(root, nameof(root));

                _root       = root;
                _current    = null;
                _poolUserId = SecureObjectPool.NewId();
                _stack      = null;
                if (!_root.IsEmpty)
                {
                    if (!s_enumeratingStacks.TryTake(this, out _stack))
                    {
                        _stack = s_enumeratingStacks.PrepNew(this, new Stack <RefAsValueType <SortedInt32KeyNode <TValue> > >(root.Height));
                    }

                    this.PushLeft(_root);
                }
            }
コード例 #8
0
            /// <summary>
            /// Initializes an <see cref="Enumerator"/> structure.
            /// </summary>
            /// <param name="root">The root of the set to be enumerated.</param>
            /// <param name="builder">The builder, if applicable.</param>
            /// <param name="reverse"><c>true</c> to enumerate the collection in reverse.</param>
            internal Enumerator(Node root, Builder builder = null, bool reverse = false)
            {
                Requires.NotNull(root, nameof(root));

                _root    = root;
                _builder = builder;
                _current = null;
                _reverse = reverse;
                _enumeratingBuilderVersion = builder != null ? builder.Version : -1;
                _poolUserId = SecureObjectPool.NewId();
                _stack      = null;
                if (!s_enumeratingStacks.TryTake(this, out _stack))
                {
                    _stack = s_enumeratingStacks.PrepNew(this, new Stack <RefAsValueType <Node> >(root.Height));
                }

                this.PushNext(_root);
            }
コード例 #9
0
            /// <summary>
            /// Initializes an Enumerator structure.
            /// </summary>
            /// <param name="root">The root of the set to be enumerated.</param>
            internal Enumerator(SortedInt32KeyNode <TValue> root)
            {
                Requires.NotNull(root, "root");

                this.root       = root;
                this.current    = null;
                this.poolUserId = SecureObjectPool.NewId();
                this.stack      = null;
                if (!this.root.IsEmpty)
                {
                    if (!enumeratingStacks.TryTake(this, out this.stack))
                    {
                        this.stack = enumeratingStacks.PrepNew(this, new Stack <RefAsValueType <SortedInt32KeyNode <TValue> > >(root.Height));
                    }

                    this.PushLeft(this.root);
                }
            }
コード例 #10
0
            /// <summary>
            /// Initializes an <see cref="Enumerator"/> structure.
            /// </summary>
            /// <param name="root">The root of the set to be enumerated.</param>
            /// <param name="builder">The builder, if applicable.</param>
            internal Enumerator(Node root, Builder?builder = null)
            {
                Requires.NotNull(root, nameof(root));

                _root    = root;
                _builder = builder;
                _current = null;
                _enumeratingBuilderVersion = builder != null ? builder.Version : -1;
                _poolUserId = SecureObjectPool.NewId();
                _stack      = null;
                if (!_root.IsEmpty)
                {
                    if (!SecureObjectPool <Stack <RefAsValueType <Node> >, Enumerator> .TryTake(this, out _stack))
                    {
                        _stack = SecureObjectPool <Stack <RefAsValueType <Node> >, Enumerator> .PrepNew(this, new Stack <RefAsValueType <Node> >(root.Height));
                    }

                    this.PushLeft(_root);
                }
            }
コード例 #11
0
ファイル: SecureObjectPool.cs プロジェクト: tronsoft/corefx
 internal SecurePooledObjectUser(SecurePooledObject <T> value)
 {
     this.value = value;
 }
コード例 #12
0
 internal SecurePooledObjectUser(SecurePooledObject <T> value)
 {
     this.value = value;
     Monitor.Enter(value);
 }