-(defun store-fgen (fgen)
- (let ((old (lookup-fgen (fgen-test fgen))))
- (if old
- (setf (svref old 2) (fgen-generator fgen)
- (svref old 4) (or (svref old 4)
- (fgen-system fgen)))
- (setq *fgens* (nconc *fgens* (list fgen))))))
+;;; *FGENS* stores all the function generators we have so far. Each
+;;; element is a FGEN structure as implemented below. Don't ever touch this
+;;; list by hand, use LOOKUP-FGEN, and ENSURE-FGEN.
+(defvar *fgens* (make-hash-table :test #'equal :synchronized t))
+
+(defun ensure-fgen (test gensyms generator generator-lambda system)
+ (with-locked-hash-table (*fgens*)
+ (let ((old (lookup-fgen test)))
+ (cond (old
+ (setf (fgen-generator old) generator)
+ (unless (fgen-system old)
+ (setf (fgen-system old) system)))
+ (t
+ (setf (gethash test *fgens*)
+ (make-fgen gensyms generator generator-lambda system)))))))