(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
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
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
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()
def cleanup ( self ) : 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 ( )