1 #include "sysutil.h" 2 #include <minix/timers.h> 3 4 /*===========================================================================* 5 * tickdelay * 6 *===========================================================================*/ 7 int tickdelay(clock_t ticks) 8 { 9 /* This function uses the synchronous alarm to delay for a while. This works 10 * even if a previous synchronous alarm was scheduled, because the remaining 11 * tick of the previous alarm are returned so that it can be rescheduled. 12 * Note however that a long tick_delay (longer than the remaining time of the 13 * previous) alarm will also delay the previous alarm. 14 */ 15 message m, m_alarm; 16 int s; 17 18 if (ticks <= 0) return OK; /* check for robustness */ 19 20 m.m_lsys_krn_sys_setalarm.exp_time = ticks; /* request message after ticks */ 21 m.m_lsys_krn_sys_setalarm.abs_time = 0; /* ticks are relative to now */ 22 s = _kernel_call(SYS_SETALARM, &m); 23 if (s != OK) return(s); 24 25 sef_receive(CLOCK,&m_alarm); /* await synchronous alarm */ 26 27 /* Check if we must reschedule the current alarm. */ 28 if (m.m_lsys_krn_sys_setalarm.time_left > 0 && 29 m.m_lsys_krn_sys_setalarm.time_left != TMR_NEVER) { 30 31 m.m_lsys_krn_sys_setalarm.exp_time = 32 m.m_lsys_krn_sys_setalarm.time_left - ticks; 33 34 if (m.m_lsys_krn_sys_setalarm.exp_time <= 0) 35 m.m_lsys_krn_sys_setalarm.exp_time = 1; 36 s = _kernel_call(SYS_SETALARM, &m); 37 } 38 39 return(s); 40 } 41