Followup to this,

cleanupReferenceList() is never being called, I see the hidden class
created and the .cxx_destruct registered but it isn't invoked.  The problem
is that I don't see how object_dispose() get's called.  In the libobjc2
Test it's called in dealloc which would explain why the libobjc2 Test
works, but I don't see it invoked in gnustep-base anywhere.  Or for that
matter anywhere in anyone's trunk other than libobjc2's Test.h and
RuntimeTest.m.


On Fri, Dec 13, 2013 at 1:30 PM, Doug Warren <doug.war...@gmail.com> wrote:

> Works without objc_setAssociatedObject:
> E/Z2GameLog(14278): STDOUT: [----------] 1 test from
> objc_setAssociatedObject
> E/Z2GameLog(14278): STDOUT: [ RUN      ]
> objc_setAssociatedObject.AssociatedObjectsAreReleased
> E/Z2GameLog(14278): STDOUT: [       OK ]
> objc_setAssociatedObject.AssociatedObjectsAreReleased (1 ms)
> E/Z2GameLog(14278): STDOUT: [----------] 1 test from
> objc_setAssociatedObject (1 ms total)
>
> Code change:
>     @autoreleasepool {
>         associatedObjectTestAllocatedObject* object =
> [associatedObjectTestAllocatedObject new];
>
>         associatedObjectTestAssociatedObject *info =
> [[associatedObjectTestAssociatedObject new] autorelease];
>         // silence -Wunused-variable
>         [info description];
> //        objc_setAssociatedObject(object, &objc_setAssociatedObjectKey,
> info, OBJC_ASSOCIATION_RETAIN);
>
>          [object release];
>     }
>
> The reason why I had suggested that was your original post that NSString
> wouldn't be an appropriate target, got me thinking that perhaps there was
> an optimization at some point made in the runtime to NSObject that would
> similarly cause it to not work.
>
>
> On Fri, Dec 13, 2013 at 11:43 AM, David Chisnall <thera...@sucs.org>wrote:
>
>> This test case looks like it should pass irrespective of whether the
>> runtime does the right thing.  Since you're using
>> associatedObjectTestAssociatedObject for both objects, deallocating the
>> original autoreleased one ought to set associatedObjectDeallocCalled.  Can
>> you confirm whether this test fails for you on GNUstep with the
>> objc_setAssociatedObject() call removed?
>>
>> David
>>
>> On 13 Dec 2013, at 18:27, Doug Warren <doug.war...@gmail.com> wrote:
>>
>> > I saw the test that you checked in to svn and modified my code to match
>> it:
>> >
>> > static BOOL associatedObjectDeallocCalled = NO;
>> > static const char* objc_setAssociatedObjectKey =
>> "objc_setAssociatedObjectKey";
>> >
>> > @interface associatedObjectTestAssociatedObject : NSObject
>> > @end
>> >
>> > @implementation associatedObjectTestAssociatedObject
>> >
>> > -(void) dealloc
>> > {
>> >     associatedObjectDeallocCalled = YES;
>> >     [super dealloc];
>> > }
>> >
>> > @end
>> >
>> > @interface associatedObjectTestAllocatedObject : NSObject
>> > @end
>> >
>> > @implementation associatedObjectTestAllocatedObject
>> > @end
>> >
>> > TEST(objc_setAssociatedObject, AssociatedObjectsAreReleased)
>> > {
>> > #if !Z2_APPLE
>> >     GSDebugAllocationActive(YES);
>> >     GSDebugAllocationList(YES);
>> > #endif
>> >
>> >     @autoreleasepool {
>> >         associatedObjectTestAllocatedObject* object =
>> [associatedObjectTestAllocatedObject new];
>> >
>> >         associatedObjectTestAssociatedObject *info =
>> [[associatedObjectTestAssociatedObject new] autorelease];
>> >         objc_setAssociatedObject(object, &objc_setAssociatedObjectKey,
>> info, OBJC_ASSOCIATION_RETAIN);
>> >
>> >         [object release];
>> >     }
>> > #if !Z2_APPLE
>> >     EXPECT_STREQ(GSDebugAllocationList(YES), "1\tNSDataMalloc\n");
>> > #endif
>> >
>> >     ASSERT_TRUE(associatedObjectDeallocCalled);
>> > }
>> >
>> >
>> > On the Apple runtime it passes still:
>> > [----------] 1 test from objc_setAssociatedObject
>> > [ RUN      ] objc_setAssociatedObject.AssociatedObjectsAreReleased
>> > [       OK ] objc_setAssociatedObject.AssociatedObjectsAreReleased (0
>> ms)
>> > [----------] 1 test from objc_setAssociatedObject (0 ms total)
>> >
>> > On Gnustep/objc2:
>> > E/Z2GameLog(12157): STDOUT: [----------] 1 test from
>> objc_setAssociatedObject
>> > E/Z2GameLog(12157): STDOUT: [ RUN      ]
>> objc_setAssociatedObject.AssociatedObjectsAreReleased
>> > E/Z2GameLog(12157): STDOUT:
>> /data/testnations.git/jujulib/Tests/objc-utility/objc_setAssociatedObjectTest.h:44:
>> Failure
>> > E/Z2GameLog(12157): STDOUT: Value of: "1\tNSDataMalloc\n"
>> > E/Z2GameLog(12157): STDOUT:   Actual: "1      NSDataMalloc
>> > E/Z2GameLog(12157): STDOUT: "
>> > E/Z2GameLog(12157): STDOUT: Expected: GSDebugAllocationList(((BOOL)1))
>> > E/Z2GameLog(12157): STDOUT: Which is: "1      NSDataMalloc
>> > E/Z2GameLog(12157): STDOUT: 1 associatedObjectTestAssociatedObject
>> > E/Z2GameLog(12157): STDOUT: "
>> > E/Z2GameLog(12157): STDOUT:
>> /data/testnations.git/jujulib/Tests/objc-utility/objc_setAssociatedObjectTest.h:47:
>> Failure
>> > E/Z2GameLog(12157): STDOUT: Value of: innerObjectDeallocCalled
>> > E/Z2GameLog(12157): STDOUT:   Actual: false
>> > E/Z2GameLog(12157): STDOUT: Expected: true
>> > E/Z2GameLog(12157): STDOUT: [  FAILED  ]
>> objc_setAssociatedObject.AssociatedObjectsAreReleased (1 ms)
>> > E/Z2GameLog(12157): STDOUT: [----------] 1 test from
>> objc_setAssociatedObject (2 ms total)
>> >
>> > My runtime environment unfortunately isn't in a position to run the
>> libobjc tests directly.  Do you have any suggestions as to what I should be
>> looking for?  Perhaps there's something in the GNUStep Foundation NSObject
>> that's causing it to fail but works with the libobjc Test object?
>> >
>> >
>> > On Fri, Dec 13, 2013 at 9:01 AM, Doug Warren <doug.war...@gmail.com>
>> wrote:
>> > Thanks David,
>> >
>> > I'll investigate more on our end.  I actually had changed that from
>> NSString to NSObject just to be sure that it wasn't related to that.  (Why
>> in the above stupid example it was cast to NSObject though Alloced as
>> NSString, I had intended it to just be a double dummy NSObject.) The actual
>> case where we ran into this was more complex and I feel there's still an
>> issue but I'll go back and confirm it.
>> >
>> > I was looking at another issue that we had with NSAutoreleasePool and
>> trying to isolate it to a test case.  If I get that I'll construct it as a
>> standalone program as well.
>> >
>> >
>> > On Fri, Dec 13, 2013 at 6:44 AM, David Chisnall <
>> david.chisn...@cl.cam.ac.uk> wrote:
>> > Ah, sorry, I was reading your example the other way around.  This seems
>> to be because [[NSString alloc] init] returns a singleton on GNUstep.  I
>> don't think this is necessarily a bug, as there's nothing in the contract
>> for NSString that says that it needs to return a new instance for different
>> immutable strings.
>> >
>> > In general, using associated objects on immutable objects is a bad
>> idea, because it breaks the assumption that you can use equal instances
>> interchangeably.
>> >
>> > David
>> >
>> > On 13 Dec 2013, at 14:03, David Chisnall <david.chisn...@cl.cam.ac.uk>
>> wrote:
>> >
>> > > I've now added a test for this to the libobjc2 test suite, but it
>> passes and so does not appear to be the cause.  Your issue appears to be
>> the dictionary being over-retained.  I will investigate further.
>> > >
>> > > David
>> > >
>> > > P.S. When sending test cases, it helps to send them in the format of
>> a test suite for the thing you are testing, or as stand-alone programs.
>>  I'd have got to this a lot sooner if I didn't have to hack on the test to
>> make it compile.
>> > >
>> > > On 19 Nov 2013, at 01:33, Doug Warren <doug.war...@gmail.com> wrote:
>> > >
>> > >> Hi Guys,
>> > >>
>> > >> Was tracking a memory leak in an existing app and tracked it down to
>> objc_setassociatedobject not working as expected from the code being
>> developed for the Apple Runtime.  The docs around objc_setassociatedobject
>> seem to imply it follows the Apple Runtime but this simple gtest will pass
>> on Apple but fail on libobjc/GNUStep Base:
>> > >>
>> > >> static BOOL deallocCalled = NO;
>> > >> static const char* objc_setAssociatedObjectKey =
>> "objc_setAssociatedObjectKey";
>> > >>
>> > >> @interface NSMutableDictionary(setAssociatedObjectTest)
>> > >> @end
>> > >>
>> > >> @implementation NSMutableDictionary(setAssociatedObjectTest)
>> > >>
>> > >> -(void) dealloc
>> > >> {
>> > >>    deallocCalled = YES;
>> > >>    [super dealloc];
>> > >> }
>> > >>
>> > >> @end
>> > >>
>> > >> TEST(objc_setAssociatedObject, AssociatedObjectsAreReleased)
>> > >> {
>> > >>    @autoreleasepool {
>> > >>        NSObject* object = [[NSString alloc] init];
>> > >>
>> > >>        NSMutableDictionary *info = [NSMutableDictionary
>> dictionaryWithCapacity:1];
>> > >>        objc_setAssociatedObject(object,
>> &objc_setAssociatedObjectKey, info, OBJC_ASSOCIATION_RETAIN);
>> > >>
>> > >>        [object release];
>> > >>    }
>> > >>
>> > >>    ASSERT_TRUE(deallocCalled);
>> > >> }
>> > >>
>> > >> Adding calls to GSDebugAllocationList before/after the autorelease
>> pool:
>> > >> 1    NSDataMalloc
>> > >> 1    GSMutableDictionary
>> > >>
>> > >> Shows that the dictionary leaks.
>> > >>
>> > >> Any thoughts?
>> > >> _______________________________________________
>> > >> Gnustep-dev mailing list
>> > >> Gnustep-dev@gnu.org
>> > >> https://lists.gnu.org/mailman/listinfo/gnustep-dev
>> > >
>> > >
>> > > _______________________________________________
>> > > Gnustep-dev mailing list
>> > > Gnustep-dev@gnu.org
>> > > https://lists.gnu.org/mailman/listinfo/gnustep-dev
>> >
>> >
>> >
>>
>>
>>
>>
>> -- Sent from my brain
>>
>>
>
_______________________________________________
Gnustep-dev mailing list
Gnustep-dev@gnu.org
https://lists.gnu.org/mailman/listinfo/gnustep-dev

Reply via email to