Added engine-handler parameter and a ($swap-engine-counter! <neg-fx>)
to (ikarus system $interrupts).
This commit is contained in:
parent
478719cf32
commit
d8cd4f0acf
|
@ -2650,7 +2650,7 @@
|
||||||
(let ([l (or (exception-label)
|
(let ([l (or (exception-label)
|
||||||
(error who "no exception label"))])
|
(error who "no exception label"))])
|
||||||
(cons*
|
(cons*
|
||||||
`(addl 1 ,(R (make-disp (car rands) (cadr rands))))
|
`(addl ,(D (caddr rands)) ,(R (make-disp (car rands) (cadr rands))))
|
||||||
`(je ,l)
|
`(je ,l)
|
||||||
ac))]
|
ac))]
|
||||||
[(fl:double->single)
|
[(fl:double->single)
|
||||||
|
|
|
@ -2401,30 +2401,6 @@
|
||||||
v)))
|
v)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(define (insert-engine-checks x)
|
|
||||||
(define (Tail x)
|
|
||||||
(make-seq
|
|
||||||
(make-interrupt-call
|
|
||||||
(make-primcall '$engine-check '())
|
|
||||||
(make-funcall (make-primref '$do-event) '()))
|
|
||||||
x))
|
|
||||||
(define (CaseExpr x)
|
|
||||||
(struct-case x
|
|
||||||
[(clambda-case info body)
|
|
||||||
(make-clambda-case info (Tail body))]))
|
|
||||||
(define (CodeExpr x)
|
|
||||||
(struct-case x
|
|
||||||
[(clambda L cases cp free name)
|
|
||||||
(make-clambda L (map CaseExpr cases) cp free name)]))
|
|
||||||
(define (CodesExpr x)
|
|
||||||
(struct-case x
|
|
||||||
[(codes list body)
|
|
||||||
(make-codes (map CodeExpr list) (Tail body))]))
|
|
||||||
(CodesExpr x))
|
|
||||||
|
|
||||||
|
|
||||||
(begin ;;; DEFINITIONS
|
(begin ;;; DEFINITIONS
|
||||||
(module (wordsize)
|
(module (wordsize)
|
||||||
(include "ikarus.config.ss"))
|
(include "ikarus.config.ss"))
|
||||||
|
|
|
@ -38,8 +38,8 @@
|
||||||
$incorrect-args-error-handler $multiple-values-error $debug
|
$incorrect-args-error-handler $multiple-values-error $debug
|
||||||
$underflow-misaligned-error top-level-value-error car-error
|
$underflow-misaligned-error top-level-value-error car-error
|
||||||
cdr-error fxadd1-error fxsub1-error cadr-error fx+-type-error
|
cdr-error fxadd1-error fxsub1-error cadr-error fx+-type-error
|
||||||
fx+-types-error fx+-overflow-error $do-event)
|
fx+-types-error fx+-overflow-error $do-event engine-handler)
|
||||||
(import (except (ikarus) interrupt-handler)
|
(import (except (ikarus) interrupt-handler engine-handler)
|
||||||
(only (ikarus system $interrupts) $interrupted? $unset-interrupted!))
|
(only (ikarus system $interrupts) $interrupted? $unset-interrupted!))
|
||||||
|
|
||||||
(define interrupt-handler
|
(define interrupt-handler
|
||||||
|
@ -57,6 +57,14 @@
|
||||||
x
|
x
|
||||||
(die 'interrupt-handler "not a procedure" x)))))
|
(die 'interrupt-handler "not a procedure" x)))))
|
||||||
|
|
||||||
|
(define engine-handler
|
||||||
|
(make-parameter
|
||||||
|
void
|
||||||
|
(lambda (x)
|
||||||
|
(if (procedure? x)
|
||||||
|
x
|
||||||
|
(die 'engine-handler "not a procedure" x)))))
|
||||||
|
|
||||||
(define $apply-nonprocedure-error-handler
|
(define $apply-nonprocedure-error-handler
|
||||||
(lambda (x)
|
(lambda (x)
|
||||||
(die 'apply "not a procedure" x)))
|
(die 'apply "not a procedure" x)))
|
||||||
|
@ -128,7 +136,11 @@
|
||||||
|
|
||||||
(define $do-event
|
(define $do-event
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(when ($interrupted?)
|
(cond
|
||||||
|
[($interrupted?)
|
||||||
($unset-interrupted!)
|
($unset-interrupted!)
|
||||||
((interrupt-handler)))))
|
((interrupt-handler))]
|
||||||
|
[else
|
||||||
|
((engine-handler))])))
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
1453
|
1455
|
||||||
|
|
|
@ -372,6 +372,7 @@
|
||||||
[call/cf i]
|
[call/cf i]
|
||||||
[print-error i]
|
[print-error i]
|
||||||
[interrupt-handler i]
|
[interrupt-handler i]
|
||||||
|
[engine-handler i]
|
||||||
[assembler-output i]
|
[assembler-output i]
|
||||||
[new-cafe i]
|
[new-cafe i]
|
||||||
[expand i]
|
[expand i]
|
||||||
|
@ -543,6 +544,7 @@
|
||||||
[$make-values-procedure $stack]
|
[$make-values-procedure $stack]
|
||||||
[$interrupted? $interrupts]
|
[$interrupted? $interrupts]
|
||||||
[$unset-interrupted! $interrupts]
|
[$unset-interrupted! $interrupts]
|
||||||
|
[$swap-engine-counter! $interrupts]
|
||||||
[interrupted-condition? interrupts]
|
[interrupted-condition? interrupts]
|
||||||
[make-interrupted-condition interrupts]
|
[make-interrupted-condition interrupts]
|
||||||
[$apply-nonprocedure-error-handler ]
|
[$apply-nonprocedure-error-handler ]
|
||||||
|
|
|
@ -2026,7 +2026,16 @@
|
||||||
[(E)
|
[(E)
|
||||||
(begin
|
(begin
|
||||||
(interrupt)
|
(interrupt)
|
||||||
(prm 'incr/zero? pcr (K pcb-engine-counter)))])
|
(prm 'incr/zero? pcr (K pcb-engine-counter)
|
||||||
|
(K (fxsll 1 fx-shift))))])
|
||||||
|
|
||||||
|
(define-primop $swap-engine-counter! unsafe
|
||||||
|
[(V x)
|
||||||
|
;;; FIXME: should be atomic swap instead of load and set!
|
||||||
|
(with-tmp ([x0 (T x)])
|
||||||
|
(with-tmp ([t (prm 'mref pcr (K pcb-engine-counter))])
|
||||||
|
(prm 'mset pcr (K pcb-engine-counter) x0)
|
||||||
|
t))])
|
||||||
|
|
||||||
(define-primop $stack-overflow-check unsafe
|
(define-primop $stack-overflow-check unsafe
|
||||||
[(E)
|
[(E)
|
||||||
|
|
|
@ -218,7 +218,7 @@ Notice how the bsd manpages have incorrect type for the handler.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void handler(int signo, siginfo_t* info, void* uap){
|
void handler(int signo, siginfo_t* info, void* uap){
|
||||||
the_pcb->engine_counter = -1;
|
the_pcb->engine_counter = fix(-1);
|
||||||
the_pcb->interrupted = 1;
|
the_pcb->interrupted = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue