From: SourceForge.net <no...@so...> - 2008-10-21 22:41:05
|
Bugs item #2005794, was opened at 2008-06-29 12:42 Message generated for change (Comment added) made by ferrieux You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=110894&aid=2005794&group_id=10894 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: 80. Thread Package Group: current: 8.4.19 Status: Open Resolution: None Priority: 5 Private: No Submitted By: rudenstam (rudenstam) Assigned to: Zoran Vasiljevic (vasiljevic) Summary: tpool::create freezes when using minworkers Initial Comment: When trying to use -minworkers when creating a threadpool, the tcl script just freezes up when the pool is to be created. This behaviour is irregular and the following code has been tested working on several platforms. On my previous linux installation, it worked 6/10 times, either it froze where indicated now, or it created the pool without trouble. That installation was a debian etch running tcl 8.4. The one I have this problem 10/10 times now, is a debian lenny. I got both tcl8.4.19 and tcl8.5.2 installed on it, and I get the exact same behaviour with both tcl versions. Thread was built from CVS to include the recent fix that closed bug 1965721. I'd be happy add any other information you might need and to try out any potential fix, as this probably will work on your end. Cheers rudenstam ----------------------------------------- Code used to test this ----------------------------------------- puts "Using tcl version: [info patchlevel]" puts "Loading threads version: [package require Thread]" set min 5 puts "Creating the threadpool with: set pool \[tpool::create -minworkers $min\]" set pool [tpool::create -minworkers $min] puts "pool $pool created" ----------------------------------------- Output of tclsh thread.tcl ----------------------------------------- Using tcl version: 8.4.19 Loading threads version: 2.6.5 Creating the threadpool with: set pool [tpool::create -minworkers 5] ----------------------------------------- Output of strace tclsh thread.tcl ----------------------------------------- write(1, "Creating the threadpool with: se"..., 70Creating the threadpool with: set pool [tpool::create -minworkers 5] ) = 70 mmap2(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6b22000 mprotect(0xb6b22000, 4096, PROT_NONE) = 0 clone(child_stack=0xb73224c4, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb7322bd8, {entry_number:6, base_addr:0xb7322b90, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb7322bd8) = 14613 futex(0x804c4c0, 0x81 /* FUTEX_??? */, 1) = 1 futex(0x809a118, 0x81 /* FUTEX_??? */, 1) = 1 futex(0x809a11c, 0x80 /* FUTEX_??? */, 1) = -1 EAGAIN (Resource temporarily unavailable) futex(0x804c4c0, 0x81 /* FUTEX_??? */, 1) = 0 mmap2(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6321000 mprotect(0xb6321000, 4096, PROT_NONE) = 0 clone(child_stack=0xb6b214c4, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb6b21bd8, {entry_number:6, base_addr:0xb6b21b90, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb6b21bd8) = 14614 futex(0x804c4c0, 0x81 /* FUTEX_??? */, 1) = 1 futex(0x809a118, 0x81 /* FUTEX_??? */, 1) = 1 futex(0x809a11c, 0x80 /* FUTEX_??? */, 4) = -1 EAGAIN (Resource temporarily unavailable) futex(0x804c4c0, 0x81 /* FUTEX_??? */, 1) = 0 mmap2(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb5b20000 mprotect(0xb5b20000, 4096, PROT_NONE) = 0 clone(child_stack=0xb63204c4, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb6320bd8, {entry_number:6, base_addr:0xb6320b90, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb6320bd8) = 14615 futex(0x804c4c0, 0x81 /* FUTEX_??? */, 1) = 1 futex(0x809a118, 0x81 /* FUTEX_??? */, 1) = 1 futex(0x809a11c, 0x80 /* FUTEX_??? */, 9) = -1 EAGAIN (Resource temporarily unavailable) futex(0x804c4c0, 0x81 /* FUTEX_??? */, 1) = 0 mmap2(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb531f000 mprotect(0xb531f000, 4096, PROT_NONE) = 0 clone(child_stack=0xb5b1f4c4, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb5b1fbd8, {entry_number:6, base_addr:0xb5b1fb90, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb5b1fbd8) = 14616 futex(0x804c4c0, 0x81 /* FUTEX_??? */, 1) = 1 futex(0x809a118, 0x81 /* FUTEX_??? */, 1) = 1 futex(0x809a11c, 0x80 /* FUTEX_??? */, 16) = -1 EAGAIN (Resource temporarily unavailable) futex(0x804c4c0, 0x81 /* FUTEX_??? */, 1) = 1 mmap2(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb4b1e000 mprotect(0xb4b1e000, 4096, PROT_NONE) = 0 clone(child_stack=0xb531e4c4, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb531ebd8, {entry_number:6, base_addr:0xb531eb90, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb531ebd8) = 14617 futex(0x804c4c0, 0x81 /* FUTEX_??? */, 1) = 1 futex(0x809a118, 0x81 /* FUTEX_??? */, 1) = 1 futex(0x809a11c, 0x80 /* FUTEX_??? */, 25) = -1 EAGAIN (Resource temporarily unavailable) futex(0x804c4c0, 0x81 /* FUTEX_??? */, 1) = 1 write(1, "pool tpool0x8063ed0 created\r\n", 29pool tpool0x8063ed0 created ) = 29 futex(0x809a11c, 0x84 /* FUTEX_??? */, 1) = 4 futex(0x809b598, 0x81 /* FUTEX_??? */, 1) = 1 futex(0x8088e64, 0x80 /* FUTEX_??? */, 1 ---------------------------------------------------------------------- Comment By: Alexandre Ferrieux (ferrieux) Date: 2008-10-22 00:40 Message: Hmm, just realized that in the gdb output the TpoolWorker function shows that this is the C version of [tpool], not the script version. Forget about my comment (unless the C follows the same logic). ---------------------------------------------------------------------- Comment By: Alexandre Ferrieux (ferrieux) Date: 2008-10-22 00:30 Message: I don't know if this is relevant but... in the tpool.tcl code, in tpool::create, when minworkers is nonzero, the following loop is done outside any lock: for {set ii 0} {$ii < [tsv::set $tpid -minworkers]} {incr ii} { Worker $tpid } But the comment for Worker says This procedure must be executed under the tsv lock. Maybe we could just run this loop inside a tsv::lock block ? ---------------------------------------------------------------------- Comment By: Nathan Jett (nathanjett) Date: 2008-10-21 23:41 Message: I've also experienced this issue with the following code: package require Thread set workers 10 set poolId [tpool::create -minworkers $workers -maxworkers $workers] This code works fine on Windows XP but on my Gentoo Linux install and a co-workers Ubuntu install the last line hangs indefinitely. If I set workers to 2 it works fine, as I increase the number it fails more frequently and when I get to 10 it fails every time. If I don't specify the minworkers the command finished fine, but then when I assign a large number of jobs to the pool, only 7 or 8 threads end up working them. I'm using Tcl 8.5.1 with thread 2.6.5. I have tried the ActiveState binaries and had the same trouble, also tried with Tcl 8.4.18 and still no luck. Below is are strace and gdb output for the script noted above. nathan@NJPC ~ $ strace -p 6315 -t -tt Process 6315 attached - interrupt to quit 1224606735.015121 futex(0x8094d1c, FUTEX_WAIT, 34, NULL) = -1 EAGAIN (Resource temporarily unavailable) 1224606735.015288 futex(0x8094d1c, FUTEX_WAIT, 36, NULL^C <unfinished ...> Process 6315 detached nathan@NJPC ~ $ gdb GNU gdb 6.7.1 Copyright (C) 2007 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu". (gdb) attach 6315 Attaching to process 6315 Reading symbols from /usr/bin/tclsh8.5...(no debugging symbols found)...done. Using host libthread_db library "/lib/libthread_db.so.1". Reading symbols from /usr/lib/libtcl8.5.so...(no debugging symbols found)...done. Loaded symbols for /usr/lib/libtcl8.5.so Reading symbols from /lib/libdl.so.2...(no debugging symbols found)...done. Loaded symbols for /lib/libdl.so.2 Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done. [Thread debugging using libthread_db enabled] [New Thread 0xb7c8d6c0 (LWP 6315)] [New Thread 0xb4c53b90 (LWP 6322)] [New Thread 0xb5454b90 (LWP 6321)] [New Thread 0xb5c55b90 (LWP 6320)] [New Thread 0xb6456b90 (LWP 6319)] [New Thread 0xb6c57b90 (LWP 6318)] [New Thread 0xb7458b90 (LWP 6317)] [New Thread 0xb7c8cb90 (LWP 6316)] Loaded symbols for /lib/libpthread.so.0 Reading symbols from /lib/libm.so.6... (no debugging symbols found)...done. Loaded symbols for /lib/libm.so.6 Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done. Loaded symbols for /lib/libc.so.6 Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done. Loaded symbols for /lib/ld-linux.so.2 Reading symbols from /lib/libnss_compat.so.2...(no debugging symbols found)...done. Loaded symbols for /lib/libnss_compat.so.2 Reading symbols from /lib/libnsl.so.1... (no debugging symbols found)...done. Loaded symbols for /lib/libnsl.so.1 Reading symbols from /lib/libnss_nis.so.2...(no debugging symbols found)...done. Loaded symbols for /lib/libnss_nis.so.2 Reading symbols from /lib/libnss_files.so.2...(no debugging symbols found)...done. Loaded symbols for /lib/libnss_files.so.2 Reading symbols from /usr/lib/thread2.6.5/libthread2.6.5.so...(no debugging symbols found)...done. Loaded symbols for /usr/lib/thread2.6.5/libthread2.6.5.so (no debugging symbols found) 0xffffe424 in __kernel_vsyscall () (gdb) thread apply all bt Thread 8 (Thread 0xb7c8cb90 (LWP 6316)): #0 0xffffe424 in __kernel_vsyscall () #1 0xb7d497d1 in select () from /lib/libc.so.6 #2 0xb7ef7dbd in ?? () from /usr/lib/libtcl8.5.so Thread 7 (Thread 0xb7458b90 (LWP 6317)): #0 0xffffe424 in __kernel_vsyscall () #1 0xb7dee576 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0 #2 0xb7ef6bb3 in Tcl_ConditionWait () from /usr/lib/libtcl8.5.so Thread 6 (Thread 0xb6c57b90 (LWP 6318)): #0 0xffffe424 in __kernel_vsyscall () #1 0xb7dee576 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0 #2 0xb7ef6bb3 in Tcl_ConditionWait () from /usr/lib/libtcl8.5.so Thread 5 (Thread 0xb6456b90 (LWP 6319)): #0 0xffffe424 in __kernel_vsyscall () #1 0xb7dee576 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0 #2 0xb7ef6bb3 in Tcl_ConditionWait () from /usr/lib/libtcl8.5.so Thread 4 (Thread 0xb5c55b90 (LWP 6320)): #0 0xffffe424 in __kernel_vsyscall () #1 0xb7dee576 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0 #2 0xb7ef6bb3 in Tcl_ConditionWait () from /usr/lib/libtcl8.5.so Thread 3 (Thread 0xb5454b90 (LWP 6321)): #0 0xffffe424 in __kernel_vsyscall () #1 0xb7dee576 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0 #2 0xb7ef6bb3 in Tcl_ConditionWait () from /usr/lib/libtcl8.5.so Thread 2 (Thread 0xb4c53b90 (LWP 6322)): #0 0xffffe424 in __kernel_vsyscall () #1 0xb7df0c2e in __lll_mutex_lock_wait () from /lib/libpthread.so.0 #2 0xb7deca93 in _L_mutex_lock_50 () from /lib/libpthread.so.0 #3 0xb7dec47d in pthread_mutex_lock () from /lib/libpthread.so.0 #4 0xb7ef6c42 in Tcl_MutexLock () from /usr/lib/libtcl8.5.so #5 0x080ad3a0 in ?? () #6 0x080c3ff0 in ?? () #7 0xb4c534b8 in ?? () #8 0xb7e1dff4 in ?? () from /usr/lib/thread2.6.5/libthread2.6.5.so #9 0xbf832758 in ?? () #10 0xbf832758 in ?? () #11 0x080a8518 in ?? () #12 0xb7e171b4 in TpoolWorker () from /usr/lib/thread2.6.5/libthread2.6.5.so #13 0xb7f14ff4 in ?? () from /usr/lib/libtcl8.5.so #14 0xbf832758 in ?? () #15 0xb7e1e1ec in listMutex () from /usr/lib/thread2.6.5/libthread2.6.5.so #16 0xb7f14ff4 in ?? () from /usr/lib/libtcl8.5.so #17 0xb7f14ff4 in ?? () from /usr/lib/libtcl8.5.so #18 0x08129400 in ?? () #19 0x080c3ff0 in ?? () #20 0xb7edbe38 in TclpFree () from /usr/lib/libtcl8.5.so #21 0x00000000 in ?? () Thread 1 (Thread 0xb7c8d6c0 (LWP 6315)): #0 0xffffe424 in __kernel_vsyscall () #1 0xb7dee576 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0 #2 0xb7ef6bb3 in Tcl_ConditionWait () from /usr/lib/libtcl8.5.so #0 0xffffe424 in __kernel_vsyscall () Thanks for your help on this issue. Nathan ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=110894&aid=2005794&group_id=10894 |