diff options
author | bde <bde@FreeBSD.org> | 1995-05-11 07:44:40 +0000 |
---|---|---|
committer | bde <bde@FreeBSD.org> | 1995-05-11 07:44:40 +0000 |
commit | ef98a885661c3d2f2fe8570c56dba5723d570c13 (patch) | |
tree | 0d5164dc358e5c6acd11b945b1b53af7244beb76 /sys/i386/isa | |
parent | 561eb80e564511caf11e035642fba1a429106466 (diff) | |
download | FreeBSD-src-ef98a885661c3d2f2fe8570c56dba5723d570c13.zip FreeBSD-src-ef98a885661c3d2f2fe8570c56dba5723d570c13.tar.gz |
Add variable `idelayed' and macros setdelayed() and schedsofttty()
to access it. setdelayed() actually ORs the bits in `idelayed' into
`ipending' and clears `idelayed'.
Call setdelayed() every (normal) clock tick to convert delayed
interrupts into pending ones.
Drivers can set bits in `idelayed' at any time to schedule an interrupt
at the next clock tick. This is more efficient than calling timeout().
Currently only software interrupts can be scheduled.
Diffstat (limited to 'sys/i386/isa')
-rw-r--r-- | sys/i386/isa/clock.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/sys/i386/isa/clock.c b/sys/i386/isa/clock.c index 2676332..196d34c 100644 --- a/sys/i386/isa/clock.c +++ b/sys/i386/isa/clock.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.31 1995/01/19 22:05:27 ats Exp $ + * $Id: clock.c,v 1.32 1995/03/16 18:11:58 bde Exp $ */ /* @@ -92,6 +92,7 @@ int adjkerntz = 0; /* offset from CMOS clock */ int disable_rtc_set = 0; /* disable resettodr() if != 0 */ +u_int idelayed; #ifdef I586_CPU int pentium_mhz; #endif @@ -124,6 +125,7 @@ void clkintr(struct clockframe frame) { hardclock(&frame); + setdelayed(); } #else void @@ -132,15 +134,18 @@ clkintr(struct clockframe frame) timer_func(&frame); switch (timer0_state) { case 0: + setdelayed(); break; case 1: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { hardclock(&frame); + setdelayed(); timer0_prescaler_count -= hardclock_max_count; } break; case 2: + setdelayed(); timer0_max_count = TIMER_DIV(new_rate); timer0_overflow_threshold = timer0_max_count - TIMER0_LATCH_COUNT; @@ -157,6 +162,7 @@ clkintr(struct clockframe frame) if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { hardclock(&frame); + setdelayed(); timer0_max_count = hardclock_max_count; timer0_overflow_threshold = timer0_max_count - TIMER0_LATCH_COUNT; |