Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com X-Authenticated: #14308112 Date: Tue, 11 Oct 2005 17:51:00 +0300 From: Pavel Tsekov To: cygwin AT cygwin DOT com Subject: Re: handle_threadlist_exception: handle_threadlist_exception called with threadlist_ix -1 In-Reply-To: Message-ID: References: <20050901144331 DOT GH18595 AT trixie DOT casa DOT cgf DOT cx> <20051006141933 DOT GB17445 AT trixie DOT casa DOT cgf DOT cx> <20051006150019 DOT GA6197 AT trixie DOT casa DOT cgf DOT cx> MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-559023410-580310325-1129042260=:1476" X-Y-GMX-Trusted: 0 X-IsSubscribed: yes ---559023410-580310325-1129042260=:1476 Content-Type: TEXT/PLAIN; charset=US-ASCII On Thu, 6 Oct 2005, Pavel Tsekov wrote: > On Thu, 6 Oct 2005, Christopher Faylor wrote: > > > >It might be a different problem but the message is the same. > > > > It *is* a different problem. > > Ok. > > > Some thread is sending a signal 31 (SIGUSR1). Which thread is doing this? > > An application thread signaling another thread to stop its execution. I am > on it - I'll report back if I manage to find something. While tracking this problem I found what I suspect is a small bug in the way sigsuspend() works when it is used to retrieve the list of pending signals for a thread other than the main one. I think this is related to the crash I am seeing in some way though this has to be determined yet. As I read the code, when retrieving the list of pending signals sigpending() inspects only the list of blocked signals for the main thread - it doesn't look in the thread specific list of blocked signals of the calling thread. The code which I refer to is the following block from wait_sig(): case __SIGPENDING: *pack.mask = 0; unsigned bit; sigq.reset (); while ((q = sigq.next ())) if (myself->getsigmask () & (bit = SIGTOMASK (q->si.si_signo))) *pack.mask |= bit; break; On the other hand the code in sigpacket::process() does the right thing when it delivers a signal i.e. it looks the list of blocked signals in both the main thread and the target thread. Attached is a simple test case which demonstrates the problem. On Linux: pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000800 exiting thread_loop() On Cygwin: pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 pending_set = 00000000 [ keeps looping forever ] ---559023410-580310325-1129042260=:1476 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="sigpending_thr.c" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="sigpending_thr.c" I2luY2x1ZGUgPHNpZ25hbC5oPg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5j bHVkZSA8cHRocmVhZC5oPg0KDQpzdGF0aWMgdm9pZCAqdGhyZWFkX2xvb3Ag KHZvaWQgKnVudXNlZCkNCnsNCiAgc2lnc2V0X3QgYmxvY2tfc2V0LCBwZW5k aW5nX3NldDsNCg0KICBzaWdlbXB0eXNldCAoJmJsb2NrX3NldCk7DQogIHNp Z2FkZHNldCAoJmJsb2NrX3NldCwgU0lHVVNSMik7DQogIGlmIChwdGhyZWFk X3NpZ21hc2sgKFNJR19CTE9DSywgJmJsb2NrX3NldCwgTlVMTCkgIT0gMCkN CiAgICB7DQogICAgICBwcmludGYgKCJmYWlsZWQgdG8gc2V0IHRoZSBsaXN0 IG9mIGJsb2NrZWQgc2lnbmFsc1xuIik7DQogICAgfQ0KDQogIHdoaWxlICgx KQ0KICAgIHsNCiAgICAgIHNpZ3BlbmRpbmcgKCZwZW5kaW5nX3NldCk7DQoN CiAgICAgIHByaW50ZiAoInBlbmRpbmdfc2V0ID0gJTA4WFxuIiwgcGVuZGlu Z19zZXQpOw0KDQogICAgICBpZiAoc2lnaXNtZW1iZXIgKCZwZW5kaW5nX3Nl dCwgU0lHVVNSMikgIT0gMCkNCglicmVhazsNCg0KICAgICAgc2xlZXAgKDEp Ow0KICAgIH0NCg0KICBwcmludGYgKCJleGl0aW5nIHRocmVhZF9sb29wKClc biIpOw0KDQogIHJldHVybiBOVUxMOw0KfQ0KDQppbnQgbWFpbiAoaW50IGFy Z2MsIGNoYXIgKiphcmd2KQ0Kew0KICBpbnQgcnY7DQogIHB0aHJlYWRfdCB0 aHJfaWQ7DQoNCiAgcnYgPSBwdGhyZWFkX2NyZWF0ZSAoJnRocl9pZCwgTlVM TCwgdGhyZWFkX2xvb3AsIE5VTEwpOw0KICBpZiAocnYgIT0gMCkNCiAgICB7 DQogICAgICBwcmludGYgKCJmYWlsZWQgdG8gY3JlYXRlIHRocmVhZC5cbiIp Ow0KICAgICAgZXhpdCAoMSk7DQogICAgfQ0KDQogIC8qIGdpdmUgdGhlIHNl Y29uZCB0aHJlYWQgYSBjaGFuY2UgdG8gcnVuICovDQogIHNsZWVwICg1KTsN Cg0KICB3aGlsZSAoMSkNCiAgICB7DQogICAgICBpZiAocHRocmVhZF9raWxs ICh0aHJfaWQsIFNJR1VTUjIpICE9IDApDQogICAgICAgIGJyZWFrOw0KICAg IH0NCg0KICBleGl0ICgwKTsNCn0NCg== ---559023410-580310325-1129042260=:1476 Content-Type: text/plain; charset=us-ascii -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/ ---559023410-580310325-1129042260=:1476--