[Vm-dev] Informing the VM that the display bits have changed via primitiveBeDisplay
Bert Freudenberg
bert at freudenbergs.de
Tue May 2 14:47:11 UTC 2017
On Tue, May 2, 2017 at 12:50 AM, Eliot Miranda <eliot.miranda at gmail.com>
wrote:
>
> Tim, John, Bert, et al,
>
> if you look at e.g. resizing code in the platforms/iOS code (in
> e.g. platforms/iOS//vm/OSX/sqSqueakOSXOpenGLView.m) the code accesses the
> display bits by looking up the display object installed via
> primitiveBeDisplay in the specialObjectsArray:
>
> - (void) performDraw: (CGRect)rect {
> sqInt form = interpreterProxy->displayObject(); // Form
>
> CGContextRef context = (CGContextRef)[[NSGraphicsContext
> currentContext] graphicsPort];
> CGContextSaveGState(context);
>
> int width = interpreterProxy->positive32BitValueOf(interpreterProxy->fetchPointerofObject(1,
> form));
> int height = interpreterProxy->positive32BitValueOf(interpreterProxy->fetchPointerofObject(2,
> form));
> sqInt formBits = interpreterProxy->fetchPointerofObject(0, form);
> // bits
> void* bits = (void*)interpreterProxy->firstIndexableField(formBits);
> // bits
> int bitSize = interpreterProxy->byteSizeOf(formBits);
> int bytePerRow = 4*width;
>
> This is really unsafe. If it gets called while the VM is compacting, or
> doing a become, then potentially boom!
>
> Storing the display in the specialObjectsArray stops it form being GCed,
> but it doesn't stop it moving around, and it doesn't stop a become altering
> the location of the objects surrounding it, etc.
>
> Surely a better approach is to inform the VM of the location, depth and
> extent of the bits via some ioSetDisplayBits function and then cacheing
> those values somewhere in the VM. Thoughts?
>
Wouldn't the display bits still be moved around during GC? Nothing the
image can do about that.
You could cache the values in the beDisplay primitive, but I don't see how
that would change anything.
The original VM was single-threaded so this was not an issue. Are you
trying to make the GC concurrent? I bet there are many many places that
would break ... Maybe you need to temporarily pin the involved objects?
- Bert -
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20170502/f8fcd593/attachment.html>
More information about the Vm-dev
mailing list