diff --git a/nptl/Makefile b/nptl/Makefile
index 9c3ffb8..4a88816 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -292,7 +292,12 @@ tests = tst-typesizes \
tst-getpid3 \
tst-setuid3 \
tst-initializers1 $(addprefix tst-initializers1-,c89 gnu89 c99 gnu99) \
- tst-bad-schedattr
+ tst-bad-schedattr \
+ tst-cnd-basic tst-mtx-trylock tst-cnd-broadcast \
+ tst-thrd-basic tst-cnd-timedwait tst-thrd-detach \
+ tst-mtx-basic tst-thrd-sleep tst-mtx-recursive tst-tss-basic \
+ tst-call-once tst-mtx-timedlock
+
xtests = tst-setuid1 tst-setuid1-static tst-setuid2 \
tst-mutexpp1 tst-mutexpp6 tst-mutexpp10
test-srcs = tst-oddstacklimit
diff --git a/nptl/tst-call-once.c b/nptl/tst-call-once.c
new file mode 100644
index 0000000..9eeb5c2
--- /dev/null
+++ b/nptl/tst-call-once.c
@@ -0,0 +1,77 @@
+/* Copyright (C) 2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ . */
+
+#include
+#include
+#include
+
+
+/* Flag that controls the first thread access. */
+static once_flag flag = ONCE_FLAG_INIT;
+
+/* Function called only once. */
+void
+do_once (void)
+{
+ printf ("Called once\n");
+}
+
+/* Code executed by each thread. */
+int
+func (void* data)
+{
+ call_once (&flag, do_once);
+ thrd_exit(thrd_success);
+}
+
+
+#define N 20
+
+int
+do_test (void)
+{
+
+ thrd_t ids[N];
+ unsigned char i;
+
+
+ /* Create N new threads. */
+ for (i = 0; i < N; ++i)
+ {
+ if (thrd_create (&ids[i], func, NULL) != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+ }
+
+ /* Join threads. */
+ for (i = 0; i < N; ++i)
+ {
+ if (thrd_join (ids[i], NULL) != thrd_success)
+ {
+ printf ("Join failed\n");
+ _exit (1);
+ }
+ }
+
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nptl/tst-cnd-basic.c b/nptl/tst-cnd-basic.c
new file mode 100644
index 0000000..8e72051
--- /dev/null
+++ b/nptl/tst-cnd-basic.c
@@ -0,0 +1,92 @@
+/* Copyright (C) 2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ . */
+
+#include
+#include
+#include
+
+/* Shared condition variable between child and parent. */
+static cnd_t cond;
+
+/* Mutex needed to signal and wait threads. */
+static mtx_t mutex;
+
+int
+signal_parent (void)
+{
+ /* Send signal to parent. */
+ printf ("Child signaling\n");
+ if (cnd_signal (&cond) != thrd_success)
+ {
+ printf ("Child signal error.\n");
+ _exit (1);
+ }
+
+ thrd_exit (thrd_success);
+}
+
+int
+do_test (void)
+{
+
+ thrd_t id;
+
+ /* Initialize cond and mutex. */
+ if (cnd_init (&cond) != thrd_success
+ || mtx_init (&mutex, mtx_plain) != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+
+ /* Create new thread. */
+ if (thrd_create (&id, (thrd_start_t) signal_parent, NULL)
+ != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+
+ /* Wait on cond, until child thread signals. */
+ if (cnd_wait (&cond, &mutex) != thrd_success)
+ {
+ printf ("Parent lock failed\n");
+ _exit (1);
+ }
+ printf ("Parent received signal, continuing\n");
+
+ /* Joining is not mandatory here, but still done
+ to assure child thread ends correctly.. */
+ if (thrd_join (id, NULL) != thrd_success)
+ {
+ printf ("Join failed.\n");
+ _exit (1);
+ }
+
+
+ /* Destroy mutex. */
+ mtx_destroy (&mutex);
+
+ /* Destroy cond. */
+ cnd_destroy (&cond);
+
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nptl/tst-cnd-broadcast.c b/nptl/tst-cnd-broadcast.c
new file mode 100644
index 0000000..b93c9a9
--- /dev/null
+++ b/nptl/tst-cnd-broadcast.c
@@ -0,0 +1,95 @@
+/* Copyright (C) 2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ . */
+
+#include
+#include
+#include
+
+/* Condition variable where child threads will wait. */
+cnd_t cond;
+
+/* Mutex to control wait on cond. */
+mtx_t mutex;
+
+/* Code executed by each thread. */
+int
+child_wait (void* data)
+{
+ printf ("Arrived\n");
+ /* Wait until parent thread sends broadcast here. */
+ mtx_lock (&mutex);
+ cnd_wait (&cond, &mutex);
+ mtx_unlock (&mutex);
+
+ printf ("Freed thread\n");
+ thrd_exit (thrd_success);
+}
+
+#define N 5
+
+int
+do_test (void)
+{
+
+ thrd_t ids[N];
+ unsigned char i;
+
+ cnd_init (&cond);
+ mtx_init (&mutex, mtx_plain);
+
+ /* Create N new threads. */
+ for (i = 0; i < N; ++i)
+ {
+ if (thrd_create (&ids[i], child_wait, NULL) != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+ }
+
+ /* Wait for other threads to reach their wait func. */
+ thrd_sleep (&((struct timespec){.tv_sec = 2}), NULL);
+
+ /* Send broadcast. */
+ mtx_lock (&mutex);
+ if (cnd_broadcast (&cond) != thrd_success)
+ {
+ printf ("Broadcast error");
+ _exit (1);
+ }
+ mtx_unlock (&mutex);
+
+ /* Join threads. */
+ for (i = 0; i < N; ++i)
+ {
+ if (thrd_join (ids[i], NULL) != thrd_success)
+ {
+ printf ("Join failed\n");
+ _exit (1);
+ }
+ }
+
+
+ mtx_destroy (&mutex);
+ cnd_destroy (&cond);
+
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nptl/tst-cnd-timedwait.c b/nptl/tst-cnd-timedwait.c
new file mode 100644
index 0000000..c8aff19
--- /dev/null
+++ b/nptl/tst-cnd-timedwait.c
@@ -0,0 +1,104 @@
+/* Copyright (C) 2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ . */
+
+#include
+#include
+#include
+
+/* Shared condition variable between child and parent. */
+static cnd_t cond;
+
+/* Mutex needed to signal and wait threads. */
+static mtx_t mutex;
+
+int
+signal_parent (void)
+{
+ /* Send signal to parent. */
+ printf ("Child signaling\n");
+ if (cnd_signal (&cond) != thrd_success)
+ {
+ printf ("Child signal error.\n");
+ _exit (1);
+ }
+
+ //thrd_exit(thrd_success);
+ return 0;
+}
+
+int
+do_test (void)
+{
+
+ thrd_t id;
+ struct timespec w_time;
+
+ /* Initialize cond and mutex. */
+ if (cnd_init (&cond) != thrd_success
+ || mtx_init (&mutex, mtx_timed) != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+
+ /* Initialize waiting time. */
+ clock_gettime (CLOCK_REALTIME, &w_time);
+ w_time.tv_nsec += 150000;
+
+ /* Create new thread. */
+ if (thrd_create (&id, (thrd_start_t) signal_parent, NULL)
+ != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+
+ /* Wait on cond, until child thread signals. */
+ switch (cnd_timedwait (&cond, &mutex, &w_time))
+ {
+ case thrd_error:
+ printf ("Parent lock failed\n");
+ _exit (1);
+ case thrd_timedout:
+ printf ("Waiting too long, leaving\n");
+ break;
+ case thrd_success:
+ printf ("Signaled successfully,\n");
+ break;
+ }
+
+ /* Joining is not mandatory here, but still done
+ to assure child thread ends correctly.. */
+ if (thrd_join (id, NULL) != thrd_success)
+ {
+ printf ("Join failed.\n");
+ _exit (1);
+ }
+
+
+ /* Destroy mutex. */
+ mtx_destroy (&mutex);
+
+ /* Destroy cond. */
+ cnd_destroy (&cond);
+
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nptl/tst-mtx-basic.c b/nptl/tst-mtx-basic.c
new file mode 100644
index 0000000..ea7fdc6
--- /dev/null
+++ b/nptl/tst-mtx-basic.c
@@ -0,0 +1,112 @@
+/* Copyright (C) 2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ . */
+
+#include
+#include
+#include
+
+/* Shared mutex between child and parent. */
+static mtx_t mutex;
+
+/* Shared counter to check possible race conditions. */
+static char shrd_counter;
+
+int
+child_add (void)
+{
+ /* Lock mutex. */
+ if (mtx_lock (&mutex) != thrd_success)
+ {
+ printf ("Child lock error.\n");
+ _exit (1);
+ }
+
+ /* Critical section. */
+ printf ("Child locking\n");
+ ++shrd_counter;
+ printf ("Child unlocking\n");
+
+ /* Unlock mutex. */
+ if (mtx_unlock (&mutex) != thrd_success)
+ {
+ printf ("Child unlock error.\n");
+ _exit (1);
+ }
+ thrd_exit (thrd_success);
+}
+
+int
+do_test (void)
+{
+
+ thrd_t id;
+
+ /* Initialize mutex. */
+ mtx_init (&mutex, mtx_plain);
+
+ /* Create new thread. */
+ if (thrd_create (&id, (thrd_start_t) child_add, NULL) != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+ else
+ printf ("Created thread\n");
+
+
+ if (mtx_lock (&mutex) != thrd_success)
+ {
+ printf ("Parent lock failed\n");
+ _exit (1);
+ }
+
+ /* Critical section. */
+ printf ("Parent locking\n");
+ ++shrd_counter;
+ printf ("Parent unlocking\n");
+
+ /* Unlock mutex. */
+ if (mtx_unlock (&mutex) != thrd_success)
+ {
+ printf ("Parent unlock error.\n");
+ _exit (1);
+ }
+
+
+ /* Still have to wait until child is done. */
+ if (thrd_join (id, NULL) != thrd_success)
+ {
+ printf ("Join failed.\n");
+ _exit (1);
+ }
+
+ /* Check result. */
+ if (shrd_counter != 2)
+ {
+ printf ("Counter has a wrong value.\n");
+ _exit (1);
+ }
+
+ /* Destroy mutex. */
+ mtx_destroy (&mutex);
+
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nptl/tst-mtx-recursive.c b/nptl/tst-mtx-recursive.c
new file mode 100644
index 0000000..e28faed
--- /dev/null
+++ b/nptl/tst-mtx-recursive.c
@@ -0,0 +1,57 @@
+/* Copyright (C) 2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ . */
+
+#include
+#include
+#include
+
+
+int
+do_test (void)
+{
+
+ static mtx_t mutex;
+
+ /* Initialize mutex. */
+ mtx_init (&mutex, mtx_recursive);
+
+ /* Lock mutex first time. */
+ if (mtx_lock (&mutex) != thrd_success)
+ {
+ printf ("First lock failed\n");
+ _exit (1);
+ }
+ else
+ printf ("Mutex locked once\n");
+
+ /* Lock mutex second time, if not recursive should deadlock. */
+ if (mtx_lock (&mutex) != thrd_success)
+ {
+ printf ("Second lock failed\n");
+ _exit (1);
+ }
+ else
+ printf ("Mutex locked twice\n");
+
+ /* Destroy mutex. */
+ mtx_destroy (&mutex);
+
+ return 0;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nptl/tst-mtx-timedlock.c b/nptl/tst-mtx-timedlock.c
new file mode 100644
index 0000000..5bfec09
--- /dev/null
+++ b/nptl/tst-mtx-timedlock.c
@@ -0,0 +1,124 @@
+/* Copyright (C) 2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ . */
+
+#include
+#include
+#include
+
+/* Shared mutex between child and parent. */
+static mtx_t mutex;
+
+/* Shared counter to check possible race conditions. */
+static char shrd_counter;
+
+/* Maximum amount of time waiting for mutex. */
+static struct timespec wait_time;
+
+/* Function to choose an action to do, depending on mtx_timedlock
+ return value. */
+static inline void
+choose_action (int action, char* thread_name)
+{
+ switch (action)
+ {
+ case thrd_success:
+
+ /* Critical section. */
+ printf ("%s locking.\n", thread_name);
+ ++shrd_counter;
+ printf ("%s unlocking.\n", thread_name);
+
+ /* Unlock mutex. */
+ if (mtx_unlock (&mutex) != thrd_success)
+ {
+ printf ("%s unlock error.\n", thread_name);
+ _exit (1);
+ }
+ break;
+
+ case thrd_timedout:
+ printf ("Waiting for mutex too long, %s leaving.\n", thread_name);
+ break;
+
+ case thrd_error:
+ printf ("%s lock error.\n", thread_name);
+ _exit (1);
+ break;
+ }
+
+}
+
+int
+child_add (void)
+{
+ char child_name[] = "Child";
+
+ /* Try to lock mutex. */
+ choose_action (mtx_timedlock (&mutex, &wait_time), child_name);
+ thrd_exit (thrd_success);
+}
+
+int
+do_test (void)
+{
+ thrd_t id;
+ char parent_name[] = "Parent";
+
+ /* Initialize mutex. */
+ mtx_init (&mutex, mtx_timed);
+
+ /* Initialize waiting time. */
+ clock_gettime (CLOCK_REALTIME, &wait_time);
+ /* Tiny amount of time, to assure that if any thread
+ finds it busy, will receive thrd_timedout. */
+ wait_time.tv_nsec += 1;
+
+
+
+ /* Create new thread. */
+ if (thrd_create (&id, (thrd_start_t) child_add, NULL) != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+
+ /* Try to lock mutex. */
+ choose_action (mtx_timedlock (&mutex, &wait_time), parent_name);
+
+ /* Still have to wait until child is done. */
+ if (thrd_join (id, NULL) != thrd_success)
+ {
+ printf ("Join failed.\n");
+ _exit (1);
+ }
+
+ /* Check result. */
+ if (shrd_counter != 2 && shrd_counter != 1)
+ {
+ printf ("Counter has a wrong value: %i.\n", shrd_counter);
+ _exit (1);
+ }
+
+ /* Destroy mutex. */
+ mtx_destroy (&mutex);
+
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nptl/tst-mtx-trylock.c b/nptl/tst-mtx-trylock.c
new file mode 100644
index 0000000..fa75066
--- /dev/null
+++ b/nptl/tst-mtx-trylock.c
@@ -0,0 +1,114 @@
+/* Copyright (C) 2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ . */
+
+#include
+#include
+#include
+
+/* Shared mutex between child and parent. */
+static mtx_t mutex;
+
+/* Shared counter to check possible race conditions. */
+static char shrd_counter;
+
+/* Function to choose an action to do, depending on mtx_trylock
+ return value. */
+static inline void
+choose_action (int action, char* thread_name)
+{
+ switch (action)
+ {
+ case thrd_success:
+
+ /* Critical section. */
+ printf ("%s locking\n", thread_name);
+ ++shrd_counter;
+ printf ("%s unlocking\n", thread_name);
+
+ /* Unlock mutex. */
+ if (mtx_unlock (&mutex) != thrd_success)
+ {
+ printf ("%s unlock error.\n", thread_name);
+ _exit (1);
+ }
+ break;
+
+ case thrd_busy:
+ printf ("Mutex is taken, %s leaving.\n", thread_name);
+ break;
+
+ case thrd_error:
+ printf ("%s lock error.\n", thread_name);
+ _exit (1);
+ break;
+ }
+
+}
+
+int
+child_add (void)
+{
+ char child_name[] = "Child";
+
+ /* Try to lock mutex. */
+ choose_action (mtx_trylock (&mutex), child_name);
+
+ thrd_exit(thrd_success);
+}
+
+int
+do_test (void)
+{
+ thrd_t id;
+ char parent_name[] = "Parent";
+
+ /* Initialize mutex. */
+ mtx_init (&mutex, mtx_plain);
+
+ /* Create new thread. */
+ if (thrd_create (&id, (thrd_start_t) child_add, NULL) != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+
+ /* Try to lock mutex. */
+ choose_action (mtx_trylock (&mutex), parent_name);
+
+ /* Still have to wait until child is done. */
+ if (thrd_join (id, NULL) != thrd_success)
+ {
+ printf ("Join failed.\n");
+ _exit (1);
+ }
+
+ /* Check result. */
+ if (shrd_counter != 2 && shrd_counter != 1)
+ {
+ printf ("Counter has a wrong value: %i.\n", shrd_counter);
+ _exit (1);
+ }
+
+ /* Destroy mutex. */
+ mtx_destroy (&mutex);
+
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nptl/tst-thrd-basic.c b/nptl/tst-thrd-basic.c
new file mode 100644
index 0000000..53e0888
--- /dev/null
+++ b/nptl/tst-thrd-basic.c
@@ -0,0 +1,63 @@
+/* Copyright (C) 2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ . */
+
+#include
+#include
+#include
+
+
+int
+print_id (void *parent_id)
+{
+ printf ("Thread ID: %lu, Parent ID: %lu\n", thrd_current (),
+ (thrd_t) parent_id);
+ thrd_exit (thrd_success);
+}
+
+int
+do_test (void)
+{
+
+ thrd_t id;
+ int ret_val;
+
+ /* Create new thread. */
+ if (thrd_create (&id, print_id, (void *) thrd_current ()) != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+ else
+ printf ("Created thread\n");
+
+
+ if (thrd_join (id, &ret_val) != thrd_success)
+ {
+ printf ("Join failed\n");
+ _exit (1);
+ }
+ else
+ printf ("Joined thread\n");
+
+ printf ("Child returned %u\n", ret_val);
+
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nptl/tst-thrd-detach.c b/nptl/tst-thrd-detach.c
new file mode 100644
index 0000000..ca0d7b0
--- /dev/null
+++ b/nptl/tst-thrd-detach.c
@@ -0,0 +1,61 @@
+/* Copyright (C) 2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ . */
+
+#include
+#include
+#include
+#include
+
+
+int
+dtch_thrd (void)
+{
+
+ if (thrd_detach (thrd_current ()) != thrd_success)
+ {
+ printf ("Detach failed\n");
+ _exit (1);
+ }
+ else
+ printf ("Succesfully detached\n");
+
+ return 0;
+}
+
+int
+do_test (void)
+{
+
+ thrd_t id;
+
+ /* Create new thread. */
+ if (thrd_create (&id, (thrd_start_t) dtch_thrd, NULL) != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+ else
+ printf ("Created thread\n");
+
+ thrd_sleep (&(struct timespec){.tv_sec = 2}, NULL);
+
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nptl/tst-thrd-sleep.c b/nptl/tst-thrd-sleep.c
new file mode 100644
index 0000000..8557c6b
--- /dev/null
+++ b/nptl/tst-thrd-sleep.c
@@ -0,0 +1,71 @@
+/* Copyright (C) 2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ . */
+
+#include
+#include
+#include
+#include
+
+
+int
+go_to_sleep (struct timespec const *tl)
+{
+
+ printf ("Time before sleeping: %s", ctime (&(time_t){time(NULL)}));
+ if (thrd_sleep (tl, NULL) != 0)
+ {
+ printf ("Sleep failed\n");
+ _exit (1);
+ }
+ printf ("Time after sleeping: %s", ctime (&(time_t){time(NULL)}));
+
+ return 0;
+}
+
+int
+do_test (void)
+{
+
+ thrd_t id;
+ /* Wait for 3 seconds. */
+ struct timespec wait_time = {.tv_sec = 3};
+
+ /* Create new thread. */
+ if (thrd_create (&id, (thrd_start_t) go_to_sleep,
+ (void *) (&wait_time)) != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+ else
+ printf ("Created thread\n");
+
+
+ if (thrd_join (id, NULL) != thrd_success)
+ {
+ printf ("Join failed\n");
+ _exit (1);
+ }
+ else
+ printf ("Joined thread\n");
+
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/nptl/tst-tss-basic.c b/nptl/tst-tss-basic.c
new file mode 100644
index 0000000..0064c63
--- /dev/null
+++ b/nptl/tst-tss-basic.c
@@ -0,0 +1,70 @@
+/* Copyright (C) 2015 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ 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
+ . */
+
+#include
+#include
+#include
+
+/* Thread specific storage. */
+tss_t key;
+
+int
+print_id (void *val)
+{
+ tss_create (&key, NULL);
+ tss_set (key, (void *) 0xff);
+ printf ("Child key: %u\n", key);
+ printf ("Child value: %p\n", tss_get (key));
+
+
+ thrd_exit(thrd_success);
+}
+
+int
+do_test (void)
+{
+
+ thrd_t id;
+ int ret_val;
+
+ /* Create new thread. */
+ if (thrd_create (&id, print_id, NULL) != thrd_success)
+ {
+ printf ("Create failed\n");
+ _exit (1);
+ }
+
+ if (thrd_join (id, &ret_val) != thrd_success)
+ {
+ printf ("Join failed\n");
+ _exit (1);
+ }
+ else
+ printf ("Joined thread\n");
+
+ /* We check parent has the same key value, but
+ no value, because was not assigned. */
+ printf ("Parent key: %u\n", key);
+ printf ("Parent value: %p\n", tss_get (key));
+ tss_delete (key);
+
+ return 0;
+}
+
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"