public override int Enqueue(object a) {
bool close = false;
int count = -1;
lock( _sync ) {
if( _max_enqueues > 0 && _enqueues >= _max_enqueues ) {
//No good:
throw new InvalidOperationException("Maximum number of Enqueues exceeded");
}
if( _closed == 0 ) {
_queue.Enqueue(a);
_enqueues++;
_count++;
count = _count;
close = (_enqueues == _max_enqueues);
}
else {
//We are closed, ignore all future enqueues.
throw new InvalidOperationException("BlockingQueue is closed, Enqueue failed");
}
//Wake up any waiting threads
#if BRUNET_DEBUG
Console.Error.WriteLine("Enqueue set: count {0}", Count);
#endif
}
//If we just went from 0 -> 1 signal any waiting Dequeue
if( count == 1 ) {
SetOrCloseRE(true, false);
}
//After we have alerted any blocking threads (Set), fire
//the event:
FireEnqueue();
if( close ) {
Close();
}
return count;
}