public ObjectHolderFactory(final int precreateNumber, final RecyclingSupplier.Factory<T> factory) throws ObjectCreationException { objects = new LinkedList<>(); this.factory = factory; for (int i = 0; i < precreateNumber; i++) { objects.add(new ObjectHolder<>(factory, false)); } }
@Override public void dispose(final ObjectHolder<T> object) throws ObjectDisposeException { if (!object.disposeIfNotBorrowed()) { throw new IllegalArgumentException("Object from holder is borrowed " + object); } }
@Override public boolean nevermind(final ObjectHolder<T> object) { lock.lock(); try { return borrowedObjects.remove(object.getObj()) != null; } finally { lock.unlock(); } } }
@Override public void recycle(final T object, final Exception e) { lock.lock(); try { ObjectHolder holder = borrowedObjects.remove(object); if (holder == null) { // not borrowed from here. globalPool.recycle(new ObjectHolder<>(object, globalPool.getSample().getFactory()), this); } else { try { holder.returnObject(object, e); } finally { if (reqReturnObjects > 0) { reqReturnObjects--; globalPool.recycle(holder, this); } else { localObjects.add(holder); } } } } finally { lock.unlock(); } }
@Override @Nullable public T tryGet(final long deadlineNanos) throws ObjectCreationException, InterruptedException { lock.lock(); try { T object; ObjectHolder<T> objectHolder; do { if (localObjects.isEmpty()) { objectHolder = globalPool.tryGet(this, deadlineNanos); if (objectHolder == null) { return null; } } else { objectHolder = localObjects.remove(); } object = objectHolder.borrowOrCreateObjectIfPossible(); } while (object == null); borrowedObjects.put(object, objectHolder); return object; } finally { lock.unlock(); } }
Map.Entry<T, ObjectHolder<T>> next = it.next(); ObjectHolder<T> result = next.getValue(); result.returnObject(next.getKey(), null); it.remove(); return Either.right(result);
@Override public ObjectHolder<T> create() throws ObjectCreationException { if (objects.isEmpty()) { return new ObjectHolder<>(factory); } else { return objects.remove(); } }