|  | @@ -29,13 +29,12 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #if HAVE___THREAD
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -extern pthread_barrier_t b;
 | 
	
		
			
				|  |  | +static pthread_barrier_t* b = NULL;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define TOTAL_SIGS 1000
 | 
	
		
			
				|  |  | -extern int nsigs;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -extern sem_t s;
 | 
	
		
			
				|  |  | +static int* nsigs = NULL;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +static sem_t* s = NULL;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static __thread void (*fp) (void);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -52,17 +51,30 @@ handler (int sig)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    fp ();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if (sem_post (&s) != 0)
 | 
	
		
			
				|  |  | +  if (sem_post (s) != 0)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |        write (STDOUT_FILENO, "sem_post failed\n", 16);
 | 
	
		
			
				|  |  |        _exit (1);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void
 | 
	
		
			
				|  |  | +setup_tf (pthread_barrier_t* t_b, int* t_nsigs, sem_t* t_s)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  b = t_b;
 | 
	
		
			
				|  |  | +  nsigs = t_nsigs;
 | 
	
		
			
				|  |  | +  s = t_s;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void *
 | 
	
		
			
				|  |  |  tf (void *arg)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | +  if (!b || !s || !nsigs)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +      puts ("need to call setup_tf first");
 | 
	
		
			
				|  |  | +      exit (1);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    if ((uintptr_t) pthread_self () & (TCB_ALIGNMENT - 1))
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |        puts ("thread's struct pthread not aligned enough");
 | 
	
	
		
			
				|  | @@ -71,18 +83,18 @@ tf (void *arg)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (fp != NULL)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  | -printf("fp=%p\n", (void *)&fp);
 | 
	
		
			
				|  |  | +      printf("fp=%p\n", (void *)&fp);
 | 
	
		
			
				|  |  |        puts ("fp not initially NULL");
 | 
	
		
			
				|  |  |        exit (1);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    fp = arg;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  pthread_barrier_wait (&b);
 | 
	
		
			
				|  |  | +  pthread_barrier_wait (b);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  pthread_barrier_wait (&b);
 | 
	
		
			
				|  |  | +  pthread_barrier_wait (b);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if (nsigs != TOTAL_SIGS)
 | 
	
		
			
				|  |  | +  if (*nsigs != TOTAL_SIGS)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |        puts ("barrier_wait prematurely returns");
 | 
	
		
			
				|  |  |        exit (1);
 |