Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(238)

Side by Side Diff: components/cronet/android/cronet_bidirectional_stream_adapter.cc

Issue 2360813003: [Cronet] Pass metrics information from C++ BidirectionalStream to Java (Closed)
Patch Set: Rebased Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cronet_bidirectional_stream_adapter.h" 5 #include "cronet_bidirectional_stream_adapter.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 // may be -1 if |array| is not a valid Java array), provide a safe wrapper 42 // may be -1 if |array| is not a valid Java array), provide a safe wrapper
43 // that always returns a valid, non-negative size. 43 // that always returns a valid, non-negative size.
44 template <typename JavaArrayType> 44 template <typename JavaArrayType>
45 size_t SafeGetArrayLength(JNIEnv* env, JavaArrayType jarray) { 45 size_t SafeGetArrayLength(JNIEnv* env, JavaArrayType jarray) {
46 DCHECK(jarray); 46 DCHECK(jarray);
47 jsize length = env->GetArrayLength(jarray); 47 jsize length = env->GetArrayLength(jarray);
48 DCHECK_GE(length, 0) << "Invalid array length: " << length; 48 DCHECK_GE(length, 0) << "Invalid array length: " << length;
49 return static_cast<size_t>(std::max(0, length)); 49 return static_cast<size_t>(std::max(0, length));
50 } 50 }
51 51
52 int64_t ConvertTime(base::TimeTicks ticks,
53 base::Time start_time,
54 base::TimeTicks start_ticks) {
55 if (ticks.is_null()) {
56 return -1;
57 }
58 return (start_time + (ticks - start_ticks)).ToJavaTime();
59 }
60
52 } // namespace 61 } // namespace
53 62
54 PendingWriteData::PendingWriteData(JNIEnv* env, 63 PendingWriteData::PendingWriteData(JNIEnv* env,
55 jobjectArray jwrite_buffer_list, 64 jobjectArray jwrite_buffer_list,
56 jintArray jwrite_buffer_pos_list, 65 jintArray jwrite_buffer_pos_list,
57 jintArray jwrite_buffer_limit_list, 66 jintArray jwrite_buffer_limit_list,
58 jboolean jwrite_end_of_stream) { 67 jboolean jwrite_end_of_stream) {
59 this->jwrite_buffer_list.Reset(env, jwrite_buffer_list); 68 this->jwrite_buffer_list.Reset(env, jwrite_buffer_list);
60 this->jwrite_buffer_pos_list.Reset(env, jwrite_buffer_pos_list); 69 this->jwrite_buffer_pos_list.Reset(env, jwrite_buffer_pos_list);
61 this->jwrite_buffer_limit_list.Reset(env, jwrite_buffer_limit_list); 70 this->jwrite_buffer_limit_list.Reset(env, jwrite_buffer_limit_list);
62 this->jwrite_end_of_stream = jwrite_end_of_stream; 71 this->jwrite_end_of_stream = jwrite_end_of_stream;
63 } 72 }
64 73
65 PendingWriteData::~PendingWriteData() { 74 PendingWriteData::~PendingWriteData() {
66 // Reset global references. 75 // Reset global references.
67 jwrite_buffer_list.Reset(); 76 jwrite_buffer_list.Reset();
68 jwrite_buffer_pos_list.Reset(); 77 jwrite_buffer_pos_list.Reset();
69 jwrite_buffer_limit_list.Reset(); 78 jwrite_buffer_limit_list.Reset();
70 } 79 }
71 80
72 static jlong CreateBidirectionalStream( 81 static jlong CreateBidirectionalStream(
73 JNIEnv* env, 82 JNIEnv* env,
74 const base::android::JavaParamRef<jobject>& jbidi_stream, 83 const base::android::JavaParamRef<jobject>& jbidi_stream,
75 jlong jurl_request_context_adapter, 84 jlong jurl_request_context_adapter,
76 jboolean jsend_request_headers_automatically) { 85 jboolean jsend_request_headers_automatically,
86 jboolean jenable_metrics) {
77 CronetURLRequestContextAdapter* context_adapter = 87 CronetURLRequestContextAdapter* context_adapter =
78 reinterpret_cast<CronetURLRequestContextAdapter*>( 88 reinterpret_cast<CronetURLRequestContextAdapter*>(
79 jurl_request_context_adapter); 89 jurl_request_context_adapter);
80 DCHECK(context_adapter); 90 DCHECK(context_adapter);
81 91
82 CronetBidirectionalStreamAdapter* adapter = 92 CronetBidirectionalStreamAdapter* adapter =
83 new CronetBidirectionalStreamAdapter(context_adapter, env, jbidi_stream, 93 new CronetBidirectionalStreamAdapter(context_adapter, env, jbidi_stream,
84 jsend_request_headers_automatically); 94 jsend_request_headers_automatically,
95 jenable_metrics);
85 96
86 return reinterpret_cast<jlong>(adapter); 97 return reinterpret_cast<jlong>(adapter);
87 } 98 }
88 99
89 // static 100 // static
90 bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) { 101 bool CronetBidirectionalStreamAdapter::RegisterJni(JNIEnv* env) {
91 return RegisterNativesImpl(env); 102 return RegisterNativesImpl(env);
92 } 103 }
93 104
94 CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter( 105 CronetBidirectionalStreamAdapter::CronetBidirectionalStreamAdapter(
95 CronetURLRequestContextAdapter* context, 106 CronetURLRequestContextAdapter* context,
96 JNIEnv* env, 107 JNIEnv* env,
97 const base::android::JavaParamRef<jobject>& jbidi_stream, 108 const base::android::JavaParamRef<jobject>& jbidi_stream,
98 bool send_request_headers_automatically) 109 bool send_request_headers_automatically,
110 bool enable_metrics)
99 : context_(context), 111 : context_(context),
100 owner_(env, jbidi_stream), 112 owner_(env, jbidi_stream),
101 send_request_headers_automatically_(send_request_headers_automatically), 113 send_request_headers_automatically_(send_request_headers_automatically),
114 enable_metrics_(enable_metrics),
102 stream_failed_(false) {} 115 stream_failed_(false) {}
103 116
104 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() { 117 CronetBidirectionalStreamAdapter::~CronetBidirectionalStreamAdapter() {
105 DCHECK(context_->IsOnNetworkThread()); 118 DCHECK(context_->IsOnNetworkThread());
106 } 119 }
107 120
108 void CronetBidirectionalStreamAdapter::SendRequestHeaders( 121 void CronetBidirectionalStreamAdapter::SendRequestHeaders(
109 JNIEnv* env, 122 JNIEnv* env,
110 const base::android::JavaParamRef<jobject>& jcaller) { 123 const base::android::JavaParamRef<jobject>& jcaller) {
111 context_->PostTaskToNetworkThread( 124 context_->PostTaskToNetworkThread(
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 } 417 }
405 } 418 }
406 419
407 void CronetBidirectionalStreamAdapter::DestroyOnNetworkThread( 420 void CronetBidirectionalStreamAdapter::DestroyOnNetworkThread(
408 bool send_on_canceled) { 421 bool send_on_canceled) {
409 DCHECK(context_->IsOnNetworkThread()); 422 DCHECK(context_->IsOnNetworkThread());
410 if (send_on_canceled) { 423 if (send_on_canceled) {
411 JNIEnv* env = base::android::AttachCurrentThread(); 424 JNIEnv* env = base::android::AttachCurrentThread();
412 cronet::Java_CronetBidirectionalStream_onCanceled(env, owner_.obj()); 425 cronet::Java_CronetBidirectionalStream_onCanceled(env, owner_.obj());
413 } 426 }
427 MaybeReportMetrics();
414 delete this; 428 delete this;
415 } 429 }
416 430
417 base::android::ScopedJavaLocalRef<jobjectArray> 431 base::android::ScopedJavaLocalRef<jobjectArray>
418 CronetBidirectionalStreamAdapter::GetHeadersArray( 432 CronetBidirectionalStreamAdapter::GetHeadersArray(
419 JNIEnv* env, 433 JNIEnv* env,
420 const net::SpdyHeaderBlock& header_block) { 434 const net::SpdyHeaderBlock& header_block) {
421 DCHECK(context_->IsOnNetworkThread()); 435 DCHECK(context_->IsOnNetworkThread());
422 436
423 std::vector<std::string> headers; 437 std::vector<std::string> headers;
424 for (const auto& header : header_block) { 438 for (const auto& header : header_block) {
425 headers.push_back(header.first.as_string()); 439 headers.push_back(header.first.as_string());
426 headers.push_back(header.second.as_string()); 440 headers.push_back(header.second.as_string());
427 } 441 }
428 return base::android::ToJavaArrayOfStrings(env, headers); 442 return base::android::ToJavaArrayOfStrings(env, headers);
429 } 443 }
430 444
445 void CronetBidirectionalStreamAdapter::MaybeReportMetrics() {
446 if (!enable_metrics_)
447 return;
448
449 if (!bidi_stream_)
450 return;
451 net::LoadTimingInfo load_timing_info;
452 bidi_stream_->GetLoadTimingInfo(&load_timing_info);
453 JNIEnv* env = base::android::AttachCurrentThread();
454 base::Time start_time = load_timing_info.request_start_time;
455 base::TimeTicks start_ticks = load_timing_info.request_start;
456 cronet::Java_CronetBidirectionalStream_onMetricsCollected(
457 env, owner_.obj(), start_time.ToJavaTime(),
458 ConvertTime(load_timing_info.connect_timing.dns_start, start_time,
459 start_ticks),
460 ConvertTime(load_timing_info.connect_timing.dns_end, start_time,
461 start_ticks),
462 ConvertTime(load_timing_info.connect_timing.connect_start, start_time,
463 start_ticks),
464 ConvertTime(load_timing_info.connect_timing.connect_end, start_time,
465 start_ticks),
466 ConvertTime(load_timing_info.connect_timing.ssl_start, start_time,
467 start_ticks),
468 ConvertTime(load_timing_info.connect_timing.ssl_end, start_time,
469 start_ticks),
470 ConvertTime(load_timing_info.send_start, start_time, start_ticks),
471 ConvertTime(load_timing_info.send_end, start_time, start_ticks),
472 ConvertTime(load_timing_info.push_start, start_time, start_ticks),
473 ConvertTime(load_timing_info.push_end, start_time, start_ticks),
474 ConvertTime(load_timing_info.receive_headers_end, start_time,
475 start_ticks),
476 ConvertTime(base::TimeTicks::Now(), start_time, start_ticks),
477 load_timing_info.socket_reused, bidi_stream_->GetTotalSentBytes(),
478 bidi_stream_->GetTotalReceivedBytes());
479 }
480
431 } // namespace cronet 481 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698