[Pharo-project] [NB] Problem with releasing a NBExternalObject

Jan van de Sandt jvdsandt at gmail.com
Fri Aug 24 16:52:52 CEST 2012


On Fri, Aug 24, 2012 at 4:29 PM, Igor Stasenko <siguctua at gmail.com> wrote:

> On 24 August 2012 15:55, Jan van de Sandt <jvdsandt at gmail.com> wrote:
> > Hello Igor,
> >
> > Thanks for the explanation. Closing via the class method now works fine!
> >
> > But I still notice that the #finalizeResourceData doesn't get called. The
> > instance is already gone because the #allInstances method returns an
> empty
> > collection. Strange ....
> >
> btw did you added a call to #registerAsExternalResource
> in instance initialization method somewhere (once you have initialized
> handle of course)?
> because of course, if you don't register it, a finalization will never
> be called.
>
>
Yes I did. If I inspect the registry instVar
of NBExternalResourceManager>>#soleInstance than there are a lot of items
present.


>
> > Jan.
> >
> > PS: I installed NB in a new 1.4 image this afternoon. Some tests failed
> > because the Integer>>#& method was missing. Probably is should be part of
> > the AsmJit-Extension package. After I added this method the tests worked
> > again.
> >
> >
> >
> > On Fri, Aug 24, 2012 at 3:38 PM, Igor Stasenko <siguctua at gmail.com>
> wrote:
> >>
> >> On 24 August 2012 14:54, Jan van de Sandt <jvdsandt at gmail.com> wrote:
> >> > Hello,
> >> >
> >> > I have a subclass of NBExternalObject to refer to an external object
> >> > (from
> >> > the ICU library). When I'm done with the object I need to close it.
> The
> >> > following instance method takes care of this:
> >> >
> >> > primClose
> >> > <primitive: #primitiveNativeCall module: #NativeBoostPlugin>
> >> > self nbCall: #( void ucal_close( ICUCalendarNB self ) )
> >> >
> >> >
> >> > This works fine. But now I want to make use of the
> >> > NBExternalResourceManager
> >> > so that external objects are closed automatically when they are no
> >> > longer
> >> > referenced. For this I have implemented the required instance method:
> >> >
> >> > resourceData
> >> >
> >> > ^ handle
> >> >
> >> >
> >> > And the class methods:
> >> >
> >> > finalizeResourceData: aHandle
> >> >
> >> > Transcript show: 'Closing ', aHandle printString ; cr.
> >> > aHandle isNull
> >> > ifFalse: [ self primClose: aHandle ]
> >> >
> >> >
> >> > and
> >> >
> >> > primClose: aHandle
> >> > <primitive: #primitiveNativeCall module: #NativeBoostPlugin>
> >> > ^ self nbCall: #( void ucal_close( void* aHandle ) )
> >> >
> >>
> >>
> >>
> >> > But now two things are going wrong:
> >> > - The #finalizeResourceData: doesn't seem to get called
> >>
> >> perhaps because you still got a strong references to that object
> >> somewhere?
> >>
> >> > - If I call the #primClose: directy with the handle as an argument my
> >> > Image
> >> > crashes.
> >> >
> >> Ok it looks like a typical mistake, (which i also do from time to time
> ;)
> >> ..
> >> by passing a pointer to value instead of value itself.
> >> Here, a handle is a variable-byte object, holding a value (4 bytes)
> >> so, if you pass it as argument of following type:
> >>
> >>  void* aHandle
> >>
> >> you will actually not pass the value of handle itself, but a pointer
> >> to a first byte in memory where that value held.
> >>
> >> To fix that try following:
> >>
> >>  resourceData
> >>    ^ handle value
> >>
> >> primClose: aHandleValue
> >>  <primitive: #primitiveNativeCall module: #NativeBoostPlugin>
> >>  ^ self nbCall: #( void ucal_close( uint aHandleValue ) )
> >>
> >>
> >> > Is the signature of the #nbCall: message wrong?
> >> >
> >> > Jan.
> >> >
> >> > PS: I'm using the latest NB-Cog-VM from
> >> > https://ci.lille.inria.fr/pharo/view/Cog/
> >> >
> >> >
> >> >
> >> >
> >>
> >>
> >>
> >> --
> >> Best regards,
> >> Igor Stasenko.
> >>
> >
>
>
>
> --
> Best regards,
> Igor Stasenko.
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gforge.inria.fr/pipermail/pharo-project/attachments/20120824/9b3b9edc/attachment.html>


More information about the Pharo-project mailing list