/** * {@inheritDoc} * * Performs a depth first search to find completed subsegment subtrees. Serializes these subsegments, streams them to the daemon, and removes them from their parents. * * @see StreamingStrategy#streamSome(Entity,Emitter) */ public void streamSome(Entity entity, Emitter emitter) { if (entity.getSubsegmentsLock().tryLock()) { try { //copy before traversal to avoid ConcurrentModificationExceptions new ArrayList<Subsegment>(entity.getSubsegments()).forEach( (subsegment) -> { if (subsegment.isInProgress() || !subsegment.getSubsegments().isEmpty()) { streamSome(subsegment, emitter); } else { emitter.sendSubsegment(subsegment); subsegment.setEmitted(true); entity.removeSubsegment(subsegment); } }); } finally { entity.getSubsegmentsLock().unlock(); } } } }
/** * {@inheritDoc} * * Performs a depth first search to find completed subsegment subtrees. Serializes these subsegments, streams them to the daemon, and removes them from their parents. * * @see StreamingStrategy#streamSome(Entity,Emitter) */ public void streamSome(Entity entity, Emitter emitter) { if (entity.getSubsegmentsLock().tryLock()) { try { //copy before traversal to avoid ConcurrentModificationExceptions new ArrayList<Subsegment>(entity.getSubsegments()).forEach( (subsegment) -> { if (subsegment.isInProgress() || !subsegment.getSubsegments().isEmpty()) { streamSome(subsegment, emitter); } else { emitter.sendSubsegment(subsegment); subsegment.setEmitted(true); entity.removeSubsegment(subsegment); } }); } finally { entity.getSubsegmentsLock().unlock(); } } } }