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
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
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
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: