Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 251 // embedder releases it, too. | 251 // embedder releases it, too. |
| 252 read_buffer_ = nullptr; | 252 read_buffer_ = nullptr; |
| 253 } | 253 } |
| 254 | 254 |
| 255 void CronetBidirectionalStreamAdapter::OnDataSent() { | 255 void CronetBidirectionalStreamAdapter::OnDataSent() { |
| 256 DCHECK(context_->IsOnNetworkThread()); | 256 DCHECK(context_->IsOnNetworkThread()); |
| 257 DCHECK(!write_buffer_list_.empty()); | 257 DCHECK(!write_buffer_list_.empty()); |
| 258 | 258 |
| 259 JNIEnv* env = base::android::AttachCurrentThread(); | 259 JNIEnv* env = base::android::AttachCurrentThread(); |
| 260 base::android::ScopedJavaLocalRef<jclass> byte_buffer_clazz( | 260 base::android::ScopedJavaLocalRef<jclass> byte_buffer_clazz( |
| 261 env, env->GetObjectClass(write_buffer_list_[0]->byte_buffer())); | 261 env, env->GetObjectClass(write_buffer_list_[0]->byte_buffer())); |
|
mef
2016/05/09 18:35:13
This seems pretty inefficient, and ALSO wrong. You
xunjieli
2016/05/09 21:31:14
Done.
mef
2016/05/09 21:48:15
sg to limit this CL to fix of the leak.
| |
| 262 size_t size = write_buffer_list_.size(); | 262 size_t size = write_buffer_list_.size(); |
| 263 jobjectArray jbuffers = | 263 jobjectArray jbuffer_array = |
| 264 env->NewObjectArray(size, byte_buffer_clazz.obj(), NULL); | 264 env->NewObjectArray(size, byte_buffer_clazz.obj(), NULL); |
| 265 base::android::CheckException(env); | 265 base::android::CheckException(env); |
| 266 std::vector<int> initial_positions; | 266 std::vector<int> initial_positions; |
| 267 std::vector<int> initial_limits; | 267 std::vector<int> initial_limits; |
| 268 for (size_t i = 0; i < size; ++i) { | 268 for (size_t i = 0; i < size; ++i) { |
| 269 env->SetObjectArrayElement(jbuffers, i, | 269 env->SetObjectArrayElement(jbuffer_array, i, |
| 270 write_buffer_list_[i]->byte_buffer()); | 270 write_buffer_list_[i]->byte_buffer()); |
|
mef
2016/05/09 18:35:12
nit: It took me a little bit to understand that IO
xunjieli
2016/05/09 21:31:14
Done.
| |
| 271 initial_positions.push_back(write_buffer_list_[i]->initial_position()); | 271 initial_positions.push_back(write_buffer_list_[i]->initial_position()); |
| 272 initial_limits.push_back(write_buffer_list_[i]->initial_limit()); | 272 initial_limits.push_back(write_buffer_list_[i]->initial_limit()); |
| 273 } | 273 } |
| 274 ScopedJavaLocalRef<jobjectArray> jbuffers(env, jbuffer_array); | |
|
mef
2016/05/09 18:35:12
Could this be combined with allocation of NewObjec
xunjieli
2016/05/09 21:31:15
Not that I know of. I am following the example in
| |
| 274 ScopedJavaLocalRef<jintArray> jinitial_positions = | 275 ScopedJavaLocalRef<jintArray> jinitial_positions = |
| 275 base::android::ToJavaIntArray(env, initial_positions); | 276 base::android::ToJavaIntArray(env, initial_positions); |
| 276 ScopedJavaLocalRef<jintArray> jinitial_limits = | 277 ScopedJavaLocalRef<jintArray> jinitial_limits = |
| 277 base::android::ToJavaIntArray(env, initial_limits); | 278 base::android::ToJavaIntArray(env, initial_limits); |
| 278 // Call into Java. | 279 // Call into Java. |
| 279 cronet::Java_CronetBidirectionalStream_onWritevCompleted( | 280 cronet::Java_CronetBidirectionalStream_onWritevCompleted( |
| 280 env, owner_.obj(), jbuffers, jinitial_positions.obj(), | 281 env, owner_.obj(), jbuffers.obj(), jinitial_positions.obj(), |
| 281 jinitial_limits.obj(), write_end_of_stream_); | 282 jinitial_limits.obj(), write_end_of_stream_); |
| 282 // Free the write buffers. This lets the Java ByteBuffer be freed, if the | 283 // Free the write buffers. This lets the Java ByteBuffer be freed, if the |
| 283 // embedder releases it, too. | 284 // embedder releases it, too. |
| 284 write_buffer_list_.clear(); | 285 write_buffer_list_.clear(); |
| 285 } | 286 } |
| 286 | 287 |
| 287 void CronetBidirectionalStreamAdapter::OnTrailersReceived( | 288 void CronetBidirectionalStreamAdapter::OnTrailersReceived( |
| 288 const net::SpdyHeaderBlock& response_trailers) { | 289 const net::SpdyHeaderBlock& response_trailers) { |
| 289 DCHECK(context_->IsOnNetworkThread()); | 290 DCHECK(context_->IsOnNetworkThread()); |
| 290 JNIEnv* env = base::android::AttachCurrentThread(); | 291 JNIEnv* env = base::android::AttachCurrentThread(); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 388 | 389 |
| 389 std::vector<std::string> headers; | 390 std::vector<std::string> headers; |
| 390 for (const auto& header : header_block) { | 391 for (const auto& header : header_block) { |
| 391 headers.push_back(header.first.as_string()); | 392 headers.push_back(header.first.as_string()); |
| 392 headers.push_back(header.second.as_string()); | 393 headers.push_back(header.second.as_string()); |
| 393 } | 394 } |
| 394 return base::android::ToJavaArrayOfStrings(env, headers); | 395 return base::android::ToJavaArrayOfStrings(env, headers); |
| 395 } | 396 } |
| 396 | 397 |
| 397 } // namespace cronet | 398 } // namespace cronet |
| OLD | NEW |