docs: def cleanup(self):
          """
          Remove those pending exits if:
          a) they are the return exits of non-returning SimProcedures
          b) they are the return exits of non-returning syscalls
          b) they are the return exits of non-returning functions
  
          :return: None
          """
  
          pending_exits_to_remove = defaultdict(list)
  
          for func_addr in self._updated_functions:
              if func_addr not in self._jobs:
                  continue
              jobs = self._jobs[func_addr]
              for i, pe in enumerate(jobs):
                  if pe.returning_source is None:
                      # The original call failed. This pending exit must be followed.
                      continue
  
                  func = self._functions.function(pe.returning_source)
                  if func is None:
                      # Why does it happen?
                      l.warning("An expected function at %s is not found. Please report it to Fish.",
                                pe.returning_source if pe.returning_source is not None else 'None')
                      continue
  
                  if func.returning is False:
                      # Oops, it's not returning
                      # Remove this pending exit
                      pending_exits_to_remove[pe.returning_source].append(i)
  
          for func_addr, indices in pending_exits_to_remove.items():
              jobs = self._jobs[func_addr]
              for index in reversed(indices):
                  job = jobs[index]
                  self._deregister_job_callback(job.func_addr, job)
                  del jobs[index]
                  self._job_count -= 1
              if not jobs:
                  del self._jobs[func_addr]
  
          self.clear_updated_functions()