glibc/linuxthreads/tst-cancel.c
Ulrich Drepper d347a4ab1d Update.
2003-07-31  Jakub Jelinek  <jakub@redhat.com>

	* dlfcn/dlerror.c (once): New.
	(dlerror): Call __libc_once.
	(_dlerror_run): Remove once.

2003-07-31  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/ia64/bits/sigcontext.h (struct sigcontext):
	Sync with 2.5.7 and 2.5.73 kernel changes.

2003-07-31  Jakub Jelinek  <jakub@redhat.com>

	* dlfcn/eval.c (funcall): Add noinline attribute to shut up warnings.
	* elf/rtld.c (dl_main): Cast ElfW(Addr) arguments with %Zx/%Zd
	formats to size_t.
	* elf/dl-lookup.c (_dl_debug_bindings): Likewise.
	* elf/tst-tls6.c (do_test): Use %zd format for l_tls_modid.
	* elf/tst-tls8.c (do_test): Use %zd format for modid1 and modid2.
	* gmon/tst-sprofil.c (main): Add parens to shut up warning.
	* iconv/tst-iconv3.c (main): Use %td instead of %zd for pointer
	difference argument.
	* stdio-common/tst-wc-printf.c (main): Cast arguments with %C
	format to wint_t.
	* stdlib/tst-limits.c (main): For WORD_BIT and LONG_BIT, use
	%d format and cast expected value to int.
	* sysdeps/generic/libc-start.c (STATIC): Add
	__attribute__((always_inline) if LIBC_START_MAIN is already defined.
	* sysdeps/powerpc/fpu/w_sqrt.c (a_nan, a_inf): Change from uint32_t
	to ieee_float_shape_type.
	(__sqrt): Avoid type punning.
	* sysdeps/powerpc/fpu/w_sqrtf.c (a_nan, a_inf): Change from uint32_t
	to ieee_float_shape_type.
	(__sqrtf): Avoid type punning.
	* sysdeps/s390/s390-32/dl-machine.h (elf_machine_rela): Don't define
	refsym if in dl-conflict.c.
	* sysdeps/s390/s390-64/dl-machine.h (elf_machine_rela): Likewise.
	* sysdeps/unix/sysv/linux/i386/semctl.c (union semun): Add __old_buf.
	(__new_semctl): Shut up warning.
	* sysdeps/unix/sysv/linux/semctl.c (union semun): Add __old_buf.
	(__new_semctl): Shut up warning.
	* sysdeps/unix/sysv/linux/shmctl.c (__new_shmctl): Wrap long lines.
	Change old into union of __old_shmid_ds and __old_shminfo structs.
	Adjust all users.
	* wcsmbs/wcsmbs-tst1.c (main): Cast arguments with %C format to wint_t.

2003-07-31  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/utimes.c (__utimes): Fix actime and
	modtime computation.
	* sysdeps/unix/sysv/linux/futimes.c (__futimes): Likewise.
	* sysdeps/posix/utimes.c (__utimes): Likewise.
2003-07-31 19:26:38 +00:00

215 lines
3.8 KiB
C

/* Tests for cancelation handling. */
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
int fd;
pthread_barrier_t bar;
#ifdef NOT_YET
static void
cleanup (void *arg)
{
int nr = (int) (long int) arg;
char s[30];
char *cp = stpcpy (s, "cleanup ");
*cp++ = '0' + nr;
*cp++ = '\n';
__libc_lseek (fd, 0, SEEK_END);
__libc_write (fd, s, cp - s);
}
static void *
t1 (void *arg)
{
pthread_cleanup_push (cleanup, (void *) (long int) 1);
return NULL;
pthread_cleanup_pop (0);
}
static void
inner (int a)
{
pthread_cleanup_push (cleanup, (void *) (long int) a);
if (a)
return;
pthread_cleanup_pop (0);
}
static void *
t2 (void *arg)
{
pthread_cleanup_push (cleanup, (void *) (long int) 2);
inner ((int) (long int) arg);
return NULL;
pthread_cleanup_pop (0);
}
#endif
/* This does not work yet. */
volatile int cleanupokcnt;
static void
cleanupok (void *arg)
{
++cleanupokcnt;
}
#ifdef NOT_YET
static void *
t3 (void *arg)
{
pthread_cleanup_push (cleanupok, (void *) (long int) 4);
inner ((int) (long int) arg);
pthread_exit (NULL);
pthread_cleanup_pop (0);
}
#endif
static void
innerok (int a)
{
pthread_cleanup_push (cleanupok, (void *) (long int) a);
pthread_exit (NULL);
pthread_cleanup_pop (0);
}
static void *
t4 (void *arg)
{
pthread_cleanup_push (cleanupok, (void *) (long int) 6);
innerok ((int) (long int) arg);
pthread_cleanup_pop (0);
return NULL;
}
int
main (int argc, char *argv[])
{
pthread_t td;
int err;
char *tmp;
const char *prefix;
const char template[] = "thtstXXXXXX";
struct stat64 st;
int result = 0;
prefix = argc > 1 ? argv[1] : "";
tmp = (char *) alloca (strlen (prefix) + sizeof template);
strcpy (stpcpy (tmp, prefix), template);
fd = mkstemp (tmp);
if (fd == -1)
{
printf ("cannot create temporary file: %m");
exit (1);
}
unlink (tmp);
err = pthread_barrier_init (&bar, NULL, 2);
if (err != 0 )
{
printf ("cannot create barrier: %s\n", strerror (err));
exit (1);
}
#ifdef NOT_YET
err = pthread_create (&td, NULL, t1, NULL);
if (err != 0)
{
printf ("cannot create thread t1: %s\n", strerror (err));
exit (1);
}
err = pthread_join (td, NULL);
if (err != 0)
{
printf ("cannot join thread: %s\n", strerror (err));
exit (1);
}
err = pthread_create (&td, NULL, t2, (void *) 3);
if (err != 0)
{
printf ("cannot create thread t2: %s\n", strerror (err));
exit (1);
}
err = pthread_join (td, NULL);
if (err != 0)
{
printf ("cannot join thread: %s\n", strerror (err));
exit (1);
}
err = pthread_create (&td, NULL, t3, (void *) 5);
if (err != 0)
{
printf ("cannot create thread t3: %s\n", strerror (err));
exit (1);
}
err = pthread_join (td, NULL);
if (err != 0)
{
printf ("cannot join thread: %s\n", strerror (err));
exit (1);
}
#endif
err = pthread_create (&td, NULL, t4, (void *) 7);
if (err != 0)
{
printf ("cannot create thread t4: %s\n", strerror (err));
exit (1);
}
err = pthread_join (td, NULL);
if (err != 0)
{
printf ("cannot join thread: %s\n", strerror (err));
exit (1);
}
if (fstat64 (fd, &st) < 0)
{
printf ("cannot stat temporary file: %m\n");
result = 1;
}
else if (st.st_size != 0)
{
char buf[512];
puts ("some cleanup handlers ran:");
fflush (stdout);
__lseek (fd, 0, SEEK_SET);
while (1)
{
ssize_t n = read (fd, buf, sizeof buf);
if (n <= 0)
break;
write (STDOUT_FILENO, buf, n);
}
result = 1;
}
// if (cleanupokcnt != 3) will be three once t3 runs
if (cleanupokcnt != 2)
{
printf ("cleanupokcnt = %d\n", cleanupokcnt);
result = 1;
}
return result;
}