puts ("spin_trylock succeeded");
puts ("1st spin_trylock succeeded");
main (void){  size_t ps = sysconf (_SC_PAGESIZE);  char tmpfname[] = "/tmp/tst-spin2.XXXXXX";  char data[ps];  void *mem;  int fd;  pthread_spinlock_t *s;  pid_t pid;  char *p;  int err;  fd = mkstemp (tmpfname);  if (fd == -1)    {      printf ("cannot open temporary file: %m\n");      exit (1);    }  /* Make sure it is always removed.  */  unlink (tmpfname);  /* Create one page of data.  */  memset (data, '\0', ps);  /* Write the data to the file.  */  if (write (fd, data, ps) != ps)    {      puts ("short write");      exit (1);    }  mem = mmap (NULL, ps, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);  if (mem == MAP_FAILED)    {      printf ("mmap failed: %m\n");      exit (1);    }  s = (pthread_spinlock_t *) (((uintptr_t) mem			       + __alignof (pthread_spinlock_t))			      & ~(__alignof (pthread_spinlock_t) - 1));  p = (char *) (s + 1);  if (pthread_spin_init (s, PTHREAD_PROCESS_SHARED) != 0)    {      puts ("spin_init failed");      exit (1);    }  if (pthread_spin_lock (s) != 0)    {      puts ("spin_lock failed");      exit (1);    }  err = pthread_spin_trylock (s);  if (err == 0)    {      puts ("spin_trylock succeeded");      exit (1);    }  else if (err != EBUSY)    {      puts ("spin_trylock didn't return EBUSY");      exit (1);    }  *p = 0;  puts ("going to fork now");  pid = fork ();  if (pid == -1)    {      puts ("fork failed");      exit (1);    }  else if (pid == 0)    {      /* Play some lock ping-pong.  It's our turn to unlock first.  */      if ((*p)++ != 0)	{	  puts ("child: *p != 0");	  exit (1);	}      if (pthread_spin_unlock (s) != 0)	{	  puts ("child: 1st spin_unlock failed");	  exit (1);	}      puts ("child done");    }  else    {      if (pthread_spin_lock (s) != 0)	{	  puts ("parent: 2nd spin_lock failed");	  exit (1);	}      puts ("waiting for child");      waitpid (pid, NULL, 0);      puts ("parent done");    }  exit (0);}