tables, however, is now provided via a thread-mutex.
generic.scm:104: (without-interrupts
+ Caller: set-generic-procedure-generator!
generic.scm:132: (without-interrupts
+ Caller: %purge-generic-procedure-cache!
generic.scm:277: (without-interrupts
+ Caller: compute-method-and-store
+
+ OK. Used to avoid inopportune aborts. Serial access to
+ particular generic functions is the responsibility of the
+ luser. Serial access to the generic-procedure-records table
+ is now provided via a thread-mutex.
global.scm:36: get-interrupt-enables set-interrupt-enables! with-interrupt-mask
global.scm:129: (set-interrupt-enables! (fix:and limit-mask (get-interrupt-enables))))
(new-cache (procedure-arity-min arity)))))
(let ((generic (compute-apply-generic record)))
(set-generic-record/procedure! record generic)
- (eqht/put! generic-procedure-records generic record)
+ (with-thread-mutex-locked generic-procedure-records-mutex
+ (lambda ()
+ (eqht/put! generic-procedure-records generic record)))
generic))))
(define-structure (generic-record
procedure)
(define (generic-procedure? object)
- (if (eqht/get generic-procedure-records object #f) #t #f))
+ (with-thread-mutex-locked generic-procedure-records-mutex
+ (lambda ()
+ (if (eqht/get generic-procedure-records object #f) #t #f))))
(define (generic-record/arity record)
(make-procedure-arity (generic-record/arity-min record)
(lambda (generic record)
(%purge-generic-procedure-cache! generic record filter)))))
(if (eq? 'ALL-PROCEDURES generic)
- (eqht/for-each generic-procedure-records operator)
+ (with-thread-mutex-locked generic-procedure-records-mutex
+ (lambda ()
+ (eqht/for-each generic-procedure-records operator)))
(operator
generic
(guarantee-generic-procedure generic
(lambda (tags) (filter generic tags)))))))
(define (guarantee-generic-procedure generic caller)
- (or (eqht/get generic-procedure-records generic #f)
+ (or (with-thread-mutex-locked generic-procedure-records-mutex
+ (lambda ()
+ (eqht/get generic-procedure-records generic #f)))
(error:wrong-type-argument generic "generic procedure" caller)))
(define (guarantee-generator generator caller)
(define standard-generic-procedure-tag)
(define generic-procedure-records)
+(define generic-procedure-records-mutex)
(define built-in-tags)
(define microcode-type-tag-table)
(define microcode-type-method-table)
(set! standard-generic-procedure-tag
(make-dispatch-tag 'STANDARD-GENERIC-PROCEDURE))
(set! generic-procedure-records (make-eqht))
+ (set! generic-procedure-records-mutex (make-thread-mutex))
;; Initialize the built-in tag tables.
(set! built-in-tags '())
(vector-ref microcode-type-tag-table code)))
(vector-set! microcode-type-tag-table code #f)))))
(define-integrable (maybe-generic object default-tag)
- (let ((record (eqht/get generic-procedure-records object #f)))
+ (let ((record (with-thread-mutex-locked generic-procedure-records-mutex
+ (lambda ()
+ (eqht/get generic-procedure-records object #f)))))
(if record
(generic-record/tag record)
default-tag)))