@@ -101,25 +101,45 @@ def from_seconds(cls, offset, interval):
101101
102102
103103class Timer :
104- def __init__ (self , clock = CLOCK_REALTIME , blocking = True ):
104+ def __init__ (self , clock = CLOCK_REALTIME , offset = 0 , interval = 0 , blocking = True ):
105105 self ._fd = timerfd_create (clock , (not blocking )* TFD_NONBLOCK )
106- if self ._fd < 0 :
107- e = get_errno ()
108- raise OSError ( e , errno . strerror ( e ))
106+ self ._offset = offset
107+ self . _interval = interval
108+ self . _started = False
109109
110110 def close (self ):
111111 os .close (self ._fd )
112112
113- def schedule (self , offset = 0 , interval = 0 ):
114- spec = itimerspec (it_value = timespec .from_seconds (offset ),
115- it_interval = timespec .from_seconds (interval ))
113+ @property
114+ def offset (self ):
115+ return self ._offset
116+
117+ @offset .setter
118+ def offset (self , new_offset ):
119+ self ._offset = new_offset
120+ if self ._started :
121+ self ._schedule ()
122+
123+ @property
124+ def interval (self ):
125+ return self ._interval
126+
127+ @interval .setter
128+ def interval (self , new_interval ):
129+ self ._interval = new_interval
130+ if self ._started :
131+ self ._schedule ()
132+
133+ def start (self ):
134+ if self ._offset == 0 and self ._interval == 0 :
135+ raise ValueError ("timer will not fire because offset and interval are both zero" )
116136
117- print (spec )
137+ self ._schedule (self ._offset or self ._interval , self ._interval )
138+ self ._started = True
118139
119- status = timerfd_settime (self ._fd , 0 , byref (spec ), None )
120- if status < 0 :
121- e = get_errno ()
122- raise OSError (e , errno .strerror (e ))
140+ def stop (self ):
141+ self ._schedule (0 , 0 )
142+ self ._started = False
123143
124144 def wait (self ):
125145 try :
@@ -130,4 +150,8 @@ def wait(self):
130150 return 0
131151 else :
132152 raise e
133-
153+
154+ def _schedule (self , offset , interval ):
155+ spec = itimerspec .from_seconds (offset , interval )
156+ timerfd_settime (self ._fd , 0 , byref (spec ), None )
157+
0 commit comments