|
Boost-Build : |
Subject: Re: [Boost-build] bjam bug invoking codeworker
From: Fabien CHÊNE (fabien.chene_at_[hidden])
Date: 2009-10-26 11:44:49
2009/10/26 Vladimir Prus <ghost_at_[hidden]>:
> On Monday 26 October 2009 Fabien CHÊNE wrote:
>
>> [...]
>> >> bjam is stucked line 470:
>> >>
>> >> 455 if ( 0 < globs.timeout )
>> >> 456 {
>> >> 457 /* Force select() to timeout so we can terminate expired processes.
>> >> 458 */
>> >> 459 tv.tv_sec = select_timeout;
>> >> 460 tv.tv_usec = 0;
>> >> 461
>> >> 462 /* select() will wait until: i/o on a descriptor, a signal, or we
>> >> 463 * time out.
>> >> 464 */
>> >> 465 ret = select( fd_max + 1, &fds, 0, 0, &tv );
>> >> 466 }
>> >> 467 else
>> >> 468 {
>> >> 469 /* select() will wait until i/o on a descriptor or a signal. */
>> >> 470 ret = select( fd_max + 1, &fds, 0, 0, 0 );
>> >> 471 }
>> >>
>> >> Any ideas ?
>> >> Can it be a bug in CodeWorker ?
>> >
>> > Not clear yet. When the hang happens, is there still a codeworker process?
>>
>> Definitely.
>>
>> > Can you attach to it with gdb, and get backtrace? Please check if it has
>> > multiple threads -- using 'info thread' -- if so, use "thread apply all bt"
>> > to get backtrace as opposed to regular "bt"
>>
>> There is only one thread in codeworker, stucked on a tcsetattr call:
>>
>> (gdb) bt
>> #0 0x002ca7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
>> #1 0x00bbf400 in tcsetattr () from /lib/tls/libc.so.6
>> #2 0x0808d4bf in initKeyboard () at CGRuntime.cpp:115
>> #3 0x082258ca in Workspace (this=0xbff323d0) at Workspace.cpp:58
>> #4 0x0808e595 in CodeWorker::CGRuntime::entryPoint (iNargs=4,
>> tsArgs=0xbff32564, executeFunction=0x0) at CGRuntime.cpp:383
>> #5 0x08241c98 in main ()
>> (gdb) f 2
>> #2 0x0808d4bf in initKeyboard () at CGRuntime.cpp:115
>> 115 tcsetattr(0, TCSANOW, &new_settings);
>> (gdb) l
>> 110 new_settings.c_lflag &= ~(ICANON | ECHO);
>> 111 new_settings.c_iflag &= ~(ISTRIP | IGNCR | ICRNL | INLCR | IXOFF | IXON);
>> 112 new_settings.c_cc[VMIN] = 0;
>> 113 new_settings.c_cc[VTIME] = 0;
>> 114 #ifndef CODEWORKER_GNU_READLINE
>> 115 tcsetattr(0, TCSANOW, &new_settings);
>> 116 #endif
>> 117 signal(SIGINT, catch_sig);
>> 118 signal(SIGHUP, catch_sig);
>> 119 signal(SIGTERM, catch_sig);
>>
>> (gdb) set print pretty on
>> (gdb) p new_settings
>> $2 = {
>> c_iflag = 0,
>> c_oflag = 1,
>> c_cflag = 191,
>> c_lflag = 35377,
>> c_line = 0 '\0',
>> c_cc = "\003\034\000\000\004\000\000\000\021\023\032\000\022\017\027\026",
>> '\0' <repeats 15 times>,
>> c_ispeed = 15,
>> c_ospeed = 15
>> }
>
> If it's really stuck there, e.g. it remains there after "continue + Ctrl-C" in
> GDB,
Confirmed, we are still waiting for tcsetattr to give up after
"continue, Ctrl-C".
CodeWorker can be compiled with the macro CODEWORKER_GNU_READLINE -- it avoids
tcsetattr; doing that, everything works fine.
> it seems that tcsetattr for some reason hangs if stdin is not a terminal.
> And when run by bjam, it's naturally not a terminal. I don't immediately
> know why this should be a problem, I'll check.
Thanks !
-- Fab
Boost-Build list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk