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) | ||||
|                        (error who "no exception label"))]) | ||||
|             (cons*  | ||||
|               `(addl 1 ,(R (make-disp (car rands) (cadr rands)))) | ||||
|               `(addl ,(D (caddr rands)) ,(R (make-disp (car rands) (cadr rands)))) | ||||
|               `(je ,l) | ||||
|               ac))] | ||||
|          [(fl:double->single) | ||||
|  |  | |||
|  | @ -2401,30 +2401,6 @@ | |||
|       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 | ||||
|   (module (wordsize) | ||||
|     (include "ikarus.config.ss")) | ||||
|  |  | |||
|  | @ -38,8 +38,8 @@ | |||
|     $incorrect-args-error-handler $multiple-values-error $debug | ||||
|     $underflow-misaligned-error top-level-value-error car-error | ||||
|     cdr-error fxadd1-error fxsub1-error cadr-error fx+-type-error | ||||
|     fx+-types-error fx+-overflow-error $do-event) | ||||
|   (import (except (ikarus) interrupt-handler) | ||||
|     fx+-types-error fx+-overflow-error $do-event engine-handler) | ||||
|   (import (except (ikarus) interrupt-handler engine-handler) | ||||
|           (only (ikarus system $interrupts) $interrupted? $unset-interrupted!)) | ||||
| 
 | ||||
|   (define interrupt-handler | ||||
|  | @ -57,6 +57,14 @@ | |||
|             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 | ||||
|     (lambda (x) | ||||
|       (die 'apply "not a procedure" x))) | ||||
|  | @ -128,7 +136,11 @@ | |||
|    | ||||
|   (define $do-event | ||||
|     (lambda () | ||||
|       (when ($interrupted?) | ||||
|         ($unset-interrupted!) | ||||
|         ((interrupt-handler))))) | ||||
|       (cond | ||||
|         [($interrupted?) | ||||
|          ($unset-interrupted!) | ||||
|          ((interrupt-handler))] | ||||
|         [else | ||||
|          ((engine-handler))]))) | ||||
| 
 | ||||
|   ) | ||||
|  |  | |||
|  | @ -1 +1 @@ | |||
| 1453 | ||||
| 1455 | ||||
|  |  | |||
|  | @ -372,6 +372,7 @@ | |||
|     [call/cf                                     i] | ||||
|     [print-error                                 i] | ||||
|     [interrupt-handler                           i] | ||||
|     [engine-handler                              i] | ||||
|     [assembler-output                            i] | ||||
|     [new-cafe                                    i] | ||||
|     [expand                                      i] | ||||
|  | @ -543,6 +544,7 @@ | |||
|     [$make-values-procedure                      $stack] | ||||
|     [$interrupted?                               $interrupts] | ||||
|     [$unset-interrupted!                         $interrupts] | ||||
|     [$swap-engine-counter!                       $interrupts] | ||||
|     [interrupted-condition?                      interrupts] | ||||
|     [make-interrupted-condition                  interrupts] | ||||
|     [$apply-nonprocedure-error-handler           ] | ||||
|  |  | |||
|  | @ -2026,7 +2026,16 @@ | |||
|   [(E)  | ||||
|    (begin | ||||
|      (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 | ||||
|   [(E)  | ||||
|  |  | |||
|  | @ -218,7 +218,7 @@ Notice how the bsd manpages have incorrect type for the handler. | |||
| #endif | ||||
| 
 | ||||
| void handler(int signo, siginfo_t* info, void* uap){ | ||||
|   the_pcb->engine_counter = -1; | ||||
|   the_pcb->engine_counter = fix(-1); | ||||
|   the_pcb->interrupted = 1; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Abdulaziz Ghuloum
						Abdulaziz Ghuloum