[libc][NFC] Move thread platform data pointer to thread attributes.

Along the way, added constexpr constructors to the Thread data
structures.
This commit is contained in:
Siva Chandra Reddy 2022-07-13 07:07:56 +00:00
parent 9049c46b9d
commit 3c5d6312c4
3 changed files with 15 additions and 6 deletions

View File

@ -11,7 +11,6 @@
typedef struct {
void *__attrib;
void *__platform_attrib;
} __thread_type;
#endif // __LLVM_LIBC_TYPES_THREAD_TYPE_H__

View File

@ -99,7 +99,8 @@ __attribute__((always_inline)) inline uintptr_t get_start_args_addr() {
#endif
}
static void start_thread() __attribute__((noinline)) {
__attribute__((noinline))
static void start_thread() {
auto *start_args = reinterpret_cast<StartArgs *>(get_start_args_addr());
auto *attrib = start_args->thread_attrib;
long retval;
@ -174,7 +175,7 @@ int Thread::run(ThreadStyle style, ThreadRunner runner, void *arg, void *stack,
auto clear_tid = reinterpret_cast<cpp::Atomic<FutexWordType> *>(
adjusted_stack + sizeof(StartArgs) + sizeof(ThreadAttributes));
clear_tid->val = CLEAR_TID_VALUE;
platform_data = clear_tid;
attrib->platform_data = clear_tid;
// The clone syscall takes arguments in an architecture specific order.
// Also, we want the result of the syscall to be in a register as the child
@ -252,7 +253,7 @@ void Thread::wait() {
// If not, it is a spurious wake and we should continue to wait on
// the futex.
auto *clear_tid =
reinterpret_cast<cpp::Atomic<FutexWordType> *>(platform_data);
reinterpret_cast<cpp::Atomic<FutexWordType> *>(attrib->platform_data);
while (clear_tid->load() != 0) {
// We cannot do a FUTEX_WAIT_PRIVATE here as the kernel does a
// FUTEX_WAKE and not a FUTEX_WAKE_PRIVATE.

View File

@ -28,6 +28,7 @@ union ThreadRunner {
union ThreadReturnValue {
void *posix_retval;
int stdc_retval;
constexpr ThreadReturnValue() : posix_retval(nullptr) {}
};
#if (defined(LLVM_LIBC_ARCH_AARCH64) || defined(LLVM_LIBC_ARCH_X86_64))
@ -87,13 +88,21 @@ struct alignas(STACK_ALIGNMENT) ThreadAttributes {
int tid;
ThreadStyle style;
ThreadReturnValue retval;
void *platform_data;
constexpr ThreadAttributes()
: detach_state(uint32_t(DetachState::DETACHED)), stack(nullptr),
tls(nullptr), stack_size(0), owned_stack(false), tid(-1),
style(ThreadStyle::POSIX), retval(),
platform_data(nullptr) {
}
};
struct Thread {
ThreadAttributes *attrib;
void *platform_data;
Thread() = default;
constexpr Thread() : attrib(nullptr) {}
constexpr Thread(ThreadAttributes *attr) : attrib(attr) {}
int run(ThreadRunnerPosix *func, void *arg, void *stack, size_t size,
bool detached = false) {