docs: def wait_for_state_machine_finished(state_machine):
      """ wait for a state machine to finish its execution
  
      :param state_machine: the statemachine to synchronize with
      :return:
      """
      global _user_abort
  
      from rafcon.core.states.execution_state import ExecutionState
      if not isinstance(state_machine.root_state, ExecutionState):
          while len(state_machine.execution_histories[0]) < 1:
              time.sleep(0.1)
      else:
          time.sleep(0.5)
  
      while state_machine.root_state.state_execution_status is not StateExecutionStatus.INACTIVE:
          try:
              state_machine.root_state.concurrency_queue.get(timeout=1)
              # this check triggers if the state machine could not be stopped in the signal handler
              if _user_abort:
                  return
          except Empty:
              pass
          # no logger output here to make it easier for the parser
          logger.verbose("RAFCON live signal")