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

Side by Side Diff: media/base/composite_filter.cc

Issue 6226001: Change code to use ScopedRunnableMethodFactory & a static callback (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « media/base/composite_filter.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 "media/base/composite_filter.h" 5 #include "media/base/composite_filter.h"
6 6
7 #include "base/stl_util-inl.h" 7 #include "base/stl_util-inl.h"
8 #include "media/base/callback.h" 8 #include "media/base/callback.h"
9 9
10 namespace media { 10 namespace media {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 ThreadFactoryFunction thread_factory) { 48 ThreadFactoryFunction thread_factory) {
49 DCHECK(thread_factory); 49 DCHECK(thread_factory);
50 Init(message_loop, thread_factory); 50 Init(message_loop, thread_factory);
51 } 51 }
52 52
53 void CompositeFilter::Init(MessageLoop* message_loop, 53 void CompositeFilter::Init(MessageLoop* message_loop,
54 ThreadFactoryFunction thread_factory) { 54 ThreadFactoryFunction thread_factory) {
55 DCHECK(message_loop); 55 DCHECK(message_loop);
56 message_loop_ = message_loop; 56 message_loop_ = message_loop;
57 thread_factory_ = thread_factory; 57 thread_factory_ = thread_factory;
58 runnable_factory_.reset(
59 new ScopedRunnableMethodFactory<CompositeFilter>(this));
58 60
59 if (!thread_factory_) { 61 if (!thread_factory_) {
60 thread_factory_ = &CompositeFilter::DefaultThreadFactory; 62 thread_factory_ = &CompositeFilter::DefaultThreadFactory;
61 } 63 }
62 64
63 state_ = kCreated; 65 state_ = kCreated;
64 sequence_index_ = 0; 66 sequence_index_ = 0;
65 error_ = PIPELINE_OK; 67 error_ = PIPELINE_OK;
66 } 68 }
67 69
68 CompositeFilter::~CompositeFilter() { 70 CompositeFilter::~CompositeFilter() {
69 DCHECK_EQ(message_loop_, MessageLoop::current()); 71 DCHECK_EQ(message_loop_, MessageLoop::current());
70 DCHECK(state_ == kCreated || state_ == kStopped); 72 DCHECK(state_ == kCreated || state_ == kStopped);
71 73
72 // Stop every running filter thread. 74 // Stop every running filter thread.
73 for (FilterThreadVector::iterator iter = filter_threads_.begin(); 75 for (FilterThreadVector::iterator iter = filter_threads_.begin();
74 iter != filter_threads_.end(); 76 iter != filter_threads_.end();
75 ++iter) { 77 ++iter) {
76 (*iter)->Stop(); 78 (*iter)->Stop();
77 } 79 }
78 80
79 // Reset the pipeline, which will decrement a reference to this object.
80 // We will get destroyed as soon as the remaining tasks finish executing.
81 // To be safe, we'll set our pipeline reference to NULL.
acolwell GONE FROM CHROMIUM 2011/01/10 22:31:31 Removed because this comment is no longer relevant
82 filters_.clear(); 81 filters_.clear();
83 STLDeleteElements(&filter_threads_); 82 STLDeleteElements(&filter_threads_);
84 } 83 }
85 84
86 bool CompositeFilter::AddFilter(scoped_refptr<Filter> filter) { 85 bool CompositeFilter::AddFilter(scoped_refptr<Filter> filter) {
87 DCHECK_EQ(message_loop_, MessageLoop::current()); 86 DCHECK_EQ(message_loop_, MessageLoop::current());
88 if (!filter.get() || state_ != kCreated || !host()) 87 if (!filter.get() || state_ != kCreated || !host())
89 return false; 88 return false;
90 89
91 // Create a dedicated thread for this filter if applicable. 90 // Create a dedicated thread for this filter if applicable.
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 if (error != PIPELINE_OK) { 462 if (error != PIPELINE_OK) {
464 SendErrorToHost(error); 463 SendErrorToHost(error);
465 } 464 }
466 465
467 DispatchPendingCallback(); 466 DispatchPendingCallback();
468 } 467 }
469 468
470 FilterCallback* CompositeFilter::NewThreadSafeCallback( 469 FilterCallback* CompositeFilter::NewThreadSafeCallback(
471 void (CompositeFilter::*method)()) { 470 void (CompositeFilter::*method)()) {
472 return TaskToCallbackAdapter::NewCallback( 471 return TaskToCallbackAdapter::NewCallback(
473 NewRunnableMethod(this, 472 NewRunnableFunction(&CompositeFilter::OnCallback,
474 &CompositeFilter::OnCallback, 473 message_loop_,
475 message_loop_, 474 runnable_factory_->NewRunnableMethod(method)));
476 method));
477 } 475 }
478 476
477 // This method is intentionally static so that no reference to the composite
478 // is needed to call it. This method may be called by other threads and we
479 // don't want those threads to gain ownership of this composite by having a
480 // reference to it. |task| will contain a weak reference to the composite
481 // so that the reference can be cleared if the composite is destroyed before
482 // the callback is called.
483 // static
479 void CompositeFilter::OnCallback(MessageLoop* message_loop, 484 void CompositeFilter::OnCallback(MessageLoop* message_loop,
scherkus (not reviewing) 2011/01/11 00:36:57 few sanity checks... Is the issue that someone is
acolwell GONE FROM CHROMIUM 2011/01/11 05:23:59 The issue is that this code was accidentally openi
scherkus (not reviewing) 2011/01/11 18:37:32 Gotcha!
480 void (CompositeFilter::*method)()) { 485 CancelableTask* task) {
481 if (MessageLoop::current() != message_loop) { 486 if (MessageLoop::current() != message_loop) {
482 // Posting callback to the proper thread. 487 // Posting callback to the proper thread.
483 message_loop->PostTask(FROM_HERE, NewRunnableMethod(this, method)); 488 message_loop->PostTask(FROM_HERE, task);
484 return; 489 return;
485 } 490 }
486 491
487 (this->*method)(); 492 task->Run();
493 delete task;
488 } 494 }
489 495
490 bool CompositeFilter::CanForwardError() { 496 bool CompositeFilter::CanForwardError() {
491 return (state_ == kCreated) || (state_ == kPlaying) || (state_ == kPaused); 497 return (state_ == kCreated) || (state_ == kPlaying) || (state_ == kPaused);
492 } 498 }
493 499
494 void CompositeFilter::SetError(PipelineError error) { 500 void CompositeFilter::SetError(PipelineError error) {
495 // TODO(acolwell): Temporary hack to handle errors that occur 501 // TODO(acolwell): Temporary hack to handle errors that occur
496 // during filter initialization. In this case we just forward 502 // during filter initialization. In this case we just forward
497 // the error to the host even if it is on the wrong thread. We 503 // the error to the host even if it is on the wrong thread. We
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 600
595 void CompositeFilter::FilterHostImpl::SetCurrentReadPosition(int64 offset) { 601 void CompositeFilter::FilterHostImpl::SetCurrentReadPosition(int64 offset) {
596 host_->SetCurrentReadPosition(offset); 602 host_->SetCurrentReadPosition(offset);
597 } 603 }
598 604
599 int64 CompositeFilter::FilterHostImpl::GetCurrentReadPosition() { 605 int64 CompositeFilter::FilterHostImpl::GetCurrentReadPosition() {
600 return host_->GetCurrentReadPosition(); 606 return host_->GetCurrentReadPosition();
601 } 607 }
602 608
603 } // namespace media 609 } // namespace media
OLDNEW
« no previous file with comments | « media/base/composite_filter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698