docs: def _process_waiting_queue(self):
          ''' thread to processes the waiting queue
              fetches transfer spec
              then calls start transfer
              ensures that max ascp is not exceeded '''
          logger.info("Queue processing thread started")
          while not self.is_stop():
              self._processing_event.wait(3)
              self._processing_event.clear()
              if self.is_stop():
                  break
  
              while self.waiting_coordinator_count() > 0:
                  if self.is_stop():
                      break
                  _used_slots = self.tracked_coordinator_count(True)
                  _free_slots = self._config.ascp_max_concurrent - _used_slots
                  if _free_slots <= 0:
                      break
  
                  with self._lockw:
                      # check are there enough free slots
                      _req_slots = self._waiting_transfer_coordinators[0].session_count
                      if _req_slots > _free_slots:
                          break
                      _coordinator = self._waiting_transfer_coordinators.popleft()
                      self.add_transfer_coordinator(_coordinator)
  
                  if not _coordinator.set_transfer_spec():
                      self.remove_aspera_coordinator(_coordinator)
                  else:
                      logger.info("ASCP process queue - Max(%d) InUse(%d) Free(%d) New(%d)" %
                                  (self._config.ascp_max_concurrent,
                                   _used_slots,
                                   _free_slots,
                                   _req_slots))
                      _coordinator.start_transfer()
  
          logger.info("Queue processing thread stopped")
          self._processing_stopped_event.set()