Пример #1
0
    def _schedule_callback(prev, next):
        '''
        Called when a context is stopped or a new context is made runnable.
        '''
        try:
            if not prev and not next:
                return

            if next:
                register_tasklet_info(next)

                # Ok, making next runnable: set the tracing facility in it.
                debugger = GetGlobalDebugger()
                if debugger is not None and next.frame:
                    if hasattr(next.frame, 'f_trace'):
                        next.frame.f_trace = debugger.trace_dispatch
                debugger = None

            if prev:
                register_tasklet_info(prev)

            try:
                for tasklet_ref, tasklet_info in list(_weak_tasklet_registered_to_info.items()):  # Make sure it's a copy!
                    tasklet = tasklet_ref()
                    if tasklet is None or not tasklet.alive:
                        # Garbage-collected already!
                        try:
                            del _weak_tasklet_registered_to_info[tasklet_ref]
                        except KeyError:
                            pass
                        if tasklet_info.frame_id is not None:
                            removeCustomFrame(tasklet_info.frame_id)
                    else:
                        if tasklet.paused or tasklet.blocked or tasklet.scheduled:
                            if tasklet.frame and tasklet.frame.f_back:
                                f_back = tasklet.frame.f_back
                                _filename, base = GetFilenameAndBase(f_back)
                                is_file_to_ignore = DictContains(DONT_TRACE, base)
                                if not is_file_to_ignore:
                                    if tasklet_info.frame_id is None:
                                        tasklet_info.frame_id = addCustomFrame(f_back, tasklet_info.tasklet_name, tasklet.thread_id)
                                    else:
                                        updateCustomFrame(tasklet_info.frame_id, f_back, tasklet.thread_id)

                        elif tasklet.is_current:
                            if tasklet_info.frame_id is not None:
                                # Remove info about stackless suspended when it starts to run.
                                removeCustomFrame(tasklet_info.frame_id)
                                tasklet_info.frame_id = None

            finally:
                tasklet = None
                tasklet_info = None
                f_back = None

        except:
            import traceback;traceback.print_exc()

        if _application_set_schedule_callback is not None:
            return _application_set_schedule_callback(prev, next)
Пример #2
0
def _schedule_callback(prev, next):
    '''
    Called when a context is stopped or a new context is made runnable.
    '''
    try:
        if not prev and not next:
            return
        
        if not prev:
            # Ok, making next runnable: set the tracing facility in it.
            debugger = GetGlobalDebugger()
            if debugger is not None:
                next.frame.f_trace = debugger.trace_dispatch
            
        elif not next:
            pass
        
        else:
            # Suspending prev and resuming next
            #print'changing', prev, next  
            frameId = id_to_tasklet_frame.get(id(prev))
            if frameId is not None:
                if prev.frame is not None:
                    replaceCustomFrame(frameId, prev.frame.f_back)
                else:
                    removeCustomFrame(frameId)

            #Check: next.frame.f_trace:
    except:
        import traceback;traceback.print_exc()
        
    if _application_set_schedule_callback is not None:
        return _application_set_schedule_callback(prev, next)
Пример #3
0
def _schedule_callback(prev, next):
    '''
    Called when a context is stopped or a new context is made runnable.
    '''
    try:
        if not prev and not next:
            return

        if not prev:
            # Ok, making next runnable: set the tracing facility in it.
            debugger = GetGlobalDebugger()
            if debugger is not None:
                next.frame.f_trace = debugger.trace_dispatch

        elif not next:
            pass

        else:
            # Suspending prev and resuming next
            #print'changing', prev, next
            frameId = id_to_tasklet_frame.get(id(prev))
            if frameId is not None:
                if prev.frame is not None:
                    replaceCustomFrame(frameId, prev.frame.f_back)
                else:
                    removeCustomFrame(frameId)

            #Check: next.frame.f_trace:
    except:
        import traceback
        traceback.print_exc()

    if _application_set_schedule_callback is not None:
        return _application_set_schedule_callback(prev, next)
Пример #4
0
def run(*args, **kwargs):
    debugger = GetGlobalDebugger()
    if debugger is not None:
        SetTrace(debugger.trace_dispatch)
        
    f_back = sys._getframe().f_back
    frameId = addCustomFrame(f_back, 'Main Tasklet Run')
    tasklet_id = id(f_back)
    id_to_tasklet_frame[tasklet_id] = frameId
    try:
        return _original_run(*args, **kwargs)
    finally:
        removeCustomFrame(frameId)
        del id_to_tasklet_frame[tasklet_id]
