<div dir="ltr">Hi Phil,<div class="gmail_extra"><br><div class="gmail_quote">On Thu, Aug 24, 2017 at 1:36 PM, Phil B <span dir="ltr"><<a href="mailto:pbpublist@gmail.com" target="_blank">pbpublist@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">I remember reading a while back that Spur added memory pinning and was curious if any Squeak packages has made use of it yet? (Looking for an example or two to get me started)</div></blockquote><div><br></div><div>The protocol i in Object, with the selectors pin, unpin and isPinned.  You can send any of these to any non-immediate object.  It is your responsibility to avoid calling unpin until external code no longer holds references to any pinned object.  It is your responsibility to arrange that the objects are still accessible within the system so that they are not GCed while external code holds onto them.  Pinning is orthogonal to GC.  It prevents the GC from moving objects, but does not prevent them from being GCed if no references to them exist in the Smalltalk system.  Note that also pinning may cause an object to move from newSpace to oldSpace, as objects are only pinball in oldSpace.  Pinning a new object causes it to become a copy of the object in oldSpace, so do not pass an object to external code and then pin it; it may move.</div><div><br></div><div> So the idea is</div><div>- create some objects you want to share with external code and pin them</div><div>- pass them to that external code through the FFI</div><div>- allow that external code to run (e.g spawn a thread in the external code, or make subsequent call though the FFI exercise the code)</div></div>- shut down the external code</div><div class="gmail_extra">- unpin your objects, or merely allow them to be GCed.<br><br>Alternatively external code can pin the objects it is given, providing it updates their location afterwards.  See pinObject:.</div><div class="gmail_extra"><br clear="all"><div>Note that you should use the interpreterProxy accessors firstIndexableField: and firstFixedField: to find out the start of the body of an object (pinned or otherwise).  byteSizeOf:, instanceSizeOf:, slotSizeOf: and stSizeOf: can all be used to find out various sizes.  See platforms/Cross/vm/sqVirtualMachine.h, which also provides pinObject: and unpinObject:.</div><div><br></div><div>Clearly some work is needed to add documentation in the right places.  LMK where you looked, where you would expect to find such information, etc.</div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><span style="font-size:small;border-collapse:separate"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></span></div></div></div>
</div></div>