* stdlib/test-canon.c (do_test): Close fd before unlinking file so
authorUlrich Drepper <drepper@redhat.com>
Tue, 1 Aug 2006 06:40:11 +0000 (06:40 +0000)
committerUlrich Drepper <drepper@redhat.com>
Tue, 1 Aug 2006 06:40:11 +0000 (06:40 +0000)
that directory is empty even on non-POSIX filesystems.

ChangeLog
nptl/Makefile
nptl/allocatestack.c
nptl/tst-getpid3.c [new file with mode: 0644]
stdlib/test-canon.c

index 6c2107c..3519b5e 100644 (file)
--- 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.
index 4023e46..d0f8286 100644 (file)
@@ -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
 
index a3ed1a3..4a1cd18 100644 (file)
@@ -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 (file)
index 0000000..f1e77f6
--- /dev/null
@@ -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"
index 5426746..9261898 100644 (file)
@@ -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");