Пример #5
0
def run(*args, **kwargs):
    debugger = GetGlobalDebugger()
    if debugger is not None:
        SetTrace(debugger.trace_dispatch)

    f_back = sys._getframe().f_back
    frameId = addCustomFrame(f_back, 'Main Tasklet Run')
    tasklet_id = id(f_back)
    id_to_tasklet_frame[tasklet_id] = frameId
    try:
        return _original_run(*args, **kwargs)
    finally:
        removeCustomFrame(frameId)
        del id_to_tasklet_frame[tasklet_id]
Пример #6
0
 def new_f(old_f, args, kwargs):
     debugger = GetGlobalDebugger()
     if debugger is not None:
         SetTrace(debugger.trace_dispatch)
         
     frameId = addCustomFrame(caller_frame, 'Tasklet')
     tasklet_id = id(self)
     id_to_tasklet_frame[tasklet_id] = frameId
     try:
         # Note: if the debugger appears in the line below, it means that a tasklet was created
         # but it's still not running.
 
         # Hover old_f to see the stackless being created and *args and **kwargs to see its parameters.
         old_f(*args, **kwargs)
     finally:
         removeCustomFrame(frameId)
         del id_to_tasklet_frame[tasklet_id]
Пример #7
0
    def new_f(old_f, args, kwargs):
        debugger = GetGlobalDebugger()
        if debugger is not None:
            SetTrace(debugger.trace_dispatch)

        frameId = addCustomFrame(caller_frame, 'Tasklet')
        tasklet_id = id(self)
        id_to_tasklet_frame[tasklet_id] = frameId
        try:
            # Note: if the debugger appears in the line below, it means that a tasklet was created
            # but it's still not running.

            # Hover old_f to see the stackless being created and *args and **kwargs to see its parameters.
            old_f(*args, **kwargs)
        finally:
            removeCustomFrame(frameId)
            del id_to_tasklet_frame[tasklet_id]
Пример #8
0
def _schedule_callback(prev, next):
    '''
    Called when a context is stopped or a new context is made runnable.
    '''
    try:
        if not prev and not next:
            return

        current_frame = sys._getframe()

        if next:
            register_tasklet_info(next)

            # Ok, making next runnable: set the tracing facility in it.
            debugger = GetGlobalDebugger()
            if debugger is not None:
                next.trace_function = debugger.trace_dispatch
                frame = next.frame
                if frame is current_frame:
                    frame = frame.f_back
                if hasattr(frame, 'f_trace'):  # Note: can be None (but hasattr should cover for that too).
                    frame.f_trace = debugger.trace_dispatch

            debugger = None

        if prev:
            register_tasklet_info(prev)

        try:
            for tasklet_ref, tasklet_info in list(_weak_tasklet_registered_to_info.items()):  # Make sure it's a copy!
                tasklet = tasklet_ref()
                if tasklet is None or not tasklet.alive:
                    # Garbage-collected already!
                    try:
                        del _weak_tasklet_registered_to_info[tasklet_ref]
                    except KeyError:
                        pass
                    if tasklet_info.frame_id is not None:
                        removeCustomFrame(tasklet_info.frame_id)
                else:
                    is_running = stackless.get_thread_info(tasklet.thread_id)[1] is tasklet
                    if tasklet is prev or (tasklet is not next and not is_running):
                        # the tasklet won't run after this scheduler action:
                        # - the tasklet is the previous tasklet
                        # - it is not the next tasklet and it is not an already running tasklet
                        frame = tasklet.frame
                        if frame is current_frame:
                            frame = frame.f_back
                        if frame is not None:
                            _filename, base = GetFilenameAndBase(frame)
                            # print >>sys.stderr, "SchedCB: %r, %d, '%s', '%s'" % (tasklet, frame.f_lineno, _filename, base)
                            is_file_to_ignore = DictContains(DONT_TRACE, base)
                            if not is_file_to_ignore:
                                tasklet_info.update_name()
                                if tasklet_info.frame_id is None:
                                    tasklet_info.frame_id = addCustomFrame(frame, tasklet_info.tasklet_name, tasklet.thread_id)
                                else:
                                    updateCustomFrame(tasklet_info.frame_id, frame, tasklet.thread_id, name=tasklet_info.tasklet_name)

                    elif tasklet is next or is_running:
                        if tasklet_info.frame_id is not None:
                            # Remove info about stackless suspended when it starts to run.
                            removeCustomFrame(tasklet_info.frame_id)
                            tasklet_info.frame_id = None


        finally:
            tasklet = None
            tasklet_info = None
            frame = None

    except:
        import traceback;traceback.print_exc()

    if _application_set_schedule_callback is not None:
        return _application_set_schedule_callback(prev, next)