BitBltSimulation>>copyLoop, read ahead memory failure.
John M McIntosh
johnmci at smalltalkconsulting.com
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.
Why
In BitBltSimulation>>copyLoop
{Lots of code, then }
"This last section, if used, requires masking of the destination
store..."
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.
destWord := (destMask bitAnd: mergeWord) bitOr:
(destWord bitAnd: destMask bitInvert32).
self dstLongAt: destIndex put: destWord.
destIndex := destIndex + hInc].
At
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 smalltalkconsulting.com>
Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com
========================================================================
===
More information about the Squeak-dev
mailing list
|