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

Side by Side Diff: net/log/file_net_log_observer.cc

Issue 2932613002: Fix race causing crash in net::FileNetLogObserver shutdown (Closed)
Patch Set: add tests Created 3 years, 6 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "net/log/file_net_log_observer.h" 5 #include "net/log/file_net_log_observer.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <memory> 8 #include <memory>
9 #include <queue> 9 #include <queue>
10 #include <set> 10 #include <set>
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 new WriteQueue(std::numeric_limits<size_t>::max())); 258 new WriteQueue(std::numeric_limits<size_t>::max()));
259 259
260 return std::unique_ptr<FileNetLogObserver>( 260 return std::unique_ptr<FileNetLogObserver>(
261 new FileNetLogObserver(file_task_runner, std::move(file_writer), 261 new FileNetLogObserver(file_task_runner, std::move(file_writer),
262 std::move(write_queue), std::move(constants))); 262 std::move(write_queue), std::move(constants)));
263 } 263 }
264 264
265 FileNetLogObserver::~FileNetLogObserver() { 265 FileNetLogObserver::~FileNetLogObserver() {
266 if (net_log()) { 266 if (net_log()) {
267 // StopObserving was not called. 267 // StopObserving was not called.
268 net_log()->DeprecatedRemoveObserver(this);
268 file_task_runner_->PostTask( 269 file_task_runner_->PostTask(
269 FROM_HERE, base::Bind(&FileNetLogObserver::FileWriter::DeleteAllFiles, 270 FROM_HERE, base::Bind(&FileNetLogObserver::FileWriter::DeleteAllFiles,
270 base::Unretained(file_writer_))); 271 base::Unretained(file_writer_)));
271 net_log()->DeprecatedRemoveObserver(this);
272 } 272 }
273 file_task_runner_->DeleteSoon(FROM_HERE, file_writer_); 273 file_task_runner_->DeleteSoon(FROM_HERE, file_writer_);
274 } 274 }
275 275
276 void FileNetLogObserver::StartObserving(NetLog* net_log, 276 void FileNetLogObserver::StartObserving(NetLog* net_log,
277 NetLogCaptureMode capture_mode) { 277 NetLogCaptureMode capture_mode) {
278 net_log->DeprecatedAddObserver(this, capture_mode); 278 net_log->DeprecatedAddObserver(this, capture_mode);
279 } 279 }
280 280
281 void FileNetLogObserver::StopObserving(std::unique_ptr<base::Value> polled_data, 281 void FileNetLogObserver::StopObserving(std::unique_ptr<base::Value> polled_data,
282 const base::Closure& callback) { 282 const base::Closure& callback) {
283 net_log()->DeprecatedRemoveObserver(this);
284
283 file_task_runner_->PostTaskAndReply( 285 file_task_runner_->PostTaskAndReply(
284 FROM_HERE, base::Bind(&FileNetLogObserver::FileWriter::FlushThenStop, 286 FROM_HERE, base::Bind(&FileNetLogObserver::FileWriter::FlushThenStop,
285 base::Unretained(file_writer_), write_queue_, 287 base::Unretained(file_writer_), write_queue_,
286 base::Passed(&polled_data)), 288 base::Passed(&polled_data)),
287 callback); 289 callback);
288
289 net_log()->DeprecatedRemoveObserver(this);
290 } 290 }
291 291
292 void FileNetLogObserver::OnAddEntry(const NetLogEntry& entry) { 292 void FileNetLogObserver::OnAddEntry(const NetLogEntry& entry) {
293 std::unique_ptr<std::string> json(new std::string); 293 std::unique_ptr<std::string> json(new std::string);
294 294
295 // If |entry| cannot be converted to proper JSON, ignore it. 295 // If |entry| cannot be converted to proper JSON, ignore it.
296 if (!base::JSONWriter::Write(*entry.ToValue(), json.get())) 296 if (!base::JSONWriter::Write(*entry.ToValue(), json.get()))
297 return; 297 return;
298 298
299 size_t queue_size = write_queue_->AddEntryToQueue(std::move(json)); 299 size_t queue_size = write_queue_->AddEntryToQueue(std::move(json));
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 } 430 }
431 431
432 void FileNetLogObserver::BoundedFileWriter::Flush( 432 void FileNetLogObserver::BoundedFileWriter::Flush(
433 scoped_refptr<FileNetLogObserver::WriteQueue> write_queue) { 433 scoped_refptr<FileNetLogObserver::WriteQueue> write_queue) {
434 DCHECK(task_runner_->RunsTasksInCurrentSequence()); 434 DCHECK(task_runner_->RunsTasksInCurrentSequence());
435 435
436 EventQueue local_file_queue; 436 EventQueue local_file_queue;
437 write_queue->SwapQueue(&local_file_queue); 437 write_queue->SwapQueue(&local_file_queue);
438 438
439 std::string to_print; 439 std::string to_print;
440 CHECK(!event_files_.empty());
440 size_t file_size = ftell(event_files_[current_file_idx_].get()); 441 size_t file_size = ftell(event_files_[current_file_idx_].get());
441 size_t memory_freed = 0; 442 size_t memory_freed = 0;
442 443
443 while (!local_file_queue.empty()) { 444 while (!local_file_queue.empty()) {
444 if (file_size >= max_file_size_) { 445 if (file_size >= max_file_size_) {
445 // The current file is full. Start a new current file. 446 // The current file is full. Start a new current file.
446 IncrementCurrentFile(); 447 IncrementCurrentFile();
447 file_size = 0; 448 file_size = 0;
448 } 449 }
449 fprintf(event_files_[current_file_idx_].get(), "%s,\n", 450 fprintf(event_files_[current_file_idx_].get(), "%s,\n",
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 void FileNetLogObserver::UnboundedFileWriter::DeleteAllFiles() { 531 void FileNetLogObserver::UnboundedFileWriter::DeleteAllFiles() {
531 DCHECK(task_runner_->RunsTasksInCurrentSequence()); 532 DCHECK(task_runner_->RunsTasksInCurrentSequence());
532 533
533 // Reset |file_| to release the file handle so base::DeleteFile can 534 // Reset |file_| to release the file handle so base::DeleteFile can
534 // safely access it. 535 // safely access it.
535 file_.reset(); 536 file_.reset();
536 base::DeleteFile(file_path_, false); 537 base::DeleteFile(file_path_, false);
537 } 538 }
538 539
539 } // namespace net 540 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698