1 /* The kernel call implemented in this file:
4 * The parameters for this kernel call are:
5 * m2_l1: ALRM_EXP_TIME (alarm's expiration time)
6 * m2_i2: ALRM_ABS_TIME (expiration time is absolute?)
7 * m2_l1: ALRM_TIME_LEFT (return seconds left of previous)
10 #include "../system.h"
12 #include <minix/endpoint.h>
16 FORWARD
_PROTOTYPE( void cause_alarm
, (timer_t
*tp
) );
18 /*===========================================================================*
20 *===========================================================================*/
21 PUBLIC
int do_setalarm(m_ptr
)
22 message
*m_ptr
; /* pointer to request message */
24 /* A process requests a synchronous alarm, or wants to cancel its alarm. */
25 register struct proc
*rp
; /* pointer to requesting process */
26 long exp_time
; /* expiration time for this alarm */
27 int use_abs_time
; /* use absolute or relative time */
28 timer_t
*tp
; /* the process' timer structure */
29 clock_t uptime
; /* placeholder for current uptime */
31 /* Extract shared parameters from the request message. */
32 exp_time
= m_ptr
->ALRM_EXP_TIME
; /* alarm's expiration time */
33 use_abs_time
= m_ptr
->ALRM_ABS_TIME
; /* flag for absolute time */
34 rp
= proc_addr(who_p
);
35 if (! (priv(rp
)->s_flags
& SYS_PROC
)) return(EPERM
);
37 /* Get the timer structure and set the parameters for this alarm. */
38 tp
= &(priv(rp
)->s_alarm_timer
);
39 tmr_arg(tp
)->ta_int
= m_ptr
->m_source
;
40 tp
->tmr_func
= cause_alarm
;
42 /* Return the ticks left on the previous alarm. */
43 uptime
= get_uptime();
44 if ((tp
->tmr_exp_time
!= TMR_NEVER
) && (uptime
< tp
->tmr_exp_time
) ) {
45 m_ptr
->ALRM_TIME_LEFT
= (tp
->tmr_exp_time
- uptime
);
47 m_ptr
->ALRM_TIME_LEFT
= 0;
50 /* Finally, (re)set the timer depending on the expiration time. */
54 tp
->tmr_exp_time
= (use_abs_time
) ? exp_time
: exp_time
+ get_uptime();
55 set_timer(tp
, tp
->tmr_exp_time
, tp
->tmr_func
);
60 /*===========================================================================*
62 *===========================================================================*/
63 PRIVATE
void cause_alarm(tp
)
66 /* Routine called if a timer goes off and the process requested a synchronous
67 * alarm. The process number is stored in timer argument 'ta_int'. Notify that
68 * process with a notification message from CLOCK.
70 int proc_nr_e
= tmr_arg(tp
)->ta_int
; /* get process number */
71 lock_notify(CLOCK
, proc_nr_e
); /* notify process */
74 #endif /* USE_SETALARM */