mirror of
https://github.com/dart-lang/sdk
synced 2024-11-02 10:49:00 +00:00
db0fa84d59
OSThread::GetCurrentThreadId() is used in many places throughout the vm, particularly in facilities that are used heavily, such as SafepointRwLock. The high frequency of invocations means that the runtime overhead of getting the current thread id has a significant impact on the overall performance of the vm. The current Fuchsia implemention of OSThread::GetCurrentThreadId() makes a syscall to get the koid of the current thread's handle, resulting in hundreds of nanoseconds of unnecessary overhead per invocation. This patch changes to using the thread's handle as the id, which is guaranteed to be unique for the lifetime of the thread, unless it is closed prematurely (nothing in the vm does this). This approach is similar to what MUSL libc (the libc used by Fuchsia) does for the same purpose and has significant mileage. Bug: b/182183059 TEST=existing ci test suite; manually deployed into Fuchsia build. Change-Id: I274a793a823a717c8dd206b396001c6acb897b9a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/193643 Reviewed-by: Chase Latta <chaselatta@google.com> Commit-Queue: Chase Latta <chaselatta@google.com>
77 lines
1.7 KiB
C++
77 lines
1.7 KiB
C++
// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#ifndef RUNTIME_VM_OS_THREAD_FUCHSIA_H_
|
|
#define RUNTIME_VM_OS_THREAD_FUCHSIA_H_
|
|
|
|
#if !defined(RUNTIME_VM_OS_THREAD_H_)
|
|
#error Do not include os_thread_fuchsia.h directly; use os_thread.h instead.
|
|
#endif
|
|
|
|
#include <pthread.h>
|
|
#include <zircon/syscalls/object.h>
|
|
|
|
#include "platform/assert.h"
|
|
#include "platform/globals.h"
|
|
|
|
namespace dart {
|
|
|
|
typedef pthread_key_t ThreadLocalKey;
|
|
typedef zx_handle_t ThreadId;
|
|
typedef pthread_t ThreadJoinId;
|
|
|
|
static const ThreadLocalKey kUnsetThreadLocalKey =
|
|
static_cast<pthread_key_t>(-1);
|
|
|
|
class ThreadInlineImpl {
|
|
private:
|
|
ThreadInlineImpl() {}
|
|
~ThreadInlineImpl() {}
|
|
|
|
static uword GetThreadLocal(ThreadLocalKey key) {
|
|
ASSERT(key != kUnsetThreadLocalKey);
|
|
return reinterpret_cast<uword>(pthread_getspecific(key));
|
|
}
|
|
|
|
friend class OSThread;
|
|
|
|
DISALLOW_ALLOCATION();
|
|
DISALLOW_COPY_AND_ASSIGN(ThreadInlineImpl);
|
|
};
|
|
|
|
class MutexData {
|
|
private:
|
|
MutexData() {}
|
|
~MutexData() {}
|
|
|
|
pthread_mutex_t* mutex() { return &mutex_; }
|
|
|
|
pthread_mutex_t mutex_;
|
|
|
|
friend class Mutex;
|
|
|
|
DISALLOW_ALLOCATION();
|
|
DISALLOW_COPY_AND_ASSIGN(MutexData);
|
|
};
|
|
|
|
class MonitorData {
|
|
private:
|
|
MonitorData() {}
|
|
~MonitorData() {}
|
|
|
|
pthread_mutex_t* mutex() { return &mutex_; }
|
|
pthread_cond_t* cond() { return &cond_; }
|
|
|
|
pthread_mutex_t mutex_;
|
|
pthread_cond_t cond_;
|
|
|
|
friend class Monitor;
|
|
|
|
DISALLOW_ALLOCATION();
|
|
DISALLOW_COPY_AND_ASSIGN(MonitorData);
|
|
};
|
|
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_VM_OS_THREAD_FUCHSIA_H_
|