bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: bug in libpthreads


From: Thomas Schwinge
Subject: Re: bug in libpthreads
Date: Fri, 11 May 2012 14:53:39 +0800
User-agent: Notmuch/0.9-101-g81dad07 (http://notmuchmail.org) Emacs/23.3.1 (x86_64-pc-linux-gnu)

Hi!

On Thu, 10 May 2012 17:38:26 -0700 (PDT), Thomas Thomas <ricinwich@yahoo.com> 
wrote:
> In function initialize_pthread in file pthread/pt-alloc.c, you need to
> initialize the value of have_kernel_resources to zero if the thread
> structure is not recycled. Following the logic of
> __pthread_create_internal: we go from __pthread_alloc to
> __pthread_thread_alloc without touching have_kernel_resources.
> 
> Then, __pthread_thread_alloc exits immediately if
> have_kernel_resources is non-zero: not good if we haven't
> actually allocated these resources.
> 
> Sorry this isn't a patch, but it is only a one line fix,

In the t/fix_have_kernel_resources branch, I have a preliminary patch
(from April 2009...) for that issue, inlined below; would you like to
pursue that issue further?

Subject: [PATCH, UNFINISHED] Fix handling of have_kernel_resources on Mach/Hurd.

From: Thomas Schwinge <thomas@schwinge.name>

<http://lists.gnu.org/archive/html/bug-hurd/2009-04/msg00028.html>

Further comments by Neal:

<neal> do you want a reply on the libpthread one inline?
<neal> the short answer is: yes, that's a bug
<neal> unfortunately, your fix is not enough
<neal> the predicate controls two resources: the wakeup port and the thread
  itself
<tschwinge> Oh, right, I see.
<neal> also, there may be a race:
<neal> set the predicate to free, then kill the thread
<neal> that's not so good
<neal> so a proper solution requires a bit more thought
<tschwinge> I think I wondered about that as well.  But isn't there the same
  problem with Viengoos?
<neal> it is difficult as cleanly committing suicide is hard :-)
<neal> could be
<neal> on viengoos, I don't actually deallocate the thread in pt-thread-halt.c
<neal> I just call suspend
<neal> the thread is only deallocated in pt-thread-dealloc.c

---
 sysdeps/mach/hurd/pt-init-specific.c |   29 +++++++++++++++++++++++++++++
 sysdeps/mach/pt-thread-dealloc.c     |    2 ++
 sysdeps/mach/pt-thread-halt.c        |   19 +++++++++++++++++--
 3 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/sysdeps/mach/hurd/pt-init-specific.c 
b/sysdeps/mach/hurd/pt-init-specific.c
new file mode 100644
index 0000000..506527d
--- /dev/null
+++ b/sysdeps/mach/hurd/pt-init-specific.c
@@ -0,0 +1,29 @@
+/* __pthread_init_specific.  Hurd on Mach version.
+   Copyright (C) 2002, 2009 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <pthread.h>
+#include <pt-internal.h>
+
+error_t
+__pthread_init_specific (struct __pthread *thread)
+{
+  thread->thread_specifics = 0;
+  thread->have_kernel_resources = 0;
+  return 0;
+}
diff --git a/sysdeps/mach/pt-thread-dealloc.c b/sysdeps/mach/pt-thread-dealloc.c
index 55d8c4d..0c4a4fc 100644
--- a/sysdeps/mach/pt-thread-dealloc.c
+++ b/sysdeps/mach/pt-thread-dealloc.c
@@ -38,4 +38,6 @@ __pthread_thread_dealloc (struct __pthread *thread)
      assert.  */
   __mach_port_destroy (__mach_task_self (),
                       thread->wakeupmsg.msgh_remote_port);
+
+  thread->have_kernel_resources = 0;
 }
diff --git a/sysdeps/mach/pt-thread-halt.c b/sysdeps/mach/pt-thread-halt.c
index 973cde1..a9c3858 100644
--- a/sysdeps/mach/pt-thread-halt.c
+++ b/sysdeps/mach/pt-thread-halt.c
@@ -32,6 +32,21 @@
 void
 __pthread_thread_halt (struct __pthread *thread)
 {
-  error_t err = __thread_terminate (thread->kernel_thread);
-  assert_perror (err);
+  if (thread->have_kernel_resources)
+    {
+      if (thread == _pthread_self ())
+       {
+         while (1)
+           {
+             error_t err = __thread_suspend (thread->kernel_thread);
+             assert_perror (err);
+             assert (! "Failed to suspend self.");
+           }
+       }
+      else
+       {
+         error_t err = __thread_terminate (thread->kernel_thread);
+         assert_perror (err);
+       }
+    }
 }
-- 
tg: (081c7ae..) t/fix_have_kernel_resources (depends on: master)


Grüße,
 Thomas

Attachment: pgp_fCa7ZdYUb.pgp
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]