private void validateTicksize(Instrument instrument, double price) {
    TickType ts = instrument.getTickscale();

    if (ts.canVerifyPrice()) {
      if (!ts.isValid(price)) {

        delim().append(INVALID_PRICE);

        ts.writeError(price, _err);
      }
    } else {
      ReusableString msg = TLC.instance().pop();
      msg.append(MISSING_TICK).append(instrument.getRIC());
      _log.warn(msg);
      TLC.instance().pushback(msg);
    }
  }
  @Override
  public void handleExecutionException(Exception ex) {
    final NonBlockingSession sess = _curSessW._session;

    if (_curMsg != null && sess != null) {
      _log.warn(
          "SessionThreadedDispatcher "
              + getComponentId()
              + ", msgSeqNum="
              + _curMsg.getMsgSeqNum()
              + ", sess="
              + sess.getComponentId()
              + " exception "
              + ex.getMessage());
    }

    flush(_curSessW);

    // some problem, possibly disconnect, poke controller to wake up anything waiting on controller
    // passive lock
    _ctl.statusChange(); // Mem barrier
  }