5f59a954f8
Also: - Reaps exited threads in the thread pool before putting a thread on the idle list so that a new arriving task isn't blocked on a supposedly idle thread in the middle of a join. - Stops trying to join eventhandler threads on Windows. Now that we're using the correct exit() call, we probably don't have to worry about exit code pollution, so joining the threads is unnecessary. related #26400 R=asiva@google.com, iposva@google.com Review URL: https://codereview.chromium.org/1978153002 .
116 lines
2.4 KiB
C++
116 lines
2.4 KiB
C++
// Copyright (c) 2012, 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 BIN_THREAD_H_
|
|
#define BIN_THREAD_H_
|
|
|
|
#include "platform/globals.h"
|
|
|
|
namespace dart {
|
|
namespace bin {
|
|
class Thread;
|
|
class Mutex;
|
|
class Monitor;
|
|
}
|
|
}
|
|
|
|
// Declare the OS-specific types ahead of defining the generic classes.
|
|
#if defined(TARGET_OS_ANDROID)
|
|
#include "bin/thread_android.h"
|
|
#elif defined(TARGET_OS_LINUX)
|
|
#include "bin/thread_linux.h"
|
|
#elif defined(TARGET_OS_MACOS)
|
|
#include "bin/thread_macos.h"
|
|
#elif defined(TARGET_OS_WINDOWS)
|
|
#include "bin/thread_win.h"
|
|
#else
|
|
#error Unknown target os.
|
|
#endif
|
|
|
|
namespace dart {
|
|
namespace bin {
|
|
|
|
class Thread {
|
|
public:
|
|
static const ThreadLocalKey kUnsetThreadLocalKey;
|
|
static const ThreadId kInvalidThreadId;
|
|
|
|
typedef void (*ThreadStartFunction) (uword parameter);
|
|
|
|
// Start a thread running the specified function. Returns 0 if the
|
|
// thread started successfuly and a system specific error code if
|
|
// the thread failed to start.
|
|
static int Start(ThreadStartFunction function, uword parameters);
|
|
|
|
static ThreadLocalKey CreateThreadLocal();
|
|
static void DeleteThreadLocal(ThreadLocalKey key);
|
|
static uword GetThreadLocal(ThreadLocalKey key) {
|
|
return ThreadInlineImpl::GetThreadLocal(key);
|
|
}
|
|
static void SetThreadLocal(ThreadLocalKey key, uword value);
|
|
static intptr_t GetMaxStackSize();
|
|
static ThreadId GetCurrentThreadId();
|
|
static intptr_t ThreadIdToIntPtr(ThreadId id);
|
|
static bool Compare(ThreadId a, ThreadId b);
|
|
static void GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage);
|
|
|
|
static void InitOnce();
|
|
|
|
private:
|
|
DISALLOW_ALLOCATION();
|
|
DISALLOW_IMPLICIT_CONSTRUCTORS(Thread);
|
|
};
|
|
|
|
|
|
class Mutex {
|
|
public:
|
|
Mutex();
|
|
~Mutex();
|
|
|
|
void Lock();
|
|
bool TryLock();
|
|
void Unlock();
|
|
|
|
private:
|
|
MutexData data_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(Mutex);
|
|
};
|
|
|
|
|
|
class Monitor {
|
|
public:
|
|
enum WaitResult {
|
|
kNotified,
|
|
kTimedOut
|
|
};
|
|
|
|
static const int64_t kNoTimeout = 0;
|
|
|
|
Monitor();
|
|
~Monitor();
|
|
|
|
void Enter();
|
|
void Exit();
|
|
|
|
// Wait for notification or timeout.
|
|
WaitResult Wait(int64_t millis);
|
|
WaitResult WaitMicros(int64_t micros);
|
|
|
|
// Notify waiting threads.
|
|
void Notify();
|
|
void NotifyAll();
|
|
|
|
private:
|
|
MonitorData data_; // OS-specific data.
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(Monitor);
|
|
};
|
|
|
|
} // namespace bin
|
|
} // namespace dart
|
|
|
|
|
|
#endif // BIN_THREAD_H_
|