public void runIt(Pipe pipe) {

      HsmFlushSchedulable s;
      Event event;
      boolean done = false;
      boolean initDone = false;
      _log.info(_printoutName + ": Worker event loop started for " + _schedulerName);

      while ((!Thread.interrupted()) && (!done)) {

        try {
          event = pipe.pop();
        } catch (InterruptedException e) {
          break;
        }
        synchronized (this) {
          s = _scheduler;
          if (s == null) {
            break;
          }
        }

        try {
          if ((!initDone)
              && _poolCollector.isPoolSetupReady()
              && _poolCollector.isPoolConfigDone()) {
            s.init();
            initDone = true;
            _poolCollector.queryAllPoolModes();
          }

          if (!initDone) {
            continue;
          }

          switch (event.type) {
            case Event.FLUSHING_DONE:
              HFCFlushInfo info = (HFCFlushInfo) event.args[0];
              s.flushingDone(
                  info._pool._poolName,
                  info._flushInfo.getStorageClass() + "@" + info._flushInfo.getHsm(),
                  info);
              break;

            case Event.POOL_FLUSH_INFO_UPDATED:
              {
                HFCPool pool = (HFCPool) event.args[0];
                s.poolFlushInfoUpdated(pool._poolName, pool);
              }
              break;
            case Event.POOL_IO_MODE_UPDATED:
              {
                HFCPool pool = (HFCPool) event.args[0];
                s.poolIoModeUpdated(pool._poolName, pool);
              }
              break;

            case Event.CONFIGURED_POOL_ADDED:
              {
                String poolName = (String) event.args[0];
                s.configuredPoolAdded(poolName);
              }
              break;

            case Event.CONFIGURED_POOL_REMOVED:
              {
                String poolName = (String) event.args[0];
                s.configuredPoolRemoved(poolName);
              }
              break;

            case Event.PROPERTIES_UPDATED:
              {
                Map<String, Object> properties = (Map<String, Object>) event.args[0];
                s.propertiesUpdated(properties);
                synchronized (_propertyLock) {
                  _propertiesUpdated = System.currentTimeMillis();
                  _properties = properties;
                }
              }
              break;

            case Event.POOL_SETUP_UPDATED:
              s.poolSetupUpdated();
              break;

            case Event.CALL_DRIVER:
              Args args = (Args) event.args[0];
              s.command(args);
              break;

            case Event.TIMER:
              s.timer();
              break;

            case Event.RESET:
              s.reset();
              break;

            case Event.UNLOAD:
              done = true;
              break;
          }
        } catch (Throwable t) {
          _log.warn(_printoutName + ": Exception reported by " + event.type + " : " + t, t);
        }
      }
      _log.info(_printoutName + ": Worker event loop stopped");
      _log.info(_printoutName + ": Preparing unload");

      synchronized (this) {
        if (_scheduler == null) {
          return;
        }

        try {
          _scheduler.prepareUnload();
        } catch (Throwable t) {
          _log.warn(_printoutName + ": Exception in prepareUnload " + t, t);
        }

        _scheduler = null;
        _worker = null;
        _initDone = false;
      }
    }