Ensure embedder timeline callbacks are called for service protocol requests

BUG=
R=chinmaygarde@google.com, rmacnak@google.com

Review URL: https://codereview.chromium.org/1799933002 .
This commit is contained in:
John McCutchan
2016-03-15 07:59:04 -07:00
parent 149ad3a2e9
commit 9bc7398eb8
9 changed files with 91 additions and 19 deletions
+8
View File
@@ -48,6 +48,14 @@ void TextBuffer::AddChar(char ch) {
}
void TextBuffer::AddRaw(const uint8_t* buffer,
intptr_t buffer_length) {
EnsureCapacity(buffer_length);
memmove(&buf_[msg_len_], buffer, buffer_length);
msg_len_ += buffer_length;
buf_[msg_len_] = '\0';
}
intptr_t TextBuffer::Printf(const char* format, ...) {
va_list args;
va_start(args, format);
+2
View File
@@ -23,6 +23,8 @@ class TextBuffer : ValueObject {
void EscapeAndAddCodeUnit(uint32_t cu);
void AddString(const char* s);
void AddEscapedString(const char* s);
void AddRaw(const uint8_t* buffer,
intptr_t buffer_length);
void Clear();
+6 -17
View File
@@ -5890,8 +5890,7 @@ static void DataStreamToConsumer(Dart_StreamConsumer consumer,
static bool StreamTraceEvents(Dart_StreamConsumer consumer,
void* user_data,
JSONStream* js,
bool insert_comma) {
JSONStream* js) {
ASSERT(js != NULL);
// Steal output from JSONStream.
char* output = NULL;
@@ -5909,13 +5908,8 @@ static bool StreamTraceEvents(Dart_StreamConsumer consumer,
// Replace the ']' with the null character.
output[output_length - 1] = '\0';
char* start = &output[1];
if (insert_comma) {
output[0] = ',';
start = &output[0];
} else {
// We are skipping the '['.
output_length -= 1;
}
// We are skipping the '['.
output_length -= 1;
DataStreamToConsumer(consumer,
user_data,
@@ -5952,7 +5946,7 @@ DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer,
IsolateTimelineEventFilter filter(isolate->main_port());
timeline_recorder->PrintTraceEvent(&js, &filter);
StartStreamToConsumer(consumer, user_data, "timeline");
bool success = StreamTraceEvents(consumer, user_data, &js, false);
bool success = StreamTraceEvents(consumer, user_data, &js);
FinishStreamToConsumer(consumer, user_data, "timeline");
return success;
}
@@ -5989,17 +5983,12 @@ DART_EXPORT bool Dart_GlobalTimelineGetTrace(Dart_StreamConsumer consumer,
return false;
}
Timeline::ReclaimCachedBlocksFromThreads();
bool success = false;
JSONStream js;
TimelineEventFilter filter;
timeline_recorder->PrintTraceEvent(&js, &filter);
StartStreamToConsumer(consumer, user_data, "timeline");
bool success = false;
if (Timeline::get_get_timeline_cb() != NULL) {
if (Timeline::get_get_timeline_cb()(consumer, user_data)) {
success = true;
}
}
if (StreamTraceEvents(consumer, user_data, &js, success)) {
if (StreamTraceEvents(consumer, user_data, &js)) {
success = true;
}
FinishStreamToConsumer(consumer, user_data, "timeline");
+1 -1
View File
@@ -9827,7 +9827,7 @@ TEST_CASE(Timeline_Dart_EmbedderTimelineGetTimeline) {
bool success = Dart_GlobalTimelineGetTrace(AppendStreamConsumer, &data);
EXPECT(success);
EXPECT_SUBSTRING("HELLO FROM EMBEDDER,{\"name\":\"testDurationEvent\"",
EXPECT_SUBSTRING("}},HELLO FROM EMBEDDER",
data.buffer);
// Free buffer allocated by AppendStreamConsumer
+22
View File
@@ -20,6 +20,23 @@ namespace dart {
#ifndef PRODUCT
void AppendJSONStreamConsumer(Dart_StreamConsumer_State state,
const char* stream_name,
const uint8_t* buffer,
intptr_t buffer_length,
void* user_data) {
if ((state == Dart_StreamConsumer_kStart) ||
(state == Dart_StreamConsumer_kFinish)) {
// Ignore.
return;
}
ASSERT(state == Dart_StreamConsumer_kData);
JSONStream* js = reinterpret_cast<JSONStream*>(user_data);
ASSERT(js != NULL);
js->AppendSerializedObject(buffer, buffer_length);
}
DECLARE_FLAG(bool, trace_service);
JSONStream::JSONStream(intptr_t buf_size)
@@ -263,6 +280,11 @@ void JSONStream::AppendSerializedObject(const char* serialized_object) {
}
void JSONStream::AppendSerializedObject(const uint8_t* buffer,
intptr_t buffer_length) {
buffer_.AddRaw(buffer, buffer_length);
}
void JSONStream::AppendSerializedObject(const char* property_name,
const char* serialized_object) {
PrintCommaIfNeeded();
+12 -1
View File
@@ -55,6 +55,12 @@ enum JSONRpcErrorCode {
kIsolateMustBeRunnable = 105,
};
// Expected that user_data is a JSONStream*.
void AppendJSONStreamConsumer(Dart_StreamConsumer_State state,
const char* stream_name,
const uint8_t* buffer,
intptr_t buffer_length,
void* user_data);
class JSONStream : ValueObject {
public:
@@ -129,6 +135,12 @@ class JSONStream : ValueObject {
// Append |serialized_object| to the stream.
void AppendSerializedObject(const char* serialized_object);
void PrintCommaIfNeeded();
// Append |buffer| to the stream.
void AppendSerializedObject(const uint8_t* buffer,
intptr_t buffer_length);
// Append |serialized_object| to the stream with |property_name|.
void AppendSerializedObject(const char* property_name,
const char* serialized_object);
@@ -196,7 +208,6 @@ class JSONStream : ValueObject {
const TimelineEventBlock* timeline_event_block);
void PrintPropertyVM(const char* name, bool ref = true);
void PrintPropertyName(const char* name);
void PrintCommaIfNeeded();
bool NeedComma();
bool AddDartString(const String& s, intptr_t offset, intptr_t count);
+27
View File
@@ -315,6 +315,33 @@ TEST_CASE(JSON_JSONStream_Params) {
EXPECT(!js.ParamIs("dog", "banana"));
}
TEST_CASE(JSON_JSONStream_AppendJSONStreamConsumer) {
JSONStream js;
{
JSONObject obj(&js);
{
JSONArray arr(&obj, "test");
const char* test_data = "{a, b, c},";
AppendJSONStreamConsumer(Dart_StreamConsumer_kData, "",
reinterpret_cast<const uint8_t*>(&test_data[0]),
strlen(test_data),
&js);
AppendJSONStreamConsumer(Dart_StreamConsumer_kData, "",
reinterpret_cast<const uint8_t*>(&test_data[0]),
strlen(test_data),
&js);
AppendJSONStreamConsumer(Dart_StreamConsumer_kData, "",
reinterpret_cast<const uint8_t*>(&test_data[0]),
strlen(test_data) - 1,
&js);
}
}
EXPECT_STREQ("{\"test\":[{a, b, c},{a, b, c},{a, b, c}]}", js.ToCString());
}
#endif // !PRODUCT
} // namespace dart
+12
View File
@@ -1027,6 +1027,14 @@ void TimelineEventRecorder::ThreadBlockCompleteEvent(TimelineEvent* event) {
}
void TimelineEventRecorder::PrintEmbedderJSONEvents(JSONStream* events) {
if (Timeline::get_get_timeline_cb() != NULL) {
events->PrintCommaIfNeeded();
Timeline::get_get_timeline_cb()(AppendJSONStreamConsumer, events);
}
}
void TimelineEventRecorder::WriteTo(const char* directory) {
if (!FLAG_support_service) {
return;
@@ -1166,6 +1174,7 @@ void TimelineEventRingRecorder::PrintJSON(JSONStream* js,
JSONArray events(&topLevel, "traceEvents");
PrintJSONMeta(&events);
PrintJSONEvents(&events, filter);
PrintEmbedderJSONEvents(js);
}
}
@@ -1177,6 +1186,7 @@ void TimelineEventRingRecorder::PrintTraceEvent(JSONStream* js,
}
JSONArray events(js);
PrintJSONEvents(&events, filter);
PrintEmbedderJSONEvents(js);
}
@@ -1299,6 +1309,7 @@ void TimelineEventEndlessRecorder::PrintJSON(JSONStream* js,
JSONArray events(&topLevel, "traceEvents");
PrintJSONMeta(&events);
PrintJSONEvents(&events, filter);
PrintEmbedderJSONEvents(js);
}
}
@@ -1311,6 +1322,7 @@ void TimelineEventEndlessRecorder::PrintTraceEvent(
}
JSONArray events(js);
PrintJSONEvents(&events, filter);
PrintEmbedderJSONEvents(js);
}
+1
View File
@@ -678,6 +678,7 @@ class TimelineEventRecorder {
void PrintJSONMeta(JSONArray* array) const;
TimelineEvent* ThreadBlockStartEvent();
void ThreadBlockCompleteEvent(TimelineEvent* event);
void PrintEmbedderJSONEvents(JSONStream* events);
Mutex lock_;
uintptr_t async_id_;