release method
Return an engine to the pool. Do not use engine after this call.
Implementation
void release(JavascriptRuntime engine) {
if (_disposed) {
_destroy(engine);
return;
}
if (!_all.contains(engine)) {
throw ArgumentError('Engine not owned by this pool');
}
if (!_leased.remove(engine)) {
throw StateError('Engine is not currently leased');
}
_prepareForReuse(engine);
if (!_all.contains(engine)) {
// reinitialize failed and engine was destroyed; try to fill a waiter with a new one
if (_waiters.isNotEmpty && _all.length < maxSize) {
final eng = _create();
_all.add(eng);
_leased.add(eng);
final w = _waiters.removeFirst();
if (!w.isCompleted) {
w.complete(eng);
return;
}
_idle.addLast(eng);
}
return;
}
while (_waiters.isNotEmpty) {
final w = _waiters.removeFirst();
if (!w.isCompleted) {
_leased.add(engine);
w.complete(engine);
return;
}
}
_idle.addLast(engine);
}