Beispiel #1
0
    def schedule(cls, schedule_time=0, idle_sleep=True):
        """
        Service mainloop
        :param schedule_time: specific schedule time, in seconds, if less than or equal to 0, schedule or return immediately.
        :param idle_sleep: at one schedule operation, if service check has idle time, will sleep if idle_sleep set to True, otherwise not sleep.
        """
        if cls._scheduling:
            raise llbc.error('Service in scheduling, not allow to reschedule')
        cls._scheduling = True

        svcs = cls._svcs_list
        schedule_interval = 1.0 / cls.MAX_FPS
        svc_mainloop = llbc.inl.ServiceMainLoop
        update_timers = llbc.inl.PyTimerUpdateAllTimers
        inst_errhooker = llbc.inl.InstallErrHooker
        uninst_errhooker = llbc.inl.UninstallErrHooker
        clear_hookederrors = llbc.inl.ClearHookedErrors

        try:
            inst_errhooker()
            cls._procwilldelsvcs()

            if schedule_time > 0:
                schedule_beg = _pyllbc_time()

            while True:
                if idle_sleep:
                    scheduleonce_beg = _pyllbc_time()

                clear_hookederrors()
                try:
                    for svc in svcs:
                        if not svc._started:
                            continue

                        svc_beg = _pyllbc_time()
                        if svc_beg - svc._last_schedule_time >= svc._frameinterval:
                            cobj = svc._c_obj
                            try:
                                svc_mainloop(cobj)
                            except Exception, e:
                                frame_exc_handler = cls._frame_exc_handler
                                if frame_exc_handler is not None:
                                    tb = _sys.exc_info()[2]
                                    frame_exc_handler(svc, tb, e)
                                else:
                                    raise
                            finally:
                                svc._last_schedule_time = svc_beg

                        if cls._procpendingdeschedule():
                            return

                    update_timers()
                    if cls._procpendingdeschedule():
                        return
Beispiel #2
0
    def schedule(cls):
        """
        Service mainloop
        """
        if cls._scheduling:
            raise llbc.error('Service in scheduling, not allow to reschedule')
        cls._scheduling = True

        svcs = cls._svcs_list
        schedule_interval = 1.0 / cls.MAX_FPS
        svc_mainloop = llbc.inl.ServiceMainLoop
        update_timers = llbc.inl.PyTimerUpdateAllTimers
        inst_errhooker = llbc.inl.InstallErrHooker
        uninst_errhooker = llbc.inl.UninstallErrHooker
        clear_hookederrors = llbc.inl.ClearHookedErrors

        try:
            inst_errhooker()
            cls._procwilldelsvcs()
            while True:
                clear_hookederrors()
                schedule_beg = _pyllbc_time()
                try:
                    for svc in svcs:
                        if not svc._started:
                            continue
    
                        svc_beg = _pyllbc_time()
                        if svc_beg - svc._last_schedule_time >= svc._frameinterval:
                            cobj = svc._c_obj
                            try:
                                svc_mainloop(cobj)
                            except Exception, e:
                                frame_exc_handler = cls._frame_exc_handler
                                if frame_exc_handler is not None:
                                    tb = _sys.exc_info()[2]
                                    frame_exc_handler(svc, tb, e)
                                else:
                                    raise
                            finally:
                                svc._last_schedule_time = svc_beg

                        if cls._procpendingdeschedule():
                            return
                        
                    update_timers()
                    if cls._procpendingdeschedule():
                        return
Beispiel #3
0
                            return

                    update_timers()
                    if cls._procpendingdeschedule():
                        return
                except Exception, e:
                    frame_exc_handler = cls._frame_exc_handler
                    if frame_exc_handler is not None:
                        tb = _sys.exc_info()[2]
                        frame_exc_handler(None, tb, e)
                    else:
                        raise
                finally:
                    cls._procwilldelsvcs()

                now = _pyllbc_time()
                if schedule_time > 0:
                    if now - schedule_beg >= schedule_time:
                        break

                if idle_sleep:
                    elapsed = now - scheduleonce_beg
                    if elapsed < 0:
                        continue
                    elif elapsed < schedule_interval:
                        _pyllbc_sleep(schedule_interval - elapsed)
        except BaseException, e:
            raise
        finally:
            uninst_errhooker()
            cls._scheduling = False
Beispiel #4
0
                            return
                        
                    update_timers()
                    if cls._procpendingdeschedule():
                        return
                except Exception, e:
                    frame_exc_handler = cls._frame_exc_handler
                    if frame_exc_handler is not None:
                        tb = _sys.exc_info()[2]
                        frame_exc_handler(None, tb, e)
                    else:
                        raise
                finally:
                    cls._procwilldelsvcs()
    
                elapsed = _pyllbc_time() - schedule_beg
                if elapsed < 0:
                    continue
                elif elapsed < schedule_interval:
                    _pyllbc_sleep(schedule_interval - elapsed)
        except BaseException, e:
            raise
        finally:
            uninst_errhooker()
            cls._scheduling = False

    @classmethod
    def deschedule(cls):
        if not cls._scheduling:
            return
        elif cls._descheduling: