discuss-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: NSRunLoop with ARC


From: Hoon H.
Subject: Re: NSRunLoop with ARC
Date: Thu, 17 Oct 2013 14:04:19 +0900

Yes that' me.
Thanks again for the fix.



On Oct 17, 2013, at 3:37 AM, David Chisnall <theraven@sucs.org> wrote:

> Hi,
> 
> Banlu pointed me at this question from someone (you?) on Stack Overflow 
> today.  The short version: it's a bug, it's fixed in svn, and it's in -base, 
> so update -base and this code should work again.
> 
> The long version:
> 
> The cause of the bug was the NSFileHandle method that is supposed to return a 
> singleton instance for standard input.  There was a memory management bug in 
> this code.  The singleton was assigned to a global, autoreleased, and 
> returned.  It was not retained before assigning it to the global (which 
> didn't look like it was required, because it was just created with +alloc, 
> but that code didn't know that the there was another autorelease in the 
> calling method).  
> 
> With non-ARC code, this rarely matters.  If you retain the result, it will 
> exist you release it (and, as long as at least one object always holds a 
> reference to it, the singleton instance stays valid).  Similarly, in simple 
> test cases like yours, the top-level autorelease pool holds the reference to 
> it until program access.
> 
> This shows up with ARC, because ARC introduced a mechanism for popping the 
> top object from the autorelease pool.  This meant that, as soon as you'd 
> called the waitForDataInBackgroundAndNotify method on the file handle, it was 
> deallocated, even though it is a singleton that should not be deallocated 
> just because you stop holding a reference to it.  
> 
> I have now fixed the NSFileHandle bug (and added a non-ARC test case to the 
> test suite that triggers it).
> 
> David
> 
> On 16 Oct 2013, at 04:50, "Hoon H." <drawtree@gmail.com> wrote:
> 
>> Hello. 
>> I am Hoon and trying GNUstep for server-side web development.
>> I think if it supports collection classes and std/socket I/O, then it's 
>> enough to use for me.
>> 
>> Anyway, at first try (command-line echo app), I found some strange behavior. 
>> `NSRunLoop` 
>> didn't work well with ARC.
>> 
>> When I issued `-[NSRunLoop run]` method with installing std-in I/O observer, 
>> I expected it to 
>> run infinitely. And on OSX, GNUstep, it worked as I expected. But only 
>> *without* ARC. 
>> When I turned on ARC on GNUstep, the run-loop quits immediately.
>> 
>> ARC itself works well because I could observe object deallocation.
>> So I have no idea why GNUstep behaves differently only under ARC enabled.
>> 
>> Should I treat this as a bug? Or am I missing something?
>> 
>> Here's my test code, compile command, and environment.
>> 
>> 
>> 
>> 
>>      #import <Foundation/Foundation.h>
>> 
>>      @interface      AAA : NSObject
>>      - (void)test1:(id)s;
>>      @end
>>      @implementation AAA
>>      - (void)test1:(id)s
>>      {
>>              NSLog(@"%@", s);
>>      }
>>      - (void)dealloc
>>      {
>>              NSLog(@"DEALLOCED!!");
>>      }
>>      @end
>> 
>>      int main(int argc, const char * argv[])
>>      {
>>              @autoreleasepool
>>              {
>>                      AAA*    aaa     =       [[AAA alloc] init];
>>                      [[NSNotificationCenter defaultCenter] addObserver:aaa 
>> selector:@selector(test1:) name:NSFileHandleDataAvailableNotification 
>> object:nil];
>>                              
>>                      [[NSFileHandle fileHandleWithStandardInput] 
>> waitForDataInBackgroundAndNotify];
>>                      [[NSRunLoop currentRunLoop] run];
>>              }
>>              return 0;
>>      }
>> 
>> 
>> 
>> 
>> 
>> Compile command:
>> 
>> 
>> 
>> 
>>      clang -v
>>      EE_GNUSTEP_OPTS="-MMD -MP -DGNUSTEP -DGNUSTEP_BASE_LIBRARY=1 
>> -DGNU_RUNTIME=1 -DGNUSTEP_BASE_LIBRARY=1 -fno-strict-aliasing -fexceptions 
>> -fobjc-exceptions -D_NATIVE_OBJC_EXCEPTIONS -D_NONFRAGILE_ABI -pthread -fPIC 
>> -Wall -DGSWARN -DGSDIAGNOSE -Wno-import -g -fgnu-runtime 
>> -fconstant-string-class=NSConstantString"
>>      EE_BUILD_OPTS="-I/usr/local/include -L/usr/local/lib -lc -lobjc 
>> -lgnustep-base -fblocks -fobjc-arc -fobjc-abi-version=3"
>>      alias OBJCC="clang $EE_GNUSTEP_OPTS $EE_BUILD_OPTS"
>>      OBJCC *.m
>> 
>>      ./a.out
>> 
>> 
>> 
>> 
>> Environment:
>> 
>> - FreeBSD 9.2-RELEASE
>> - GNUstep(make:2.6.5, base:1.24.5)
>> - libobjc2(1.7)
>> 
>> My installation script.
>> 
>>      echo "Writtne for csh."
>>      echo "Switch to Clang. Ensure you're using 3.3 or above."
>>      setenv CC clang
>>      setenv CXX clang++
>>      setenv CPP clang-cpp
>> 
>>      echo "Prerequisites."
>>      pkg_add -r portmaster
>>      cd /usr/ports
>>      portmaster --no-confirm -G security/gnutls textproc/libxslt devel/icu 
>> devel/libdispatch devel/libffi
>> 
>>      echo "GNUstep(make:2.6.5, base:1.24.5) + libobjc2(1.7) on FreeBSD 9.2."
>>      echo "The versions are chosen for production. Do not upgrade without 
>> test."
>>      cd ~/
>>      mkdir t1
>>      cd t1
>>      pkg_add -r subversion gmake
>>      svn co http://svn.gna.org/svn/gnustep/libs/libobjc2/releases/1.7 
>> libobjc2-1.7 &
>>      svn co http://svn.gna.org/svn/gnustep/tools/make/tags/make-2_6_5 
>> make-2_6_5 &
>>      svn co http://svn.gna.org/svn/gnustep/libs/base/tags/base-1_24_5 
>> base-1_24_5 &
>>      wait
>> 
>>      cd make-2_6_5
>>      ./configure --enable-objc-nonfragile-abi
>>      gmake install
>>      cd ..
>> 
>>      cd libobjc2-1.7
>>      gmake install
>>      cd ..
>> 
>>      cd make-2_6_5
>>      ./configure --enable-objc-nonfragile-abi
>>      gmake install
>>      cd ..
>> 
>>      echo "Now we need to set some path to GNUstep to use gnustep-make."
>>      source /usr/GNUstep/System/Library/Makefiles/GNUstep.csh
>> 
>>      cd base-1_24_5
>>      ./configure --enable-fake-main --disable-unicodeconstants --disable-tls
>>      gmake install
>>      cd ..
>> 
>> 
>> 
>> _______________________________________________
>> Discuss-gnustep mailing list
>> Discuss-gnustep@gnu.org
>> https://lists.gnu.org/mailman/listinfo/discuss-gnustep
> 
> 
> 
> 
> -- Sent from my brain
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]