From: LRN <lr...@gm...> - 2013-02-25 11:28:32
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 13.09.2012 15:31, Earnie Boyd wrote: > On Wed, Sep 12, 2012 at 2:41 PM, Eran Ifrah wrote: >> >> >> On Wed, Sep 12, 2012 at 9:07 PM, niXman wrote: >>> >>> 2012/9/12 Earnie Boyd: >>> >>>> Have you considered the BLODA? Especially make sure that >>>> your anti-virus software ignores your work directories. >>> >>> hmm... I didn't think about it... >>> >>> >>> Eran, you are using an antivirus, too? Have you tried with >>> disabled Antivirus? >>> >> Nope, I am not using any antivirus software. >> >> Also, I have 2 MinGW toolchains (different installations): the >> first one is MSYS and the second is TDM-GCC4.6.1. The hang only >> happens when I am using the MSYS toolchain (installed using >> mingw-get) It never happened to me when I used TDM-GCC toolchain >> running from within a cmd.exe shell (again, running mingw32-make >> -j4) > > Cesar, do you have some time to work with Eran and niXman to debug > this? > I've built my own msysCORE-1.0.18, with full debug symbols and no optimizations (-g3 -O0), and from the looks of it the problem is in wait_sig() function. It contains an endless loop that does DWORD rc = WaitForMultipleObjects (3, catchem, FALSE, sig_loop_wait); Well, that call returns immediately with rc == 2. Then the code loops through all the signals, checking myself->getsigtodo (sig). That thing it set for SIGCHLD. It then runs sig_handle(), which runs setup_handler(). That function immediately checks for sigsave.sig (which is set to SIGCHLD), and if it's set, it jumps to set_pending label, where it calls sig_set_pending and sig_dispatch_pending (since "interrupted" is 0), and then quickly returns. The signal loop eventually ends, the code calls proc_subproc (PROC_CLEARWAIT, 0), which does nothing, since waitq is empty. Then the endless loop iterates again. Because WaitForMultipleObjects() returns immediately, this code busyloops, causing 100% CPU load on one core. Meanwhile the other thread runs a wait_subproc() function, which sleeps for 1 second, checking for children to wake up, or for a wakeup event (which never gets set, since the functions that set it only run when signal is handled, which doesn't happen). To clarify: by the time `make' enters this loop, it has no child processes left. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (MingW32) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBAgAGBQJRK0rUAAoJEOs4Jb6SI2Cw4CUIAImMXZmpaNeSMPAbzbzeqT1J cBqGn5r6iwe226DjZqBM8qTOyvQsuk0n5Rj/nXoU5GGAxhJ5UuIu6EQuslLAM+Eh i3CzNK37S1VeAUdPdA1glj01ySkOq1UdNgM05aeojyLXc/6PcrqzeEJtQFru2cL5 ngT6ZVim+kURIgB3vMB2H5k883QonRf3xrngdlMwXYNWV4La/4U82ZbCAA8Fh89G +akPz7uNIHQZ6Ui+2ymcffAEvvFLQwMQ41YjgtMPiRxe3qo6CpXMIyBiREW9GKhA 5dT3dvvl+hAgv1Aea2N485t0sKi75DUm3sYw55vtYLJk5w7y0fbfEneyzKKf8A0= =R0ic -----END PGP SIGNATURE----- |