On 24 August 2012 15:55, Jan van de Sandt <jvdsandt@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.
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@gmail.com> wrote:
On 24 August 2012 14:54, Jan van de Sandt <jvdsandt@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.