about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2006-08-01 06:40:11 +0000
committerUlrich Drepper <drepper@redhat.com>2006-08-01 06:40:11 +0000
commita1260d92a7e3c11e1db74ad7007332f87fc1b690 (patch)
tree0690bdd3500e1dcc2b72ad8cd35b2a69de74dc79
parent13669f2c304545de194ec014255b5e3141615ac1 (diff)
downloadglibc-a1260d92a7e3c11e1db74ad7007332f87fc1b690.tar.gz
glibc-a1260d92a7e3c11e1db74ad7007332f87fc1b690.tar.xz
glibc-a1260d92a7e3c11e1db74ad7007332f87fc1b690.zip
* stdlib/test-canon.c (do_test): Close fd before unlinking file so
	that directory is empty even on non-POSIX filesystems.
-rw-r--r--ChangeLog5
-rw-r--r--nptl/Makefile2
-rw-r--r--nptl/allocatestack.c11
-rw-r--r--nptl/tst-getpid3.c114
-rw-r--r--stdlib/test-canon.c8
5 files changed, 134 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 6c2107cb68..3519b5ebfd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-07-20  Adam Nemet  <anemet@caviumnetworks.com>
+
+	* stdlib/test-canon.c (do_test): Close fd before unlinking file so
+	that directory is empty even on non-POSIX filesystems.
+
 2006-07-31  Ulrich Drepper  <drepper@redhat.com>
 
 	* elf/dl-open.c (dl_open_worker): Add branch prediction.
diff --git a/nptl/Makefile b/nptl/Makefile
index 4023e46199..d0f8286fb8 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -256,7 +256,7 @@ tests = tst-typesizes \
 	tst-backtrace1 \
 	tst-oddstacklimit \
 	tst-vfork1 tst-vfork2 tst-vfork1x tst-vfork2x \
-	tst-getpid1 tst-getpid2 \
+	tst-getpid1 tst-getpid2 tst-getpid3 \
 	tst-initializers1 $(patsubst %,tst-initializers1-%,c89 gnu89 c99 gnu99)
 xtests = tst-setuid1 tst-setuid1-static
 
diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
index a3ed1a33d3..4a1cd18481 100644
--- a/nptl/allocatestack.c
+++ b/nptl/allocatestack.c
@@ -742,9 +742,7 @@ __reclaim_stacks (void)
   list_t *runp;
   list_for_each (runp, &stack_used)
     {
-      struct pthread *curp;
-
-      curp = list_entry (runp, struct pthread, list);
+      struct pthread *curp = list_entry (runp, struct pthread, list);
       if (curp != self)
 	{
 	  /* This marks the stack as free.  */
@@ -758,6 +756,13 @@ __reclaim_stacks (void)
 	}
     }
 
+  /* Reset the PIDs in any cached stacks.  */
+  list_for_each (runp, &stack_cache)
+    {
+      struct pthread *curp = list_entry (runp, struct pthread, list);
+      curp->pid = self->pid;
+    }
+
   /* Add the stack of all running threads to the cache.  */
   list_splice (&stack_used, &stack_cache);
 
diff --git a/nptl/tst-getpid3.c b/nptl/tst-getpid3.c
new file mode 100644
index 0000000000..f1e77f6b10
--- /dev/null
+++ b/nptl/tst-getpid3.c
@@ -0,0 +1,114 @@
+#include <errno.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+
+static pid_t pid;
+
+static void *
+pid_thread (void *arg)
+{
+  if (pid != getpid ())
+    {
+      printf ("pid wrong in thread: should be %d, is %d\n",
+	      (int) pid, (int) getpid ());
+      return (void *) 1L;
+    }
+
+  return NULL;
+}
+
+static int
+do_test (void)
+{
+  pid = getpid ();
+
+  pthread_t thr;
+  int ret = pthread_create (&thr, NULL, pid_thread, NULL);
+  if (ret)
+    {
+      printf ("pthread_create failed: %d\n", ret);
+      return 1;
+    }
+
+  void *thr_ret;
+  ret = pthread_join (thr, &thr_ret);
+  if (ret)
+    {
+      printf ("pthread_create failed: %d\n", ret);
+      return 1;
+    }
+  else if (thr_ret)
+    {
+      printf ("thread getpid failed\n");
+      return 1;
+    }
+
+  pid_t child = fork ();
+  if (child == -1)
+    {
+      printf ("fork failed: %m\n");
+      return 1;
+    }
+  else if (child == 0)
+    {
+      if (pid == getpid ())
+	{
+	  puts ("pid did not change after fork");
+	  exit (1);
+	}
+
+      pid = getpid ();
+      ret = pthread_create (&thr, NULL, pid_thread, NULL);
+      if (ret)
+	{
+	  printf ("pthread_create failed: %d\n", ret);
+	  return 1;
+	}
+
+      ret = pthread_join (thr, &thr_ret);
+      if (ret)
+	{
+	  printf ("pthread_create failed: %d\n", ret);
+	  return 1;
+	}
+      else if (thr_ret)
+	{
+	  printf ("thread getpid failed\n");
+	  return 1;
+	}
+
+      return 0;
+    }
+
+  int status;
+  if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child)
+    {
+      puts ("waitpid failed");
+      kill (child, SIGKILL);
+      return 1;
+    }
+
+  if (!WIFEXITED (status))
+    {
+      if (WIFSIGNALED (status))
+	printf ("died from signal %s\n", strsignal (WTERMSIG (status)));
+      else
+	puts ("did not terminate correctly");
+      return 1;
+    }
+  if (WEXITSTATUS (status) != 0)
+    {
+      printf ("exit code %d\n", WEXITSTATUS (status));
+      return 1;
+    }
+
+  return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/stdlib/test-canon.c b/stdlib/test-canon.c
index 54267465b8..9261898795 100644
--- a/stdlib/test-canon.c
+++ b/stdlib/test-canon.c
@@ -1,5 +1,6 @@
 /* Test program for returning the canonical absolute name of a given file.
-   Copyright (C) 1996,1997,2000,2002,2004,2005 Free Software Foundation, Inc.
+   Copyright (C) 1996,1997,2000,2002,2004,2005,2006
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by David Mosberger <davidm@azstarnet.com>.
 
@@ -213,7 +214,10 @@ do_test (int argc, char ** argv)
     }
 
   if (fd >= 0)
-    unlink ("doesExist/someFile");
+    {
+      close (fd);
+      unlink ("doesExist/someFile");
+    }
 
   if (has_dir)
     rmdir ("doesExist");