From owner-freebsd-threads@FreeBSD.ORG Thu Aug 19 14:42:20 2010 Return-Path: Delivered-To: freebsd-threads@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 499561065694; Thu, 19 Aug 2010 14:42:20 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from mail.zoral.com.ua (mx0.zoral.com.ua [91.193.166.200]) by mx1.freebsd.org (Postfix) with ESMTP id DA7D88FC08; Thu, 19 Aug 2010 14:42:19 +0000 (UTC) Received: from deviant.kiev.zoral.com.ua (root@deviant.kiev.zoral.com.ua [10.1.1.148]) by mail.zoral.com.ua (8.14.2/8.14.2) with ESMTP id o7JEgI3B047347 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 19 Aug 2010 17:42:18 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: from deviant.kiev.zoral.com.ua (kostik@localhost [127.0.0.1]) by deviant.kiev.zoral.com.ua (8.14.4/8.14.4) with ESMTP id o7JEgIwZ000239; Thu, 19 Aug 2010 17:42:18 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: (from kostik@localhost) by deviant.kiev.zoral.com.ua (8.14.4/8.14.4/Submit) id o7JEgIwF000238; Thu, 19 Aug 2010 17:42:18 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: deviant.kiev.zoral.com.ua: kostik set sender to kostikbel@gmail.com using -f Date: Thu, 19 Aug 2010 17:42:18 +0300 From: Kostik Belousov To: David Xu Message-ID: <20100819144218.GH2396@deviant.kiev.zoral.com.ua> References: <4C6926D0.2020909@freebsd.org> <20100816082022.GO2396@deviant.kiev.zoral.com.ua> <4C696A96.7020709@freebsd.org> <20100816104303.GP2396@deviant.kiev.zoral.com.ua> <4C6AA092.40708@freebsd.org> <4C6BE0F7.10207@freebsd.org> <20100818100403.GS2396@deviant.kiev.zoral.com.ua> <4C6C6184.9030602@freebsd.org> <20100819083809.GC2396@deviant.kiev.zoral.com.ua> <4C6D6384.7080506@freebsd.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="EZN6irWB3fS+DSGO" Content-Disposition: inline In-Reply-To: <4C6D6384.7080506@freebsd.org> User-Agent: Mutt/1.4.2.3i X-Virus-Scanned: clamav-milter 0.95.2 at skuns.kiev.zoral.com.ua X-Virus-Status: Clean Cc: freebsd-threads@freebsd.org Subject: Re: PTHREAD_CANCEL_DEFERRED X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 19 Aug 2010 14:42:20 -0000 --EZN6irWB3fS+DSGO Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Aug 19, 2010 at 05:01:56PM +0000, David Xu wrote: > Kostik Belousov wrote: > >On Thu, Aug 19, 2010 at 06:41:08AM +0800, David Xu wrote: > >>Kostik Belousov wrote: > >>>On Wed, Aug 18, 2010 at 01:32:39PM +0000, David Xu wrote: > >>>=20 > >>>>David Xu wrote: > >>>> =20 > >>>>>My idea is to always let close() syscall run, until it will be > >>>>>blocked by lower layer, e.g tty or socket layer, as manual of close() > >>>>>said it always release the file descriptor despite whether > >>>>>it returns EINTR or EWOULDBLOCK, when it is going to sleep, > >>>>>a flag will cause it to abort the sleep. > >>>>>if the thread does not found the flag at that time, > >>>>>a latter signal SIGCANCEL sent by pthread_cancel will unblock it, > >>>>>this is how signal works. > >>>>> > >>>>> =20 > >>>>I have worked out a patch: > >>>>http://people.freebsd.org/~davidxu/patch/thread_cancel.patch > >>>> > >>>> =20 > >>>Ok, the patch is definitely better then my proposal. But it has several > >>>details that seems to need correction. > >>> > >>>First, if TDP_WAKEUP-marked thread receives any non-cancellation signa= l, > >>>then a syscall returns with EINTR. This breaks SA_RESTART. > >>> > >>>=20 > >>I don't think it breaks SA_RESTART, there are reasons this is allowed: > >I think I need to be more verbose. What I am saying is that if the > >posted signal is not SIGCANCEL, then the sleepq_catch_signal() change > >does two things wrong, IMO: > >1. it will return EINTR while the signal marked as SA_RESTART interrupted > > restartable syscall. > >2. TDP_WAKEUP should not be cleared for this case, since we should > > still be prepared for special handling of SIGCANCEL, if it arrives. > >In other words, I propose to clear TDP_WAKEUP only when the posted=20 > >signal is SIGCANCEL. > > >=20 > TDP_WAKEUP is only set by the current thread itself, it is unrelated to > any signal, it is that current libthr library code is acting upon the=20 > cancellation request for its user code, POSIX explicitly said EINTR > should be returned for cancellation. >=20 > libthr installs a signal handler for signal 32, other threads just > sends the signal to a target thread which should be canceled, the target= =20 > thread than sets TDP_WAKEUP for itself in signal 32 handler, it is used > to unblock next syscall which is a cancellation point from pthread view. >=20 > SIGCANCEL should not be treated specially by kernel, kernel should not > know it is a pthread application, non-threaded application should use > signal 32 without any side effect. Having a pthread knowledge in kernel > is crappy, no kernel function should know there is a concept called > cancellation point. >=20 >=20 What would happen in the following situation: thr_wake() is called; some syscall is started executing and slept, assume that SA_RESTART is for SIGHUP (just an example); SIGHUP is sent to the process and the thread is selected for delivery, also assume that handler is installed. As I understand, in this situation, EINTR is returned from syscall. --EZN6irWB3fS+DSGO Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (FreeBSD) iEYEARECAAYFAkxtQskACgkQC3+MBN1Mb4iRAACcC+9YtU4JD4npsDITskt4jsjP 2kUAoMkQ8K5/Mu7xJM4OXV/mNjd5NlON =/biT -----END PGP SIGNATURE----- --EZN6irWB3fS+DSGO--