I just switched from gcc 2.95.x, where the GNUstep dox say I must use 
gnustep-objc, to gcc 3.3 where 
they say the built-in libobjc works fine. But it doesn't. It leaks threads, so 
eventually your program 
crashes in objc_detach_thread. The reason is that in gcc's libobjc, threads are 
created joinable, so when 
they exit they hang around forever waiting to be joined.

In gthr-posix.h:

  if (!(pthread_create (&new_thread_handle, NULL, (void *) func, arg)))

the second argument to pthread_create is NULL, which means default attributes, 
which on linux 2.4 I 
believe means the threads are joinable, not detached. Now it looks like someone 
thought about this a 
bit because in the same gthr-posix.h there is a variable called 
_objc_thread_attribs initialized thusly:

          /* The normal default detach state for threads is
           * PTHREAD_CREATE_JOINABLE which causes threads to not die
           * when you think they should.  */
          if (pthread_attr_init (&_objc_thread_attribs) == 0
              && pthread_attr_setdetachstate (&_objc_thread_attribs,
                                              PTHREAD_CREATE_DETACHED) == 0)
            return 0;

but _objc_thread_attribs, which you would think would be used as 
pthread_create's second argument, is 
in fact never used at all!

Note that the thr-posix.c in gnustep-objc has nearly identical code that works 
-- it remembers to pass 
the _objc_thread_attribs in:

  if (!(pthread_create(&new_thread_handle, &_objc_thread_attribs,
                       (void *)func, arg)))

-- 
           Summary: libobjc leaks threads on posix
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: libobjc
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: lcampbel at akamai dot com
                CC: gcc-bugs at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19850

Reply via email to