All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unidal.concurrent.internals.DefaultActorManager Maven / Gradle / Ivy

The newest version!
package org.unidal.concurrent.internals;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

import org.unidal.concurrent.Actor;
import org.unidal.concurrent.ActorContext;
import org.unidal.concurrent.ActorState;
import org.unidal.concurrent.StageStatus;
import org.unidal.lookup.annotation.Named;

@Named(type = ActorManager.class, instantiationStrategy = Named.PER_LOOKUP)
public class DefaultActorManager implements ActorManager {
   private List> m_actors = new ArrayList>();

   @Override
   public void addActor(Actor actor) {
      m_actors.add(actor);
   }

   private void distribute(ActorContext ctx, E event, AtomicBoolean enabled) throws InterruptedException {
      boolean success = ctx.addLast(event);

      while (!success && enabled.get()) {
         success = ctx.addLast(event);
      }
   }

   @Override
   public void distribute(E event, AtomicBoolean enabled) throws InterruptedException {
      int len = m_actors.size();

      for (int i = 0; i < len; i++) {
         Actor actor = m_actors.get(i);

         distribute(actor.getContext(), event, enabled);
      }
   }

   @Override
   public Actor getNextActor() {
      int len = m_actors.size();
      int max = 0;
      int index = -1;

      for (int i = 0; i < len; i++) {
         Actor actor = m_actors.get(i);
         ActorState state = actor.checkState();

         if (state != null && state.isRunnable()) {
            int available = actor.getContext().available();

            if (available > max) {
               max = available;
               index = i;
            }
         }
      }

      if (index >= 0) {
         return m_actors.get(index);
      } else {
         return null;
      }
   }

   @Override
   public void report(StageStatus status) {
      int len = m_actors.size();
      int[] counts = new int[len];

      for (int i = 0; i < len; i++) {
         Actor actor = m_actors.get(i);
         int count = actor.getContext().available();

         counts[i] = count;
      }

      if (status instanceof DefaultStageStatus) {
         ((DefaultStageStatus) status).setAvailableCounts(counts);
      }
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy