mirror of
https://github.com/dart-lang/sdk
synced 2024-09-05 00:13:50 +00:00
![Ben Konyi](/assets/img/avatar_default.png)
user tags TEST=cpu_sample_streaming_test.dart Change-Id: Ia983217ae2a5da8c3252fafbed8197b4f4a20e2b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/224040 Reviewed-by: Siva Annamalai <asiva@google.com> Commit-Queue: Ben Konyi <bkonyi@google.com>
132 lines
4.1 KiB
C++
132 lines
4.1 KiB
C++
// Copyright (c) 2013, 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_TAGS_H_
|
|
#define RUNTIME_VM_TAGS_H_
|
|
|
|
#include "platform/growable_array.h"
|
|
#include "vm/allocation.h"
|
|
#include "vm/os_thread.h"
|
|
#include "vm/thread_stack_resource.h"
|
|
|
|
namespace dart {
|
|
|
|
class Isolate;
|
|
class JSONObject;
|
|
class RuntimeEntry;
|
|
|
|
#define VM_TAG_LIST(V) \
|
|
V(Idle) /* isolate is idle and is_runnable() */ \
|
|
V(LoadWait) /* isolate is idle and !is_runnable() */ \
|
|
V(VM) /* Catch all */ \
|
|
V(CompileOptimized) \
|
|
V(CompileUnoptimized) \
|
|
V(ClassLoading) \
|
|
V(CompileParseRegExp) \
|
|
V(Dart) \
|
|
V(GCNewSpace) \
|
|
V(GCOldSpace) \
|
|
V(GCIdle) \
|
|
V(Embedder) \
|
|
V(Runtime) \
|
|
V(Native)
|
|
|
|
class VMTag : public AllStatic {
|
|
public:
|
|
enum VMTagId {
|
|
kInvalidTagId = 0,
|
|
#define DEFINE_VM_TAG_ID(tag) k##tag##TagId,
|
|
VM_TAG_LIST(DEFINE_VM_TAG_ID)
|
|
#undef DEFINE_VM_TAG_KIND
|
|
kNumVMTags,
|
|
//
|
|
// All tags below |kNumVMTags| are special meta-data tags and do not
|
|
// indicate the state of the VM during a sample.
|
|
//
|
|
kRootTagId, // Special tag used as root of all profiles.
|
|
kTruncatedTagId, // Special tag used to indicate a truncated call stack.
|
|
// Code transition tags (used by unit tests).
|
|
kNoneCodeTagId,
|
|
kOptimizedCodeTagId,
|
|
kUnoptimizedCodeTagId,
|
|
kNativeCodeTagId,
|
|
kInlineStartCodeTagId,
|
|
kInlineEndCodeTagId,
|
|
kLastTagId,
|
|
};
|
|
|
|
static bool IsVMTag(uword id) {
|
|
return (id != kInvalidTagId) && (id < kNumVMTags);
|
|
}
|
|
static const char* TagName(uword id);
|
|
static bool IsNativeEntryTag(uword id);
|
|
static bool IsDartTag(uword id);
|
|
static bool IsExitFrameTag(uword id);
|
|
static bool IsRuntimeEntryTag(uword id);
|
|
static const char* RuntimeEntryTagName(uword id);
|
|
|
|
static void RegisterRuntimeEntry(RuntimeEntry* runtime_entry);
|
|
|
|
private:
|
|
struct TagEntry {
|
|
const char* name;
|
|
uword id;
|
|
};
|
|
static const TagEntry entries_[];
|
|
};
|
|
|
|
class VMTagScope : ThreadStackResource {
|
|
public:
|
|
VMTagScope(Thread* thread, uword tag, bool conditional_set = true);
|
|
~VMTagScope();
|
|
|
|
private:
|
|
uword previous_tag_;
|
|
|
|
DISALLOW_ALLOCATION();
|
|
DISALLOW_IMPLICIT_CONSTRUCTORS(VMTagScope);
|
|
};
|
|
|
|
class VMTagCounters {
|
|
public:
|
|
VMTagCounters();
|
|
|
|
void Increment(uword tag);
|
|
|
|
int64_t count(uword tag);
|
|
|
|
#ifndef PRODUCT
|
|
void PrintToJSONObject(JSONObject* obj);
|
|
#endif // !PRODUCT
|
|
|
|
private:
|
|
int64_t counters_[VMTag::kNumVMTags];
|
|
};
|
|
|
|
class UserTags : public AllStatic {
|
|
public:
|
|
// UserTag id space: [kUserTagIdOffset, kUserTagIdOffset + kMaxUserTags).
|
|
static const intptr_t kMaxUserTags = 256;
|
|
static const uword kUserTagIdOffset = 0x4096;
|
|
static const uword kDefaultUserTag = kUserTagIdOffset;
|
|
static const char* TagName(uword tag_id);
|
|
static bool IsUserTag(uword tag_id) {
|
|
return (tag_id >= kUserTagIdOffset) &&
|
|
(tag_id < kUserTagIdOffset + kMaxUserTags);
|
|
}
|
|
static void AddStreamableTagName(const char* tag);
|
|
static void RemoveStreamableTagName(const char* tag);
|
|
static bool IsTagNameStreamable(const char* tag);
|
|
static void Init();
|
|
static void Cleanup();
|
|
|
|
private:
|
|
static Mutex* subscribed_tags_lock_;
|
|
static MallocGrowableArray<const char*> subscribed_tags_;
|
|
};
|
|
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_VM_TAGS_H_
|