code: func (p *simpleResourcePool) Release(handle ManagedHandle) error {
  	if pool, ok := handle.Owner().(*simpleResourcePool); !ok || pool != p {
  		return errors.New(
  			"Resource pool cannot take control of a handle owned " +
  				"by another resource pool")
  	}
  
  	h := handle.ReleaseUnderlyingHandle()
  	if h != nil {
  		// We can unref either before or after queuing the idle handle.
  		// The advantage of unref-ing before queuing is that there is
  		// a higher chance of successful Get when number of active handles
  		// is close to the limit (but potentially more handle creation).
  		// The advantage of queuing before unref-ing is that there's a
  		// higher chance of reusing handle (but potentially more Get failures).
  		atomic.AddInt32(p.numActive, -1)
  		p.queueIdleHandles(h)
  	}
  
  	return nil
  }
docs: // See ResourcePool for documentation.