 final public class ReleasePool {
   private let _tier1Container = makeThreadSafeContainer()
   private let _tier2Container = makeThreadSafeContainer()
+  private let _tier3Container = makeThreadSafeContainer()
   static let numberOfItemsForTier2 = (1 << 10) - 1
+  static let numberOfItemsForTier3 = (1 << 20) - 1
 
   public init() { }
   

  }

  private func updateHead(_ block: (AnyObject?) -> AnyObject?) {
    let item = _tier1Container.updateHead(block)
      .newHead as? Item
    
    if let item = item, (item.index & ReleasePool.numberOfItemsForTier2) == ReleasePool.numberOfItemsForTier2 {
      _tier2Container.updateHead { Tier2Item(item: item, next: $0 as! Tier2Item?) }
    }
  }
  
  public func insert(_ releasable: Releasable) {
    self.updateHead { ReleasableItem(object: releasable, next: $0 as! Item?) }

    }
  }
  
  final class NextTierItem {
    let item: Item
    let next: NextTierItem?
    init(item: Item, next: NextTierItem?) {
      self.item = item
      self.next = next
    }
