[libc-commits] [libc] [libc][POSIX][pthreads] implemented missing pthread_rwlockattr functions (PR #93622)
Hendrik Hübner via libc-commits
libc-commits at lists.llvm.org
Tue May 28 16:27:43 PDT 2024
https://github.com/HendrikHuebner created https://github.com/llvm/llvm-project/pull/93622
New pull request for https://github.com/llvm/llvm-project/issues/89443
The previous PR was reverted after breaking fullbuild due to a missing struct declaration, which I forgot to commit.
Reverts revert and adds the missing pthread_rwlockattr_getkind_np / pthread_rwlockattr_setkind_np functions and tests respecitvely.
>From f3e64776d28f0735346b1ebb4d5d77eb0aafda80 Mon Sep 17 00:00:00 2001
From: hhuebner <hendrik.huebner18 at gmail.com>
Date: Wed, 29 May 2024 01:12:42 +0200
Subject: [PATCH 1/2] gevert "Revert "[libc][POSIX][pthreads] implemented
missing pthread_rwlockattr functions" (#91966)"
This reverts commit 27595c4befbbf42891ef7e13fe28926eb7fc825d.
---
libc/config/linux/x86_64/entrypoints.txt | 2 ++
libc/include/pthread.h.def | 5 ++++
libc/spec/posix.td | 10 +++++++
libc/src/pthread/CMakeLists.txt | 21 +++++++++++++
.../pthread/pthread_rwlockattr_getkind_np.cpp | 24 +++++++++++++++
.../pthread/pthread_rwlockattr_getkind_np.h | 21 +++++++++++++
libc/src/pthread/pthread_rwlockattr_init.cpp | 1 +
.../pthread/pthread_rwlockattr_setkind_np.cpp | 30 +++++++++++++++++++
.../pthread/pthread_rwlockattr_setkind_np.h | 20 +++++++++++++
libc/test/src/pthread/CMakeLists.txt | 2 ++
.../src/pthread/pthread_rwlockattr_test.cpp | 29 ++++++++++++++++--
11 files changed, 162 insertions(+), 3 deletions(-)
create mode 100644 libc/src/pthread/pthread_rwlockattr_getkind_np.cpp
create mode 100644 libc/src/pthread/pthread_rwlockattr_getkind_np.h
create mode 100644 libc/src/pthread/pthread_rwlockattr_setkind_np.cpp
create mode 100644 libc/src/pthread/pthread_rwlockattr_setkind_np.h
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 5e3ddd34fb4dc..155deddaaade3 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -673,8 +673,10 @@ if(LLVM_LIBC_FULL_BUILD)
libc.src.pthread.pthread_mutexattr_settype
libc.src.pthread.pthread_once
libc.src.pthread.pthread_rwlockattr_destroy
+ libc.src.pthread.pthread_rwlockattr_getkind_np
libc.src.pthread.pthread_rwlockattr_getpshared
libc.src.pthread.pthread_rwlockattr_init
+ libc.src.pthread.pthread_rwlockattr_setkind_np
libc.src.pthread.pthread_rwlockattr_setpshared
libc.src.pthread.pthread_setspecific
diff --git a/libc/include/pthread.h.def b/libc/include/pthread.h.def
index a94d770657e10..d41273b5590ea 100644
--- a/libc/include/pthread.h.def
+++ b/libc/include/pthread.h.def
@@ -38,6 +38,11 @@ enum {
#define PTHREAD_PROCESS_PRIVATE 0
#define PTHREAD_PROCESS_SHARED 1
+#define PTHREAD_RWLOCK_PREFER_READER_NP 0
+#define PTHREAD_RWLOCK_PREFER_WRITER_NP 1
+#define PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP 2
+
+
%%public_api()
#endif // LLVM_LIBC_PTHREAD_H
diff --git a/libc/spec/posix.td b/libc/spec/posix.td
index e7a0cf883c607..e16353b8142de 100644
--- a/libc/spec/posix.td
+++ b/libc/spec/posix.td
@@ -1234,6 +1234,11 @@ def POSIX : StandardSpec<"POSIX"> {
RetValSpec<IntType>,
[ArgSpec<PThreadRWLockAttrTPtr>]
>,
+ FunctionSpec<
+ "pthread_rwlockattr_getkind_np",
+ RetValSpec<IntType>,
+ [ArgSpec<PThreadRWLockAttrTPtr>, ArgSpec<IntPtr>]
+ >,
FunctionSpec<
"pthread_rwlockattr_getpshared",
RetValSpec<IntType>,
@@ -1244,6 +1249,11 @@ def POSIX : StandardSpec<"POSIX"> {
RetValSpec<IntType>,
[ArgSpec<PThreadRWLockAttrTPtr>]
>,
+ FunctionSpec<
+ "pthread_rwlockattr_setkind_np",
+ RetValSpec<IntType>,
+ [ArgSpec<PThreadRWLockAttrTPtr>, ArgSpec<IntType>]
+ >,
FunctionSpec<
"pthread_rwlockattr_setpshared",
RetValSpec<IntType>,
diff --git a/libc/src/pthread/CMakeLists.txt b/libc/src/pthread/CMakeLists.txt
index c57475c9114fa..e5bebb63c6401 100644
--- a/libc/src/pthread/CMakeLists.txt
+++ b/libc/src/pthread/CMakeLists.txt
@@ -470,6 +470,16 @@ add_entrypoint_object(
libc.include.pthread
)
+add_entrypoint_object(
+ pthread_rwlockattr_getkind_np
+ SRCS
+ pthread_rwlockattr_getkind_np.cpp
+ HDRS
+ pthread_rwlockattr_getkind_np.h
+ DEPENDS
+ libc.include.pthread
+)
+
add_entrypoint_object(
pthread_rwlockattr_getpshared
SRCS
@@ -490,6 +500,17 @@ add_entrypoint_object(
libc.include.pthread
)
+add_entrypoint_object(
+ pthread_rwlockattr_setkind_np
+ SRCS
+ pthread_rwlockattr_setkind_np.cpp
+ HDRS
+ pthread_rwlockattr_setkind_np.h
+ DEPENDS
+ libc.include.pthread
+ libc.include.errno
+)
+
add_entrypoint_object(
pthread_rwlockattr_setpshared
SRCS
diff --git a/libc/src/pthread/pthread_rwlockattr_getkind_np.cpp b/libc/src/pthread/pthread_rwlockattr_getkind_np.cpp
new file mode 100644
index 0000000000000..0c821797b42ca
--- /dev/null
+++ b/libc/src/pthread/pthread_rwlockattr_getkind_np.cpp
@@ -0,0 +1,24 @@
+//===-- Implementation of the pthread_rwlockattr_getkind_np ---------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "pthread_rwlockattr_getkind_np.h"
+
+#include "src/__support/common.h"
+
+#include <pthread.h> // pthread_rwlockattr_t
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(int, pthread_rwlockattr_getkind_np,
+ (const pthread_rwlockattr_t *__restrict attr,
+ int *__restrict pref)) {
+ *pref = attr->pref;
+ return 0;
+}
+
+} // namespace LIBC_NAMESPACE
diff --git a/libc/src/pthread/pthread_rwlockattr_getkind_np.h b/libc/src/pthread/pthread_rwlockattr_getkind_np.h
new file mode 100644
index 0000000000000..51f633cd559d4
--- /dev/null
+++ b/libc/src/pthread/pthread_rwlockattr_getkind_np.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for pthread_rwlockattr_getkind_np -*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_PTHREAD_PTHREAD_RWLOCKATTR_GETKIND_NP_H
+#define LLVM_LIBC_SRC_PTHREAD_PTHREAD_RWLOCKATTR_GETKIND_NP_H
+
+#include <pthread.h>
+
+namespace LIBC_NAMESPACE {
+
+int pthread_rwlockattr_getkind_np(const pthread_rwlockattr_t *__restrict attr,
+ int *__restrict pref);
+
+} // namespace LIBC_NAMESPACE
+
+#endif // LLVM_LIBC_SRC_PTHREAD_PTHREAD_RWLOCKATTR_GETKIND_NP_H
diff --git a/libc/src/pthread/pthread_rwlockattr_init.cpp b/libc/src/pthread/pthread_rwlockattr_init.cpp
index 7971f1714db48..bbc89555c6c1c 100644
--- a/libc/src/pthread/pthread_rwlockattr_init.cpp
+++ b/libc/src/pthread/pthread_rwlockattr_init.cpp
@@ -17,6 +17,7 @@ namespace LIBC_NAMESPACE {
LLVM_LIBC_FUNCTION(int, pthread_rwlockattr_init,
(pthread_rwlockattr_t * attr)) {
attr->pshared = PTHREAD_PROCESS_PRIVATE;
+ attr->pref = PTHREAD_RWLOCK_PREFER_READER_NP;
return 0;
}
diff --git a/libc/src/pthread/pthread_rwlockattr_setkind_np.cpp b/libc/src/pthread/pthread_rwlockattr_setkind_np.cpp
new file mode 100644
index 0000000000000..47fbf2a851e50
--- /dev/null
+++ b/libc/src/pthread/pthread_rwlockattr_setkind_np.cpp
@@ -0,0 +1,30 @@
+//===-- Implementation of the pthread_rwlockattr_setkind_np ---------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "pthread_rwlockattr_setkind_np.h"
+
+#include "src/__support/common.h"
+
+#include <errno.h>
+#include <pthread.h> // pthread_rwlockattr_t
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(int, pthread_rwlockattr_setkind_np,
+ (pthread_rwlockattr_t * attr, int pref)) {
+
+ if (pref != PTHREAD_RWLOCK_PREFER_READER_NP &&
+ pref != PTHREAD_RWLOCK_PREFER_WRITER_NP &&
+ pref != PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP)
+ return EINVAL;
+
+ attr->pref = pref;
+ return 0;
+}
+
+} // namespace LIBC_NAMESPACE
diff --git a/libc/src/pthread/pthread_rwlockattr_setkind_np.h b/libc/src/pthread/pthread_rwlockattr_setkind_np.h
new file mode 100644
index 0000000000000..00ef8e1bbe009
--- /dev/null
+++ b/libc/src/pthread/pthread_rwlockattr_setkind_np.h
@@ -0,0 +1,20 @@
+//===-- Implementation header for pthread_rwlockattr_setkind_np -*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_PTHREAD_PTHREAD_RWLOCKATTR_SETKIND_NP_H
+#define LLVM_LIBC_SRC_PTHREAD_PTHREAD_RWLOCKATTR_SETKIND_NP_H
+
+#include <pthread.h>
+
+namespace LIBC_NAMESPACE {
+
+int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t *attr, int pref);
+
+} // namespace LIBC_NAMESPACE
+
+#endif // LLVM_LIBC_SRC_PTHREAD_PTHREAD_RWLOCKATTR_SETKIND_NP_H
diff --git a/libc/test/src/pthread/CMakeLists.txt b/libc/test/src/pthread/CMakeLists.txt
index ea75e65f57c9e..0eeec445d5f49 100644
--- a/libc/test/src/pthread/CMakeLists.txt
+++ b/libc/test/src/pthread/CMakeLists.txt
@@ -68,7 +68,9 @@ add_libc_unittest(
libc.include.errno
libc.include.pthread
libc.src.pthread.pthread_rwlockattr_destroy
+ libc.src.pthread.pthread_rwlockattr_getkind_np
libc.src.pthread.pthread_rwlockattr_getpshared
libc.src.pthread.pthread_rwlockattr_init
+ libc.src.pthread.pthread_rwlockattr_setkind_np
libc.src.pthread.pthread_rwlockattr_setpshared
)
diff --git a/libc/test/src/pthread/pthread_rwlockattr_test.cpp b/libc/test/src/pthread/pthread_rwlockattr_test.cpp
index 6e5ae70df7343..3791f568e2228 100644
--- a/libc/test/src/pthread/pthread_rwlockattr_test.cpp
+++ b/libc/test/src/pthread/pthread_rwlockattr_test.cpp
@@ -8,8 +8,10 @@
#include "include/llvm-libc-macros/generic-error-number-macros.h" // EINVAL
#include "src/pthread/pthread_rwlockattr_destroy.h"
+#include "src/pthread/pthread_rwlockattr_getkind_np.h"
#include "src/pthread/pthread_rwlockattr_getpshared.h"
#include "src/pthread/pthread_rwlockattr_init.h"
+#include "src/pthread/pthread_rwlockattr_setkind_np.h"
#include "src/pthread/pthread_rwlockattr_setpshared.h"
#include "test/UnitTest/Test.h"
@@ -25,40 +27,61 @@ TEST(LlvmLibcPThreadRWLockAttrTest, InitAndDestroy) {
TEST(LlvmLibcPThreadRWLockAttrTest, GetDefaultValues) {
pthread_rwlockattr_t attr;
- // Invalid value.
+ // Invalid values.
int pshared = 42;
+ int pref = 1337;
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_init(&attr), 0);
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_getpshared(&attr, &pshared), 0);
+ ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_getkind_np(&attr, &pref), 0);
+
ASSERT_EQ(pshared, PTHREAD_PROCESS_PRIVATE);
+ ASSERT_EQ(pref, PTHREAD_RWLOCK_PREFER_READER_NP);
+
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_destroy(&attr), 0);
}
TEST(LlvmLibcPThreadRWLockAttrTest, SetGoodValues) {
pthread_rwlockattr_t attr;
- // Invalid value.
+ // Invalid values.
int pshared = 42;
+ int pref = 1337;
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_init(&attr), 0);
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_setpshared(
&attr, PTHREAD_PROCESS_SHARED),
0);
+ ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_setkind_np(
+ &attr, PTHREAD_RWLOCK_PREFER_WRITER_NP),
+ 0);
+
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_getpshared(&attr, &pshared), 0);
+ ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_getkind_np(&attr, &pref), 0);
+
ASSERT_EQ(pshared, PTHREAD_PROCESS_SHARED);
+ ASSERT_EQ(pref, PTHREAD_RWLOCK_PREFER_WRITER_NP);
+
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_destroy(&attr), 0);
}
TEST(LlvmLibcPThreadRWLockAttrTest, SetBadValues) {
pthread_rwlockattr_t attr;
- // Invalid value.
+ // Invalid values.
int pshared = 42;
+ int pref = 1337;
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_init(&attr), 0);
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_setpshared(&attr, pshared),
EINVAL);
+ ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_setkind_np(&attr, pref), EINVAL);
+
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_getpshared(&attr, &pshared), 0);
+ ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_getkind_np(&attr, &pref), 0);
+
ASSERT_EQ(pshared, PTHREAD_PROCESS_PRIVATE);
+ ASSERT_EQ(pref, PTHREAD_RWLOCK_PREFER_READER_NP);
+
ASSERT_EQ(LIBC_NAMESPACE::pthread_rwlockattr_destroy(&attr), 0);
}
>From 9935fb0ee439b52203dd0a2e310df067436ee3bc Mon Sep 17 00:00:00 2001
From: hhuebner <hendrik.huebner18 at gmail.com>
Date: Wed, 29 May 2024 01:15:04 +0200
Subject: [PATCH 2/2] Add missing struct member
---
libc/include/llvm-libc-types/pthread_rwlockattr_t.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/libc/include/llvm-libc-types/pthread_rwlockattr_t.h b/libc/include/llvm-libc-types/pthread_rwlockattr_t.h
index a63de4f7b438c..397c8440402a1 100644
--- a/libc/include/llvm-libc-types/pthread_rwlockattr_t.h
+++ b/libc/include/llvm-libc-types/pthread_rwlockattr_t.h
@@ -10,6 +10,7 @@
typedef struct {
int pshared;
+ int pref;
} pthread_rwlockattr_t;
#endif // LLVM_LIBC_TYPES_PTHREAD_RWLOCKATTR_T_H
More information about the libc-commits
mailing list