mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	2007-08-21 Ulrich Drepper <drepper@redhat.com> [BZ #4938] * allocatestack.c (__reclaim_stacks): Clear the TSD in the reclaimed stack if necessary. * Makefile (tests): Add tst-tsd6. * tst-tsd6.c: New file.
		
			
				
	
	
		
			90 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <errno.h>
 | 
						|
#include <pthread.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <sys/wait.h>
 | 
						|
 | 
						|
#define NKEYS 100
 | 
						|
static pthread_key_t keys[NKEYS];
 | 
						|
static pthread_barrier_t b;
 | 
						|
 | 
						|
 | 
						|
static void *
 | 
						|
tf (void *arg)
 | 
						|
{
 | 
						|
  void *res = NULL;
 | 
						|
  for (int i = 0; i < NKEYS; ++i)
 | 
						|
    {
 | 
						|
      void *p = pthread_getspecific (keys[i]);
 | 
						|
      pthread_setspecific (keys[i], (void *) 7);
 | 
						|
      if (p != NULL)
 | 
						|
	res = p;
 | 
						|
    }
 | 
						|
  if (arg != NULL)
 | 
						|
    {
 | 
						|
      pthread_barrier_wait (arg);
 | 
						|
      pthread_barrier_wait (arg);
 | 
						|
    }
 | 
						|
  return res;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
static int
 | 
						|
do_test (void)
 | 
						|
{
 | 
						|
  pthread_barrier_init (&b, NULL, 2);
 | 
						|
 | 
						|
  for (int i = 0; i < NKEYS; ++i)
 | 
						|
    if (pthread_key_create (&keys[i], NULL) != 0)
 | 
						|
      {
 | 
						|
	puts ("cannot create keys");
 | 
						|
	return 1;
 | 
						|
      }
 | 
						|
 | 
						|
  pthread_t th;
 | 
						|
  if (pthread_create (&th, NULL, tf, &b) != 0)
 | 
						|
    {
 | 
						|
      puts ("cannot create thread in parent");
 | 
						|
      return 1;
 | 
						|
    }
 | 
						|
 | 
						|
  pthread_barrier_wait (&b);
 | 
						|
 | 
						|
  pid_t pid = fork ();
 | 
						|
  if (pid == 0)
 | 
						|
    {
 | 
						|
      if (pthread_create (&th, NULL, tf, NULL) != 0)
 | 
						|
	{
 | 
						|
	  puts ("cannot create thread in child");
 | 
						|
	  exit (1);
 | 
						|
	}
 | 
						|
 | 
						|
      void *res;
 | 
						|
      pthread_join (th, &res);
 | 
						|
 | 
						|
      exit (res != NULL);
 | 
						|
    }
 | 
						|
  else if (pid == -1)
 | 
						|
    {
 | 
						|
      puts ("cannot create child process");
 | 
						|
      return 1;
 | 
						|
    }
 | 
						|
 | 
						|
  int s;
 | 
						|
  if (TEMP_FAILURE_RETRY (waitpid (pid, &s, 0)) != pid)
 | 
						|
    {
 | 
						|
      puts ("failing to wait for child process");
 | 
						|
      return 1;
 | 
						|
    }
 | 
						|
 | 
						|
  pthread_barrier_wait (&b);
 | 
						|
  pthread_join (th, NULL);
 | 
						|
 | 
						|
  return !WIFEXITED (s) ? 2 : WEXITSTATUS (s);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#define TEST_FUNCTION do_test ()
 | 
						|
#include "../test-skeleton.c"
 |