xref: /minix3/minix/lib/libsys/tickdelay.c (revision 433d6423c39e34ec4b79c950597bb2d236f886be)
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