On Wed, Apr 25, 2018 at 11:07 PM, Ben Coman <b...@openinworld.com> wrote:
> > > On 25 April 2018 at 23:08, Serge Stinckwich <serge.stinckw...@gmail.com> > wrote: > >> I don't understand the default >> >> finalizeResourceData: handle >> handle isNull ifTrue: [ ^ self ]. >> handle free. >> handle beNull >> >> >> when handle is an ExternaData, free is defined as in ExternalStructure >> class as: >> >> free >> "Free the handle pointed to by the receiver" >> (handle ~~ nil and:[handle isExternalAddress]) ifTrue:[handle free]. >> handle := nil. >> > > Theorectical side thought. I wonder how threadsafe that code for #free > is? > Sending two messages between the ~~nil test and nil-assignment > seems to leave the door open for another thread to erroneously pass the > ~~nil test. > > IIUC, with an inlined #ifNotNil, the following might be safer (?) > > free > "Save handle so its nil assignment is inlined with its #ifNotNil: > test, eliminating possible thread change during message sends" > |savedhandle| > handle ifNotNil: [ > savedHandle := handle. > handle := nil. > savedHandle isExternalAddress ifTrue: [ savedHandle free]. > ]. > > You don't reply to my original question, Ben :-) I have another concern with UFFI ! When I call ffiCall: and the call returns an Opaque Object, an instance of this Opaque object is created, but apparently, basicNew is called instead of new on the class. What is the intention behind ? Thank you. -- Serge Stinckwich UMI UMMISCO 209 (SU/IRD/UY1) "Programs must be written for people to read, and only incidentally for machines to execute."http://www.doesnotunderstand.org/