Files
sdk/runtime/vm/thread.h
T
koda@google.com c042387868 Move CHA field back to Isolate, pending a permanent fix.
Since the Thread structure is currently cleared on Enter/ExitIsolate,
there is a risk that CHA is cleared if an embedder callback executes during
compilation and switches/spawns isolates. This CL eliminates that risk.

However, Isolate is still not a good long-term place for CHA,
since it doesn't fit with a concurrent compilation model. Issue 23153 tracks
the work towards a permanent solution that couples its life cycle with
compilation.

R=fschneider@google.com, iposva@google.com

Review URL: https://codereview.chromium.org//1061243003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@45121 260f80e4-7a28-3924-810f-c04153c831b5
2015-04-13 20:59:51 +00:00

70 lines
1.9 KiB
C++

// Copyright (c) 2015, 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 VM_THREAD_H_
#define VM_THREAD_H_
#include "vm/base_isolate.h"
#include "vm/globals.h"
#include "vm/os_thread.h"
namespace dart {
class CHA;
class Isolate;
// A VM thread; may be executing Dart code or performing helper tasks like
// garbage collection or compilation. The Thread structure associated with
// a thread is allocated when the thread enters an isolate, and destroyed
// upon exiting an isolate or an explicit call to CleanUp.
class Thread {
public:
// The currently executing thread, or NULL if not yet initialized.
static Thread* Current() {
return reinterpret_cast<Thread*>(OSThread::GetThreadLocal(thread_key_));
}
// Makes the current thread enter 'isolate'. Also calls EnsureInit.
static void EnterIsolate(Isolate* isolate);
// Makes the current thread exit its isolate. Also calls CleanUp.
static void ExitIsolate();
// Initializes the current thread as a VM thread, if not already done.
static void EnsureInit();
// Clears the state of the current thread.
static void CleanUp();
// Called at VM startup.
static void InitOnce();
// The topmost zone used for allocation in this thread.
Zone* zone() {
return reinterpret_cast<BaseIsolate*>(isolate())->current_zone();
}
// The isolate that this thread is operating on, or NULL if none.
Isolate* isolate() const { return isolate_; }
// The (topmost) CHA for the compilation in the isolate of this thread.
// TODO(23153): Move this out of Isolate/Thread.
CHA* cha() const;
void set_cha(CHA* value);
private:
static ThreadLocalKey thread_key_;
Isolate* isolate_;
Thread()
: isolate_(NULL) {}
static void SetCurrent(Thread* current);
DISALLOW_COPY_AND_ASSIGN(Thread);
};
} // namespace dart
#endif // VM_THREAD_H_