X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,T_FRT_STOCK2,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org MIME-Version: 1.0 Date: Thu, 27 Jan 2011 20:25:36 +0100 Message-ID: Subject: pthread_cancel+pthread_join problems when a thread executes "accept" TCP function From: jdzstz - gmail dot com To: cygwin AT cygwin DOT com Content-Type: multipart/mixed; boundary=00163631008dfe79ce049ad8e956 X-IsSubscribed: yes Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: 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 --00163631008dfe79ce049ad8e956 Content-Type: text/plain; charset=ISO-8859-1 I have detected an issue with pthread_join when the thread is executing "accept" TCP function. If a thread is blocked in an accept TCP call, and a "pthread_cancel" and "pthread_join" are called from parent, in cygwin, the "pthread_join" is blocked forever until "accept" ends (that maybe never end) so the program gets blocked forever. In Linux and Solaris, it works fine (see below) The problem is happening in one of the tools of varnish cache program. I have extracted part of the code and created program test. The program does the following: 1. calls socket(AF_INET, SOCK_STREAM, 0); , bind(sd, (struct sockaddr *) &saddr, sizeof(saddr) and listen(sock, 1) 2. execute rc = pthread_create(&thr, NULL, server_thread, (void *)t); 3. server_thread => executes "accept" and gets blocked until somebody connects to port. 4. server_thread => if receives an incomming conection, closes the connection and exits. 5. main thread => execute sleep x seconds (program argument) 6. main thread => execute pthread_cancel and pthread_join 7. main thread => closes socket I have made some tests in Linux 2.6.16.60 , Solaris 10, Cygwin 1.7.7 and Cygwin 1.7.8s(0.235/5/3) 20110114 * In Linux, when "pthread_cancel"+"pthread_join" are executed, if thread is blocked in accept call, it is destroyed immediately, "pthread_join" returns 0. and tread returns "0xffffffffffffffff" * In Solaris, when "pthread_cancel"+"pthread_join" are executed, if thread is blocked in accept call, accept is aborted and returns error, but rest of thread is executed ok, and pthread_join ends when thread returns. * In Cygwin (both versions), when "pthread_cancel"+"pthread_join" are executed, if thread is blocked in accept call, pthread_join is also blocked, forever (or until accept is unblocked) ==== SOLARIS ==== $ /tmp/thread_accept_test 10 Start main Opening socket on 0.0.0.0 61002 Main: Creating thread Start sleep Starting server thread, executing "accept" End sleep pthread_cancel Waiting for server Accepted failed: Error 0 Ending thread Server returned "NULL" End main $ ==== LINUX ==== $ /tmp/thread_accept_test 10 Start main Opening socket on 0.0.0.0 50636 Main: Creating thread Start sleep Starting server thread, executing "accept" End sleep pthread_cancel Waiting for server Server returned "0xffffffffffffffff" End main $ ==== CYGWIN ==== $ /tmp/thread_accept_test.exe 10 Start main Opening socket on 0.0.0.0 3940 Main: Creating thread Starting server thread, executing "accept" Start sleep End sleep pthread_cancel Waiting for server After searching solutions in google, I founded a workaround for cygwin, if I send a signal to thread, it unblocks "accept" call: (void)pthread_kill(thr,SIGUSR1); --00163631008dfe79ce049ad8e956 Content-Type: text/x-csrc; charset=US-ASCII; name="thread_accept_test.c" Content-Disposition: attachment; filename="thread_accept_test.c" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gjg0y8zj0 CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5j bHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8 dW5pc3RkLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPHN0cmlu Zy5oPiAKCiNpbmNsdWRlIDxuZXRkYi5oPgojaW5jbHVkZSA8cG9sbC5oPgoK aW50IHNlY29uZHM7CmludCBzb2NrOwoKLyoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioKICogTGlzdGVuIHRvIHBvcnQKICovCgppbnQKbGlzdGVuX3BvcnQo KQp7CgkKCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlczAsICpyZXM7Cglp bnQgaSwgcmV0OwoKCWludCBzZCwgdmFsOwoKCXNkID0gc29ja2V0KEFGX0lO RVQsIFNPQ0tfU1RSRUFNLCAwKTsKCWlmIChzZCA8IDApIHsKCQlwZXJyb3Io InNvY2tldCgpIik7CgkJcmV0dXJuICgtMSk7Cgl9Cgl2YWwgPSAxOwoJCglp ZiAoc2V0c29ja29wdChzZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAm dmFsLCBzaXplb2YgdmFsKSAhPSAwKSB7CgkJcGVycm9yKCJzZXRzb2Nrb3B0 KFNPX1JFVVNFQUREUiwgMSkiKTsKCQkodm9pZCljbG9zZShzZCk7CgkJcmV0 dXJuICgtMSk7Cgl9CgoJc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOwoJYnpl cm8oKGNoYXIgKikgJnNhZGRyLCBzaXplb2Yoc2FkZHIpKTsKCXNhZGRyLnNp bl9mYW1pbHkgICAgICA9IEFGX0lORVQ7CglzYWRkci5zaW5fYWRkci5zX2Fk ZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKCXNhZGRyLnNpbl9wb3J0ICAgICAg ICA9IGh0b25zKDApOwoJCglpZiAoYmluZChzZCwgKHN0cnVjdCBzb2NrYWRk ciAqKSAmc2FkZHIsIHNpemVvZihzYWRkcikpIDwgMCkgCgl7CgkJcGVycm9y KCJiaW5kKCkiKTsKCQkodm9pZCljbG9zZShzZCk7CgkJcmV0dXJuICgtMSk7 Cgl9CglyZXR1cm4gKHNkKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioKICogU2VydmVyIFRocmVhZAogKi8KCnN0YXRpYyB2b2lkICoKc2VydmVy X3RocmVhZCh2b2lkICpwcml2KQp7CglzdHJ1Y3QgdnRjbG9nICp2bDsKCWlu dCBpLCBqLCBmZDsKCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJfczsK CXN0cnVjdCBzb2NrYWRkciAqYWRkcjsKCXNvY2tsZW5fdCBsOwoKCWFzc2Vy dChzb2NrID49IDApOwoKCXByaW50ZigiU3RhcnRpbmcgc2VydmVyIHRocmVh ZCwgZXhlY3V0aW5nIFwiYWNjZXB0XCJcbiIpOwoKCWFkZHIgPSAodm9pZCop JmFkZHJfczsKCWwgPSBzaXplb2YgYWRkcl9zOwoJZmQgPSBhY2NlcHQoc29j aywgYWRkciwgJmwpOwoJaWYgKGZkIDwgMCkKCXsKCQlwcmludGYoICJBY2Nl cHRlZCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwoJfQoJZWxz ZQoJewoJCXByaW50ZiggImFjY2VwdGVkIGZkICVkXG4iLCBmZCk7CgkJLy9o dHRwX3Byb2Nlc3MgKHJlbW92ZWQpCgkJcHJpbnRmKCAic2h1dHRpbmcgZmQg JWRcbiIsIGZkKTsKCQlqID0gc2h1dGRvd24oZmQsIFNIVVRfV1IpOwoJCWlm ICghKChqKSA9PSAwIHx8IGVycm5vID09IEVDT05OUkVTRVQgfHwgZXJybm8g PT0gRU5PVENPTk4pKQoJCQlwcmludGYoICJTaHV0ZG93biBmYWlsZWQ6ICVz XG4iLCBzdHJlcnJvcihlcnJubykpOwoJCQoJCWkgPSBjbG9zZShmZCk7CgkJ cHJpbnRmKCAiY2xvc2VkIGZkICVkXG4iLCBmZCk7CgkJYXNzZXJ0ICgoKGkp ID09IDAgfHwgZXJybm8gPT0gRUNPTk5SRVNFVCB8fCBlcnJubyA9PSBFTk9U Q09OTikpOwoJfQoJCglwcmludGYoIkVuZGluZyB0aHJlYWRcbiIpOwoJcmV0 dXJuIChOVUxMKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAq IE1haW4KICovCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7 CglpZihhcmdjIT0yKQoJewoJCXByaW50ZigiJXMgPHNlY29uZHM+XG4iLGFy Z3ZbMF0pOwoJCXJldHVybjsKCX0KCWVsc2UKCXsKCQlzZWNvbmRzPWF0b2ko YXJndlsxXSk7Cgl9CgoJcHJpbnRmKCAiU3RhcnQgbWFpblxuIik7Cglzb2Nr ID0gbGlzdGVuX3BvcnQoKTsKCWlmIChzb2NrID49IDApICB7CgkJaWYgKGxp c3Rlbihzb2NrLCAxKSAhPSAwKSB7CgkJCXBlcnJvcigibGlzdGVuKCkiKTsK CQkJKHZvaWQpY2xvc2Uoc29jayk7CgkJCXJldHVybiAoLTEpOwoJCX0KCX0K CglzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyX3M7Cglzb2NrbGVuX3Qg bDsKCglsID0gc2l6ZW9mIGFkZHJfczsKCWdldHNvY2tuYW1lKHNvY2ssICh2 b2lkICopJmFkZHJfcywgJmwpOwoJCglpbnQgaTsKCWNoYXIgYWFkZHJbMzJd OwoJY2hhciBhcG9ydFszMl07CgoJaSA9IGdldG5hbWVpbmZvKChjb25zdCB2 b2lkICopJmFkZHJfcywgbCwgYWFkZHIsIHNpemVvZiBhYWRkciwgYXBvcnQs IHNpemVvZiBhcG9ydCxOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJW KTsKCWlmIChpKSB7CgkJcHJpbnRmKCJnZXRuYW1laW5mbyA9ICVkICVzXG4i LCBpLCBnYWlfc3RyZXJyb3IoaSkpOwoJCXJldHVybjsKCX0KCQoJcHJpbnRm KCAiT3BlbmluZyBzb2NrZXQgb24gJXMgJXNcbiIsIGFhZGRyLCBhcG9ydCk7 CgoJcHRocmVhZF90IHRocjsKCWludCByYzsKCWxvbmcgdDsKCglwcmludGYo Ik1haW46IENyZWF0aW5nIHRocmVhZFxuIiwgdCk7CglyYyA9IHB0aHJlYWRf Y3JlYXRlKCZ0aHIsIE5VTEwsIHNlcnZlcl90aHJlYWQsICh2b2lkICopdCk7 CglpZiAocmMpCgl7CgkJcHJpbnRmKCJFUlJPUjsgcmV0dXJuIGNvZGUgZnJv bSBwdGhyZWFkX2NyZWF0ZSgpIGlzICVkXG4iLCByYyk7CgkJZXhpdCgtMSk7 Cgl9CgkKCXByaW50ZigiU3RhcnQgc2xlZXBcbiIpOwoJc2xlZXAoc2Vjb25k cyk7CglwcmludGYoIkVuZCBzbGVlcFxuIik7CgkKCXByaW50ZigicHRocmVh ZF9jYW5jZWxcbiIpOwoJKHZvaWQpcHRocmVhZF9jYW5jZWwodGhyKTsKCS8v KHZvaWQpcHRocmVhZF9raWxsKHRocixTSUdVU1IxKTsKCgl2b2lkICpyZXM7 CgoJcHJpbnRmKCJXYWl0aW5nIGZvciBzZXJ2ZXJcbiIpOwoJcmM9cHRocmVh ZF9qb2luKHRociwgJnJlcyk7CglpZiAocmMpCgl7CgkJcHJpbnRmKCJFUlJP UjsgcmV0dXJuIGNvZGUgZnJvbSBwdGhyZWFkX2pvaW4oKSBpcyAlZFxuIiwg cmMpOwoJfQoJaWYgKHJlcyAhPSBOVUxMKQoJCXByaW50ZiggIlNlcnZlciBy ZXR1cm5lZCBcIiVwXCJcbiIsKGNoYXIgKilyZXMpOwoJCSAgICAKCWludCBq OwkKCWogPSBjbG9zZShzb2NrKTsKCWFzc2VydCAoKChqKSA9PSAwIHx8IGVy cm5vID09IEVDT05OUkVTRVQgfHwgZXJybm8gPT0gRU5PVENPTk4pKTsKCglw cmludGYoIkVuZCBtYWluXG4iKTsKCXJldHVybjsKfQo= --00163631008dfe79ce049ad8e956 Content-Type: text/plain; charset=us-ascii -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple --00163631008dfe79ce049ad8e956--