BitBltSimulation>>copyLoop, read ahead memory failure.

John M McIntosh johnmci at
Fri Oct 13 04:38:15 UTC 2006

After an afternoon of messing with the Cairo plugin and trying to get  
the PNG import/export routines to work, which are like 30 times  
faster than the smalltalk code,
I've decided we have a problem with BitBltSimulation>>copyLoop

The Cairo surface maps a 512x348 PNG image, it's 32bits and a row  
spans 2048 bytes.
So Cairo cheerfully allocates a chunk of memory 786,432 bytes to  
store the image data and we declare that a surface so bitblt has to  
copy in and our of our data area.
  I'll note the Virtual Memory system marks the page after my  
allocation of the data bytes as non-readable. Of course some times it  
is readable, and sometimes not but your milage may vary and certainly  
it depends on what the operating system thinks.

Then we invoke  foo displayOn: Display where foo is a form that maps  
to the Surface and we die.


In	 BitBltSimulation>>copyLoop

		{Lots of code, then }

		"This last section, if used, requires masking of the destination  
		nWords > 1 ifTrue:
			[destMask := mask2.
			thisWord := self srcLongAt: sourceIndex.  "pick up next word"
			sourceIndex := sourceIndex + hInc.
			skewWord := ((prevWord bitAnd: notSkewMask) bitShift: unskew)
							bitOr:  "32-bit rotate"
						((thisWord bitAnd: skewMask) bitShift: skew).
			destWord := self dstLongAt: destIndex.
			mergeWord := self mergeFn: (skewWord bitAnd: halftoneWord) with:  
			destWord := (destMask bitAnd: mergeWord) bitOr:
							(destWord bitAnd: destMask bitInvert32).
			self dstLongAt: destIndex put: destWord.
			destIndex := destIndex + hInc].


thisWord := self srcLongAt: sourceIndex.  "pick up next word"

we die on a virtual memory read error because the address is not  
readable, the virtual memory page is the
page after the 786,432 bytes that were allocated to store the cairo  
surface data.
I'll note i is 384
word is 512
preload is true
sourceIndex does point to the next word after the last word allocated  
for the surface.
sourceDelta is -4

Likely we're trying to preload the next word past the last word of  
our data area? Bad idea.

I'd rather not hack, so if someone has an idea how to fix that would  
be good.

John M. McIntosh <johnmci at>
Corporate Smalltalk Consulting Ltd.

More information about the Squeak-dev mailing list