mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-01 10:06:57 +03:00
pthread: Move key tests from nptl to sysdeps/pthread
So they can be checked with htl too.
This commit is contained in:
@ -50,6 +50,7 @@ tests += tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \
|
||||
tst-cond14 tst-cond15 tst-cond16 tst-cond17 tst-cond18 tst-cond19 \
|
||||
tst-cond23 tst-cond24 tst-cond25 \
|
||||
tst-cond-except \
|
||||
tst-key1 tst-key2 tst-key3 tst-key4 \
|
||||
tst-mutex1 tst-mutex2 tst-mutex3 tst-mutex4 tst-mutex6 tst-mutex10 \
|
||||
tst-once1 tst-once2 tst-once3 tst-once4 \
|
||||
tst-rwlock1 tst-rwlock4 tst-rwlock5 tst-rwlock13 tst-rwlock16 \
|
||||
|
89
sysdeps/pthread/tst-key1.c
Normal file
89
sysdeps/pthread/tst-key1.c
Normal file
@ -0,0 +1,89 @@
|
||||
/* Copyright (C) 2002-2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <limits.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
static int do_test (void);
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
||||
|
||||
int
|
||||
do_test (void)
|
||||
{
|
||||
int max;
|
||||
#ifdef PTHREAD_KEYS_MAX
|
||||
max = PTHREAD_KEYS_MAX;
|
||||
#else
|
||||
max = _POSIX_THREAD_KEYS_MAX;
|
||||
#endif
|
||||
pthread_key_t *keys = alloca (max * sizeof (pthread_key_t));
|
||||
|
||||
int i;
|
||||
for (i = 0; i < max; ++i)
|
||||
if (pthread_key_create (&keys[i], NULL) != 0)
|
||||
{
|
||||
write_message ("key_create failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf ("created key %d\n", i);
|
||||
|
||||
if (pthread_setspecific (keys[i], (const void *) (i + 100l)) != 0)
|
||||
{
|
||||
write (2, "setspecific failed\n", 19);
|
||||
_exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < max; ++i)
|
||||
{
|
||||
if (pthread_getspecific (keys[i]) != (void *) (i + 100l))
|
||||
{
|
||||
write (2, "getspecific failed\n", 19);
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
if (pthread_key_delete (keys[i]) != 0)
|
||||
{
|
||||
write (2, "key_delete failed\n", 18);
|
||||
_exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Now it must be once again possible to allocate keys. */
|
||||
if (pthread_key_create (&keys[0], NULL) != 0)
|
||||
{
|
||||
write (2, "2nd key_create failed\n", 22);
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
if (pthread_key_delete (keys[0]) != 0)
|
||||
{
|
||||
write (2, "2nd key_delete failed\n", 22);
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
115
sysdeps/pthread/tst-key2.c
Normal file
115
sysdeps/pthread/tst-key2.c
Normal file
@ -0,0 +1,115 @@
|
||||
/* Copyright (C) 2002-2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define N 2
|
||||
|
||||
|
||||
static int do_test (void);
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
||||
|
||||
static int cnt0;
|
||||
static void
|
||||
f0 (void *p)
|
||||
{
|
||||
++cnt0;
|
||||
}
|
||||
|
||||
|
||||
static int cnt1;
|
||||
static void
|
||||
f1 (void *p)
|
||||
{
|
||||
++cnt1;
|
||||
}
|
||||
|
||||
|
||||
static void (*fcts[N]) (void *) =
|
||||
{
|
||||
f0,
|
||||
f1
|
||||
};
|
||||
|
||||
|
||||
static void *
|
||||
tf (void *arg)
|
||||
{
|
||||
pthread_key_t *key = (pthread_key_t *) arg;
|
||||
|
||||
if (pthread_setspecific (*key, (void *) -1l) != 0)
|
||||
{
|
||||
write_message ("setspecific failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
do_test (void)
|
||||
{
|
||||
pthread_key_t keys[N];
|
||||
|
||||
int i;
|
||||
for (i = 0; i < N; ++i)
|
||||
if (pthread_key_create (&keys[i], fcts[i]) != 0)
|
||||
{
|
||||
write_message ("key_create failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
pthread_t th;
|
||||
if (pthread_create (&th, NULL, tf, &keys[1]) != 0)
|
||||
{
|
||||
write_message ("create failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
if (pthread_join (th, NULL) != 0)
|
||||
{
|
||||
write_message ("join failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
if (cnt0 != 0)
|
||||
{
|
||||
write_message ("cnt0 != 0\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
if (cnt1 != 1)
|
||||
{
|
||||
write_message ("cnt1 != 1\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
for (i = 0; i < N; ++i)
|
||||
if (pthread_key_delete (keys[i]) != 0)
|
||||
{
|
||||
write_message ("key_delete failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
156
sysdeps/pthread/tst-key3.c
Normal file
156
sysdeps/pthread/tst-key3.c
Normal file
@ -0,0 +1,156 @@
|
||||
/* Copyright (C) 2002-2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define N 2
|
||||
|
||||
|
||||
static int do_test (void);
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
||||
|
||||
static int cnt0;
|
||||
static void
|
||||
f0 (void *p)
|
||||
{
|
||||
++cnt0;
|
||||
}
|
||||
|
||||
|
||||
static int cnt1;
|
||||
static void
|
||||
f1 (void *p)
|
||||
{
|
||||
++cnt1;
|
||||
}
|
||||
|
||||
|
||||
static void (*fcts[N]) (void *) =
|
||||
{
|
||||
f0,
|
||||
f1
|
||||
};
|
||||
|
||||
|
||||
static pthread_barrier_t b;
|
||||
|
||||
|
||||
static void *
|
||||
tf (void *arg)
|
||||
{
|
||||
pthread_key_t *key = (pthread_key_t *) arg;
|
||||
|
||||
if (pthread_setspecific (*key, (void *) -1l) != 0)
|
||||
{
|
||||
write_message ("setspecific failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
pthread_barrier_wait (&b);
|
||||
|
||||
const struct timespec t = { .tv_sec = 1000, .tv_nsec = 0 };
|
||||
while (1)
|
||||
nanosleep (&t, NULL);
|
||||
|
||||
/* NOTREACHED */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
do_test (void)
|
||||
{
|
||||
pthread_key_t keys[N];
|
||||
|
||||
int i;
|
||||
for (i = 0; i < N; ++i)
|
||||
if (pthread_key_create (&keys[i], fcts[i]) != 0)
|
||||
{
|
||||
write_message ("key_create failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
if (pthread_barrier_init (&b, NULL, 2) != 0)
|
||||
{
|
||||
write_message ("barrier_init failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
pthread_t th;
|
||||
if (pthread_create (&th, NULL, tf, &keys[1]) != 0)
|
||||
{
|
||||
write_message ("create failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
pthread_barrier_wait (&b);
|
||||
|
||||
if (pthread_cancel (th) != 0)
|
||||
{
|
||||
write_message ("cancel failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
void *status;
|
||||
if (pthread_join (th, &status) != 0)
|
||||
{
|
||||
write_message ("join failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
if (status != PTHREAD_CANCELED)
|
||||
{
|
||||
write_message ("thread not canceled\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
/* Note that the TSD destructors not necessarily have to have
|
||||
finished by the time pthread_join returns. At least according to
|
||||
POSIX. We implement the stronger requirement that they indeed
|
||||
have run and therefore these tests succeed. */
|
||||
if (cnt0 != 0)
|
||||
{
|
||||
write_message ("cnt0 != 0\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
if (cnt1 != 1)
|
||||
{
|
||||
write_message ("cnt1 != 1\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
for (i = 0; i < N; ++i)
|
||||
if (pthread_key_delete (keys[i]) != 0)
|
||||
{
|
||||
write_message ("key_delete failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
if (pthread_barrier_destroy (&b) != 0)
|
||||
{
|
||||
write_message ("barrier_destroy failed\n");
|
||||
_exit (1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
136
sysdeps/pthread/tst-key4.c
Normal file
136
sysdeps/pthread/tst-key4.c
Normal file
@ -0,0 +1,136 @@
|
||||
/* Copyright (C) 2003-2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <limits.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
#ifdef PTHREAD_KEYS_MAX
|
||||
const int max = PTHREAD_KEYS_MAX;
|
||||
#else
|
||||
const int max = _POSIX_THREAD_KEYS_MAX;
|
||||
#endif
|
||||
static pthread_key_t *keys;
|
||||
|
||||
|
||||
static void *
|
||||
tf1 (void *arg)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < max; ++i)
|
||||
if (pthread_setspecific (keys[i], (void *) (long int) (i + 1)) != 0)
|
||||
{
|
||||
puts ("setspecific failed");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
tf2 (void *arg)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < max; ++i)
|
||||
if (pthread_getspecific (keys[i]) != NULL)
|
||||
{
|
||||
printf ("getspecific for key %d not NULL\n", i);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
do_test (void)
|
||||
{
|
||||
keys = alloca (max * sizeof (pthread_key_t));
|
||||
|
||||
int i;
|
||||
for (i = 0; i < max; ++i)
|
||||
if (pthread_key_create (&keys[i], NULL) != 0)
|
||||
{
|
||||
puts ("key_create failed");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
pthread_attr_t a;
|
||||
|
||||
if (pthread_attr_init (&a) != 0)
|
||||
{
|
||||
puts ("attr_init failed");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (pthread_attr_setstacksize (&a, 1 * 1024 * 1024) != 0)
|
||||
{
|
||||
puts ("attr_setstacksize failed");
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (i = 0; i < 10; ++i)
|
||||
{
|
||||
int j;
|
||||
#define N 2
|
||||
pthread_t th[N];
|
||||
for (j = 0; j < N; ++j)
|
||||
if (pthread_create (&th[j], NULL, tf1, NULL) != 0)
|
||||
{
|
||||
puts ("1st create failed");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
for (j = 0; j < N; ++j)
|
||||
if (pthread_join (th[j], NULL) != 0)
|
||||
{
|
||||
puts ("1st join failed");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
for (j = 0; j < N; ++j)
|
||||
if (pthread_create (&th[j], NULL, tf2, NULL) != 0)
|
||||
{
|
||||
puts ("2nd create failed");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
for (j = 0; j < N; ++j)
|
||||
if (pthread_join (th[j], NULL) != 0)
|
||||
{
|
||||
puts ("2nd join failed");
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
if (pthread_attr_destroy (&a) != 0)
|
||||
{
|
||||
puts ("attr_destroy failed");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#define TEST_FUNCTION do_test ()
|
||||
#include "../test-skeleton.c"
|
Reference in New Issue
Block a user