code: public void processTimeout(TimeoutEvent timeout) {
      ClientTransaction trans = timeout.getClientTransaction();
      if (trans == null) {
        return;
      }
  
      SipTransaction sip_trans = null;
      synchronized (respTransactions) {
        sip_trans = (SipTransaction) respTransactions.get(trans);
      }
  
      if (sip_trans == null) {
        return;
      }
  
      if (trans.getState().getValue() == TransactionState._TERMINATED) {
        synchronized (respTransactions) {
          respTransactions.remove(trans);
        }
      }
  
      // check for listener handling
      MessageListener listener = sip_trans.getClientListener();
      if (listener != null) {
        listener.processEvent(timeout);
        return;
      }
  
      // if no listener, use the default blocking mechanism
      synchronized (sip_trans.getBlock()) {
        sip_trans.getEvents().addLast(timeout);
        sip_trans.getBlock().notifyEvent();
      }
    }
docs: FOR INTERNAL USE ONLY. Not to be used by a test program.