package org.atomnuke.service.gc.impl;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.atomnuke.service.gc.ReclamationHandler;
import org.atomnuke.plugin.InstanceContext;
import org.atomnuke.plugin.context.InstanceContextImpl;
import org.atomnuke.plugin.env.NopInstanceEnvironment;
import org.atomnuke.lifecycle.Reclaimable;
import org.atomnuke.util.remote.AtomicCancellationRemote;
import org.atomnuke.util.remote.CancellationRemote;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author zinic
*/
public class NukeReclamationHandler implements ReclamationHandler {
private static final Logger LOG = LoggerFactory.getLogger(NukeReclamationHandler.class);
private final List<ReclamationHandle> reclamationList;
public NukeReclamationHandler() {
reclamationList = new LinkedList<ReclamationHandle>();
}
@Override
public void destroy() {
LOG.info("Removing " + reclamationList.size() + " objets marked for reclamation.");
for (ReclamationHandle reclamationHandle : reclamationList) {
reclamationHandle.reclaim();
}
reclamationList.clear();
}
@Override
public synchronized void garbageCollect() {
for (Iterator<ReclamationHandle> handleItr = reclamationList.iterator(); handleItr.hasNext();) {
final ReclamationHandle handle = handleItr.next();
if (handle.shouldReclaim()) {
handle.reclaim();
handleItr.remove();
}
}
}
@Override
public CancellationRemote watch(Reclaimable reclaimable) {
return watch(new InstanceContextImpl<Reclaimable>(NopInstanceEnvironment.getInstance(), reclaimable));
}
@Override
public synchronized CancellationRemote watch(InstanceContext<? extends Reclaimable> reclaimableInstance) {
final CancellationRemote cancellationRemote = new AtomicCancellationRemote();
reclamationList.add(new ReclamationHandle((InstanceContext<Reclaimable>) reclaimableInstance, cancellationRemote));
return cancellationRemote;
}
}