Date: Thu, 28 Aug 2008 23:52:46 +0300 From: Andriy Gapon <avg@icyb.net.ua> To: freebsd-threads@freebsd.org Subject: Re: mysterious hang in pthread_create Message-ID: <48B7101E.7060203@icyb.net.ua> In-Reply-To: <48B70A98.5060501@icyb.net.ua> References: <48B70A98.5060501@icyb.net.ua>
next in thread | previous in thread | raw e-mail | index | archive | help
on 28/08/2008 23:29 Andriy Gapon said the following: > I tracked all calls to functions of _thr_rtld_*lock* family and it seems > that the lock in question gets acquired for writing before the above > access. The stack: > #0 _thr_rtld_wlock_acquire (lock=0x8387740) at > /system/src/lib/libthr/thread/thr_rtld.c:144 > #1 0x282a6dcc in _rtld_thread_init () from /libexec/ld-elf.so.1 > #2 0x28f91af6 in _thr_rtld_init () at > /system/src/lib/libthr/thread/thr_rtld.c:238 > #3 0x28f938db in _thr_setthreaded (threaded=1) at > /system/src/lib/libthr/thread/thr_kern.c:56 > #4 0x28f8d208 in _pthread_create (thread=0x831cb90, attr=0x0, > start_routine=0x8170ce0 <Thread::starter(void*)>, arg=0x831cb8c) > at /system/src/lib/libthr/thread/thr_create.c:64 > #5 0x08170bd8 in Thread::start (this=0x831cb8c) at client/Thread.cpp:41 > #6 0x080abfb4 in HashManager::startup (this=0x831cb60) at HashManager.h:97 > #7 0x0809f4d6 in startup (f=0x827a2c0 <callBack(void*, std::string > const&)>, p=0x0) at client/DCPlusPlus.cpp:82 > #8 0x0827a571 in main (argc=1, argv=0xbfbfe844) at linux/wulfor.cc:61 Quick followup: I rebuilt ld-elf.so with debug symbols and it seems that at the following place in rtld_lock.c 'flags' variable gets assigned a value of five (5): (gdb) fr 2 #2 0x282a86bf in _rtld_thread_init (pli=0xbfbfe66c) at /system/src/libexec/rtld-elf/rtld_lock.c:275 275 flags = thread_mask_set(~0); (gdb) list 270 { 271 int flags, i; 272 void *locks[RTLD_LOCK_CNT]; 273 274 /* disable all locking while this function is running */ 275 flags = thread_mask_set(~0); 276 277 if (pli == NULL) 278 pli = &deflockinfo; 279 ... (gdb) p flags $10 = 5 Wait, I think I just found something: (gdb) b rtld_lock.c:143 if mask != 1 Breakpoint 8 at 0x282a8311: file /system/src/libexec/rtld-elf/rtld_lock.c, line 143. (gdb) c ... (gdb) bt #0 def_thread_set_flag (mask=4) at /system/src/libexec/rtld-elf/rtld_lock.c:143 #1 0x282a83e0 in thread_mask_set (mask=4) at /system/src/libexec/rtld-elf/rtld_lock.c:165 #2 0x282a8410 in wlock_acquire (lock=0x282cddb4) at /system/src/libexec/rtld-elf/rtld_lock.c:198 #3 0x282a58b2 in dl_iterate_phdr (callback=0x28f84fc0 <__fixunssfdi+4352>, param=0xbfbfe200) at /system/src/libexec/rtld-elf/rtld.c:2103 #4 0x28f8586f in _Unwind_Find_FDE () from /lib/libgcc_s.so.1 #5 0x28f8267c in _Unwind_GetIPInfo () from /lib/libgcc_s.so.1 #6 0x28f833be in _Unwind_GetIPInfo () from /lib/libgcc_s.so.1 #7 0x28f838c0 in _Unwind_RaiseException () from /lib/libgcc_s.so.1 #8 0x28ee045d in __cxa_throw () from /usr/lib/libstdc++.so.6 #9 0x080d60e2 in File (this=0xbfbfe710, aFileName=@0xbfbfe71c, access=1, mode=1) at client/File.cpp:227 #10 0x08192d6f in Util::initialize () at client/Util.cpp:102 #11 0x0809f3cc in startup (f=0x827a2c0 <callBack(void*, std::string const&)>, p=0x0) at client/DCPlusPlus.cpp:51 #12 0x0827a571 in main (argc=1, argv=0xbfbfe844) at linux/wulfor.cc:61 So can all this be a result of an exception thrown before threads are initialized? Is this something that might already be fixed in HEAD/trunk or in RELENG_7? (I seem to vaguely remember something related). -- Andriy Gapon
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?48B7101E.7060203>