Files
sdk/runtime/platform/threads.h
Vyacheslav Egorov e105029f62 [vm] Move synchronization primitives to platform
This CL also removes ability to assign names to mutexes which was
added in c25ebfff96 but did not yield
any interesting data.

TEST=ci

CoreLibraryReviewExempt: Changes to dart:concurrent only.
Cq-Include-Trybots: luci.dart.try:vm-fuchsia-release-x64-try,vm-win-debug-x64-try,vm-win-release-x64-try,vm-aot-linux-product-x64-try
Change-Id: Id41e1d29832f6008e02f0a571ee67564e1a84224
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/375300
Reviewed-by: Martin Kustermann <kustermann@google.com>
2024-08-07 12:59:35 +00:00

128 lines
3.8 KiB
C++

// Copyright (c) 2024, 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_PLATFORM_THREADS_H_
#define RUNTIME_PLATFORM_THREADS_H_
#include "platform/assert.h"
#if defined(DART_HOST_OS_LINUX) || defined(DART_HOST_OS_FUCHSIA) || \
defined(DART_HOST_OS_MACOS) || defined(DART_HOST_OS_ANDROID)
#include <pthread.h>
#endif
namespace dart {
namespace platform {
#if defined(DART_HOST_OS_LINUX) || defined(DART_HOST_OS_FUCHSIA) || \
defined(DART_HOST_OS_MACOS) || defined(DART_HOST_OS_ANDROID)
typedef pthread_t ThreadId;
#elif defined(DART_HOST_OS_WINDOWS)
typedef DWORD ThreadId;
#else
#error Unknown target os.
#endif
static constexpr ThreadId kInvalidThreadId = static_cast<ThreadId>(0);
inline ThreadId GetCurrentThreadId() {
#if defined(DART_HOST_OS_LINUX) || defined(DART_HOST_OS_FUCHSIA) || \
defined(DART_HOST_OS_MACOS) || defined(DART_HOST_OS_ANDROID)
return pthread_self();
#elif defined(DART_HOST_OS_WINDOWS)
return ::GetCurrentThreadId();
#else
#error Unknown target os.
#endif
}
inline bool AreSameThreads(ThreadId a, ThreadId b) {
#if defined(DART_HOST_OS_LINUX) || defined(DART_HOST_OS_FUCHSIA) || \
defined(DART_HOST_OS_MACOS) || defined(DART_HOST_OS_ANDROID)
return pthread_equal(a, b) != 0;
#elif defined(DART_HOST_OS_WINDOWS)
return a == b;
#else
#error Unknown target os.
#endif
}
#if defined(DEBUG)
class ThreadBoundResource {
public:
~ThreadBoundResource() { ASSERT(owner_ == kUnowned); }
void Acquire() {
ASSERT(owner_ == kUnowned);
owner_ = GetCurrentThreadId();
}
void Release() {
ASSERT(IsOwnedByCurrentThread());
owner_ = kUnowned;
}
bool IsOwnedByCurrentThread() const {
return AreSameThreads(owner_, GetCurrentThreadId());
}
private:
static constexpr ThreadId kUnowned = kInvalidThreadId;
ThreadId owner_ = kUnowned;
};
#else
class ThreadBoundResource {
public:
void Acquire() {}
void Release() {}
bool IsOwnedByCurrentThread() const {
UNREACHABLE();
return false;
}
};
#endif
} // namespace platform
#if defined(DART_HOST_OS_LINUX) || defined(DART_HOST_OS_FUCHSIA) || \
defined(DART_HOST_OS_MACOS) || defined(DART_HOST_OS_ANDROID)
#define VALIDATE_PTHREAD_RESULT(result) \
if (result != 0) { \
const int kBufferSize = 1024; \
char error_buf[kBufferSize]; \
FATAL("pthread error: %d (%s)", result, \
Utils::StrError(result, error_buf, kBufferSize)); \
}
#if defined(DEBUG)
#define ASSERT_PTHREAD_SUCCESS(result) VALIDATE_PTHREAD_RESULT(result)
#else
// NOTE: This (currently) expands to a no-op.
#define ASSERT_PTHREAD_SUCCESS(result) ASSERT(result == 0)
#endif
#ifdef DEBUG
#define RETURN_ON_PTHREAD_FAILURE(result) \
if (result != 0) { \
const int kBufferSize = 1024; \
char error_buf[kBufferSize]; \
fprintf(stderr, "%s:%d: pthread error: %d (%s)\n", __FILE__, __LINE__, \
result, Utils::StrError(result, error_buf, kBufferSize)); \
return result; \
}
#else
#define RETURN_ON_PTHREAD_FAILURE(result) \
if (result != 0) return result;
#endif
#endif
} // namespace dart
#endif // RUNTIME_PLATFORM_THREADS_H_