/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.depgraph; import java.util.Collection; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.engine.value.ValueRequirement; /** * Debugging utility; can periodically report on the outstanding terminal requirements that are in the run queue. */ /* package */final class PendingRequirements implements ResolvedValueCallback { private static final Logger s_logger = LoggerFactory.getLogger(PendingRequirements.class); private static final int REPORT_PERIOD = 10; // Only report every Nth housekeeping tick (1s per tick) private static final Housekeeper.Callback<PendingRequirements> s_report = new Housekeeper.Callback<PendingRequirements>() { @Override public boolean tick(final DependencyGraphBuilder builder, final PendingRequirements data) { data.tick(); return true; } @Override public boolean cancelled(final DependencyGraphBuilder builder, final PendingRequirements data) { return false; } @Override public boolean completed(final DependencyGraphBuilder builder, final PendingRequirements data) { return false; } }; private final Housekeeper _monitor; private final ConcurrentMap<ValueRequirement, ValueRequirement> _valueRequirements = new ConcurrentHashMap<ValueRequirement, ValueRequirement>(); private int _tick; public PendingRequirements(final DependencyGraphBuilder builder) { _monitor = Housekeeper.of(builder, s_report, this); } @Override public void resolved(final GraphBuildingContext context, final ValueRequirement valueRequirement, final ResolvedValue resolvedValue, final ResolutionPump pump) { _valueRequirements.remove(valueRequirement); if (pump != null) { context.close(pump); } } @Override public void failed(final GraphBuildingContext context, final ValueRequirement value, final ResolutionFailure failure) { _valueRequirements.remove(value); } @Override public void recursionDetected() { // No-op } private void tick() { if ((++_tick % REPORT_PERIOD) == 0) { if (s_logger.isDebugEnabled()) { s_logger.debug("{} pending in run queue", _valueRequirements); } else { s_logger.info("{} requirements pending in run queue", _valueRequirements.size()); } } } public void add(final GraphBuildingContext context, final ResolvedValueProducer producer) { _valueRequirements.put(producer.getValueRequirement(), producer.getValueRequirement()); producer.addCallback(context, this); if (s_logger.isDebugEnabled() || s_logger.isInfoEnabled()) { _monitor.start(); } } public Collection<ValueRequirement> getValueRequirements() { return _valueRequirements.keySet(); } }