diff mbox series

[v2] nptl: Add new test for pthread_spin_trylock

Message ID 20241106142457.15387-1-skolosov@redhat.com
State New
Headers show
Series [v2] nptl: Add new test for pthread_spin_trylock | expand

Commit Message

Sergey Kolosov Nov. 6, 2024, 2:24 p.m. UTC
Add a threaded test for pthread_spin_trylock attempting to lock already
acquired spin lock and checking for correct return code.
---
v2 change:
 * add missing space in comment.
---
 sysdeps/pthread/Makefile    |  1 +
 sysdeps/pthread/tst-spin5.c | 82 +++++++++++++++++++++++++++++++++++++
 2 files changed, 83 insertions(+)
 create mode 100644 sysdeps/pthread/tst-spin5.c

Comments

Florian Weimer Nov. 29, 2024, 2:54 p.m. UTC | #1
* Sergey Kolosov:

> Add a threaded test for pthread_spin_trylock attempting to lock already
> acquired spin lock and checking for correct return code.
> ---
> v2 change:
>  * add missing space in comment.

Still good.

Reviewed-by: Florian Weimer <fweimer@redhat.com>

I'll push this for you.

Thanks,
Florian
diff mbox series

Patch

diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile
index 4c1dc04b20..1d0c05a4d1 100644
--- a/sysdeps/pthread/Makefile
+++ b/sysdeps/pthread/Makefile
@@ -267,6 +267,7 @@  tests += \
   tst-spin2 \
   tst-spin3 \
   tst-spin4 \
+  tst-spin5 \
   tst-stack1 \
   tst-stdio1 \
   tst-stdio2 \
diff --git a/sysdeps/pthread/tst-spin5.c b/sysdeps/pthread/tst-spin5.c
new file mode 100644
index 0000000000..5c23bd48ef
--- /dev/null
+++ b/sysdeps/pthread/tst-spin5.c
@@ -0,0 +1,82 @@ 
+/* Threaded test the pthread_spin_trylock function.
+   Copyright (C) 2024 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
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+#include <errno.h>
+#include <support/check.h>
+#include <support/support.h>
+#include <support/xunistd.h>
+#include <support/xthread.h>
+
+pthread_spinlock_t lock;
+
+void *
+thread (void *arg)
+{
+  int ret;
+  int thr_id = *(int *) arg;
+
+  ret = pthread_spin_trylock (&lock);
+  if (thr_id == 1)
+    /* thread with already acquired lock.  */
+    {
+      if (ret != EBUSY)
+        {
+          FAIL_EXIT1 ("pthread_spin_trylock should fail with EBUSY");
+        }
+    }
+  else if (thr_id == 2)
+    /* thread with released spin lock.  */
+    {
+      if (ret != 0)
+        {
+          FAIL_EXIT1 ("pthread_spin_trylock should be able to acquire lock");
+        }
+    }
+  return NULL;
+}
+
+static int
+do_test (void)
+{
+  pthread_t thr1, thr2;
+  int ret;
+  int thr1_id = 1, thr2_id = 2;
+
+  pthread_spin_init (&lock, PTHREAD_PROCESS_PRIVATE);
+  /* lock spin in main thread.  */
+  ret = pthread_spin_trylock (&lock);
+  if (ret != 0)
+    {
+      FAIL_EXIT1 ("Main thread should be able to acquire spin lock");
+    }
+
+  /* create first thread to try locking already acquired spin lock.  */
+  thr1 = xpthread_create (NULL, thread, &thr1_id);
+  xpthread_join (thr1);
+
+  /* release spin lock and create thread to acquire released spin lock.  */
+  pthread_spin_unlock (&lock);
+  thr2 = xpthread_create (NULL, thread, &thr2_id);
+  xpthread_join (thr2);
+
+  pthread_spin_destroy (&lock);
+  return 0;
+}
+
+#include <support/test-driver.c>