From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id F18CF3858410; Mon, 22 Jan 2024 09:57:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F18CF3858410 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cygwin.com; s=default; t=1705917470; bh=Lw/1E1JFoujRbs8o+jVd09iq64LaEBfCObutDg0IXGE=; h=Date:From:To:Subject:Reply-To:References:In-Reply-To:From; b=xeRg9IcsgCmG67lgzyupJLNR308shXWhn1fNa/XwtrksBUzW+qeQ36M/UHML5Gl3H NiWTyyOQCI7Ig8wZHkkqXSNWoG+B2RK3NiqLs47mw+YvrNu/TmiRi0QBe7ImKy+zmo l0ix8jLWFq8cSz5O508pxjeVc/x4REK0AVYsxdCs= Received: by calimero.vinschen.de (Postfix, from userid 500) id B2A5EA80733; Mon, 22 Jan 2024 10:57:48 +0100 (CET) Date: Mon, 22 Jan 2024 10:57:48 +0100 From: Corinna Vinschen To: cygwin@cygwin.com Subject: Re: Possiblly bug of cygwin1.dll Message-ID: Reply-To: cygwin@cygwin.com Mail-Followup-To: cygwin@cygwin.com References: <20240119224436.876a055f356f7c6796bc725b@nifty.ne.jp> <20240120131825.4157c259fe058155137d6fe0@nifty.ne.jp> <20240120141349.cde31e62177a0405b0ee9934@nifty.ne.jp> <87v87ov03x.fsf@Gerda.invalid> <20240120212427.1e69fd3655ece73ecd508def@nifty.ne.jp> <20240121201051.795a4405576a97ab8729e273@nifty.ne.jp> <87fryqizl3.fsf@> <20240122123023.b8eaac0e50d1e8856f44a115@nifty.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: List-Id: On Jan 22 10:25, Corinna Vinschen via Cygwin wrote: > On Jan 22 12:30, Takashi Yano via Cygwin wrote: > > PATCH2: (for cygwin) > > Avoid handle leak caused when non-static pthread_once_t is initialized > > with PTHREAD_ONCE_INIT > > diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc > > index 7bb4f9fc8..127569160 100644 > > --- a/winsup/cygwin/thread.cc > > +++ b/winsup/cygwin/thread.cc > > @@ -2060,6 +2060,9 @@ pthread::once (pthread_once_t *once_control, void (*init_routine) (void)) > > { > > init_routine (); > > once_control->state = 1; > > + pthread_mutex_unlock (&once_control->mutex); > > + while (pthread_mutex_destroy (&once_control->mutex) == EBUSY); > > + return 0; > > } > > /* Here we must remove our cancellation handler */ > > pthread_mutex_unlock (&once_control->mutex); > > I see what you're doing here. Wouldn't it be simpler, though, to do this? > > diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc > index 7bb4f9fc8341..7ec3aace395d 100644 > --- a/winsup/cygwin/thread.cc > +++ b/winsup/cygwin/thread.cc > @@ -2063,6 +2063,7 @@ pthread::once (pthread_once_t *once_control, void (*init_routine) (void)) > } > /* Here we must remove our cancellation handler */ Strange enough, this comment accompanies the code since its inception in 2001. It says explicitly "remove" the cancellation handler. That sounds like the idea was right, just the programmer forgot about it afterwards... > pthread_mutex_unlock (&once_control->mutex); > + while (pthread_mutex_destroy (&once_control->mutex) == EBUSY); > return 0; > } Corinna