private void Release(LOHBuffer buffer)
 {
     // flag buffer as no longer in use and release the semaphore
     // to allow more requests into the pool
     buffer.InUse = false;
     guard.Release();
 }
 public IBufferRegistration GetBuffer()
 {
     // this blocks until a buffer is free
     guard.Wait();
     // can now get buffer so make sure we're the only thread manipulating
     // the list of buffers
     lock (buffers)
     {
         IBufferRegistration freeBuffer = null;
         // look for a free buffer
         foreach (LOHBuffer buffer in buffers)
         {
             if (!buffer.InUse)
             {
                 buffer.InUse = true;
                 freeBuffer = new BufferReservation(this, buffer);
             }
         }
         // no free buffer so allocate a new one
         if (freeBuffer == null)
         {
             var buffer = new LOHBuffer();
             buffer.InUse = true;
             buffers.Add(buffer);
             freeBuffer = new BufferReservation(this, buffer);
         }
         return freeBuffer;
     }
 }
 public BufferReservation(BufferPool pool, LOHBuffer buffer)
 {
     this.pool = pool;
     this.buffer = buffer;
 }