[gambit-list] Possible gc bug?

Bradley Lucier lucier at math.purdue.edu
Thu Jul 26 13:48:56 EDT 2007


Marc:

I've got a vector of length 262,144, each element of which is  
supposed to be a length 4 f64vector.

Well, I get a interrupt in my program when it hits one of these  
elements that is only of length 2.

Further investigation shows that only two elements of the whole  
vector have length 2:

> 1> (Array-for-each (lambda (p) (if (not (= (f64vector-length p) 4))  
> (pp p))) p)
> #f64(-.7079566418808501 -.2467907960478973)
> #f64(-.6672517342403924 -.31362141535348953)

This presents a very interesting debugging problem. Eventually, I  
changed the code storing an array to check whether all the f64vectors  
are the same length when the Array is built:

> (set! make-Array-base
>       (lambda (domain                  ;; an Interval
> 	       getter                  ;; (lambda (i_0 ... i_n-1) ...)  
> returns a value for (i_0,...,i_n-1) in (Array-domain a)
> 	       ;; Part of mutable arrays
> 	       setter                  ;; (lambda (v i_0 ... i_n-1) ...)  
> sets a value for (i_0,...,i_n-1) in (Array-domain a)
> 	       ;; Part of Fixed arrays
> 	       manipulators            ;; a Fixed-array-manipulator
> 	       body                    ;; the backing store for this array
> 	       indexer                 ;; see below
> 	       affine                  ;; A list that says in which  
> coordiantes the indexer is affine.
> 	       safe?                   ;; do we check whether bounds (in  
> getters and setters) and values (in setters) are valid
> 	       )
> 	(if (and body
> 		 (vector? body)
> 		 (< 0 (vector-length body))
> 		 (let ((element (vector-ref body 0)))
> 		   (and (f64vector? element)
> 			(let ((l (f64vector-length element)))
> 			  (not (every (lambda (p) (= (f64vector-length p) l)) (vector- 
> >list body)))))))
> 	    (error "Bzzt, thank you for playing")
> 	    (original-make-Array-base domain                  ;; an Interval
> 				      getter                  ;; (lambda (i_0 ... i_n-1) ...)  
> returns a value for (i_0,...,i_n-1) in (Array-domain a)
> 				      ;; Part of mutable arrays
> 				      setter                  ;; (lambda (v i_0 ... i_n-1) ...)  
> sets a value for (i_0,...,i_n-1) in (Array-domain a)
> 				      ;; Part of Fixed arrays
> 				      manipulators            ;; a Fixed-array-manipulator
> 				      body                    ;; the backing store for this array
> 				      indexer                 ;; see below
> 				      affine                  ;; A list that says in which  
> coordiantes the indexer is affine.
> 				      safe?                   ;; do we check whether bounds (in  
> getters and setters) and values (in setters) are valid
> 				      ))))

and everything passed.  The code works and is exercised:

> 1> (make-Array-base #f #f #f #f (vector '#f64(0.0) '#f64(0. 0.)) #f  
> #f #f)
> *** ERROR IN (console)@8.1 -- Bzzt, thank you for playing

I'm only human, so I want to blame the system rather than my own  
code.  It makes me wonder whether there is still a gc bug in beta 22,  
whether that bug has been fixed for the upcoming beta 23, etc.

Any suggestions?

Brad



More information about the Gambit-list mailing list