# -*-pyrex-*- # # $Id$ # # Timer selectors # # (c) 2005 Straylight/Edgeware # #----- Licensing notice ----------------------------------------------------- # # This file is part of the Python interface to mLib. # # mLib/Python is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # mLib/Python is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with mLib/Python; if not, write to the Free Software Foundation, # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. cdef double _tvtofloat(timeval *tv): return tv.tv_sec + (tv.tv_usec / 1000000) cdef void _floattotv(timeval *tv, double t): cdef double s, us us = modf(t, &s) tv.tv_sec = s tv.tv_usec = us * 1000000 cdef class SelTimer: cdef sel_timer t cdef int _activep cdef readonly double time cdef _timer def __new__(me, double when, timerproc = None, *hunoz, **hukairz): cdef timeval tv _floattotv(&tv, when) sel_addtimer(&_sel, &me.t, &tv, _timerfunc, me) me._activep = 1 me.time = when me._timer = _checkcallable(timerproc, 'timer proc') def __dealloc__(me): if me._activep: sel_rmtimer(&me.t) property activep: def __get__(me): return _tobool(me._activep) property timerproc: def __get__(me): return me._timer def __set__(me, proc): me._timer = _checkcallable(proc, 'timer proc') def __del__(me): me._timer = None def kill(me): if not me._activep: raise ValueError, 'already dead' sel_rmtimer(&me.t) me._dead() return me cdef _dead(me): me._activep = 0 me.dead() def dead(me): pass def timer(me, now): return _maybecall(me._timer, ()) cdef void _timerfunc(timeval *now, void *arg): cdef SelTimer st st = arg st._dead() st.timer(_tvtofloat(now)) #----- That's all, folks ----------------------------------------------------