Hi Ben,
It's a super bad idea to copy an ExternalAddress.
It's common knowledge in C++ copy operator & copy constructors...

But it's not obvious to me that you'll have double freeing (unless you
explicitely free the pointer by yourself).
If you use gcallocate: then only the original is registered for magical
auto-deallocation at garbage collection...

What you will have is more somthing like dangling pointer: continue to use
pointer xa2->a1 when a1 was already freed.

FFI is great, it introduces the problem of C in Smalltalk, augmented with
the problems of wrapping C in Smalltalk.

2017-11-06 4:23 GMT+01:00 Ben Coman <b...@openinworld.com>:

> My current employment work hours and roster have severely curtailed the
> time I have hacking Pharo, so I've not dug enough to be sure of my
> observations a few months ago, and this is from memory, but I was starting
> to develop a suspicion about the uniqueness of ExternalAddress(s).
>
> A while ago, in order to fix some stability issues on Windows, a guard was
> added somewhere that slowed down some operations.  Looking into this and
> experimenting with removing the guard I seem to remember VM crashes due to
> a double-free() of an address, due to there being two ExternalAddresses
> holding the same external address.
>
> My intuition is that that somewhere an ExternalAddress(a1) pointing at a
> particular external resource address "xa1" was being copied, so we end up
> with ExternalAddress(a2) also pointing at "xa1", with and object b1 holding
> a1 and object b2 holding a2.  During finalization of b1, ExternalAddress a1
> free()d xa1, and a1 was flagged to avoid double-free()ing.  But that didn't
> help when b2 was finalized, since a2 had no indication that xa1 had been
> free()d.
>
> That is...
> b1-->a1-->xa1
> b2 := b1 copy.
> b2-->a2-->xa1
> b1 finalize a1 --> free(xa1)
> b2 finalize a2 --> free(xa1) --> General Protection Fault
>
> It was hard to follow this through and I didn't succeed in tracking down
> where such a copy might have been made, but the idea simmering in my mind
> since then is to propose that...
>
>     ExternalAddresses be unique in the image and behave like Symbols,
>     such that trying to copy one returns the identical object.
>
> The idea being that when b2 is finalized, a1 would notice that xa1 had
> already been free()d and raise a Smalltalk exception rather than a general
> protection fault.
> b1-->a1-->xa1
> b2 := b1 copy.
> b2-->a1-->xa1
>          ^^
> b1 finalize a1 --> free(xa1)
> b2 finalize a1 --> Smalltalk exception
>
>
> I write now in response to Stef since I vaguely remember it being Freetype
> related.  But I also remember the issue being FFI related and Freetype is a
> plugin not FFI.  So I'm not sure my memory is clear and perhaps I have the
> "wrong end of the stick" but anyway, rather than hold back longer because
> of that, perhaps this can stimulate some discussion and at least I learn
> something to clarify my understanding here.
>
> cheers -ben
>
>
> On Sat, Oct 28, 2017 at 4:48 PM, Stephane Ducasse <stepharo.s...@gmail.com>
> wrote:
> >
> > Hi all
> >
> > I'm and I guess many of you are fedup about the instability that the
> > FreeType plugin produces.
> >
> > So we need help because clement and esteban are fully booked.
> >
> > We have three options:
> >
> > - drop Freetype alltogether
> > - rewrite the plugin
> > - create a binding using raffaillac sketch
> >
> > Now we need help. Who is willing to help us?
> > Should we try to set up a bounty?
> >
> > Stef
>
>
>

Reply via email to