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/

Reply via email to