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

Unified Diff: webkit/plugins/ppapi/callbacks.cc

Issue 9015009: Use the new callback tracker and delete the old one (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add IsPending Created 8 years, 12 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/plugins/ppapi/callbacks.h ('k') | webkit/plugins/ppapi/callbacks_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/plugins/ppapi/callbacks.cc
diff --git a/webkit/plugins/ppapi/callbacks.cc b/webkit/plugins/ppapi/callbacks.cc
deleted file mode 100644
index 84fffd0b271d1d3fd5404852ec62eb571fba6504..0000000000000000000000000000000000000000
--- a/webkit/plugins/ppapi/callbacks.cc
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "webkit/plugins/ppapi/callbacks.h"
-
-#include <algorithm>
-
-#include "base/bind.h"
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/message_loop.h"
-#include "ppapi/c/pp_completion_callback.h"
-#include "ppapi/c/pp_errors.h"
-
-namespace webkit {
-namespace ppapi {
-
-// CallbackTracker -------------------------------------------------------------
-
-CallbackTracker::CallbackTracker() {
-}
-
-void CallbackTracker::AbortAll() {
- // Iterate over a copy since |Abort()| calls |Remove()| (indirectly).
- // TODO(viettrungluu): This obviously isn't so efficient.
- CallbackSetMap pending_callbacks_copy = pending_callbacks_;
- for (CallbackSetMap::iterator it1 = pending_callbacks_copy.begin();
- it1 != pending_callbacks_copy.end(); ++it1) {
- for (CallbackSet::iterator it2 = it1->second.begin();
- it2 != it1->second.end(); ++it2) {
- (*it2)->Abort();
- }
- }
-}
-
-void CallbackTracker::PostAbortForResource(PP_Resource resource_id) {
- CHECK(resource_id != 0);
- CallbackSetMap::iterator it1 = pending_callbacks_.find(resource_id);
- if (it1 == pending_callbacks_.end())
- return;
- for (CallbackSet::iterator it2 = it1->second.begin();
- it2 != it1->second.end(); ++it2) {
- // Post the abort.
- (*it2)->PostAbort();
- }
-}
-
-CallbackTracker::~CallbackTracker() {
- // All callbacks must be aborted before destruction.
- CHECK_EQ(0u, pending_callbacks_.size());
-}
-
-void CallbackTracker::Add(
- const scoped_refptr<TrackedCallback>& tracked_callback) {
- PP_Resource resource_id = tracked_callback->resource_id();
- DCHECK(pending_callbacks_[resource_id].find(tracked_callback) ==
- pending_callbacks_[resource_id].end());
- pending_callbacks_[resource_id].insert(tracked_callback);
-}
-
-void CallbackTracker::Remove(
- const scoped_refptr<TrackedCallback>& tracked_callback) {
- CallbackSetMap::iterator map_it =
- pending_callbacks_.find(tracked_callback->resource_id());
- DCHECK(map_it != pending_callbacks_.end());
- CallbackSet::iterator it = map_it->second.find(tracked_callback);
- DCHECK(it != map_it->second.end());
- map_it->second.erase(it);
-
- // If there are no pending callbacks left for this ID, get rid of the entry.
- if (map_it->second.empty())
- pending_callbacks_.erase(map_it);
-}
-
-// TrackedCallback -------------------------------------------------------------
-
-TrackedCallback::TrackedCallback(const scoped_refptr<CallbackTracker>& tracker,
- PP_Resource resource_id)
- : ALLOW_THIS_IN_INITIALIZER_LIST(abort_impl_factory_(this)),
- tracker_(tracker),
- resource_id_(resource_id),
- completed_(false),
- aborted_(false) {
- tracker_->Add(make_scoped_refptr(this));
-}
-
-void TrackedCallback::Abort() {
- if (!completed()) {
- aborted_ = true;
- AbortImpl();
- }
-}
-
-void TrackedCallback::PostAbort() {
- if (!completed()) {
- aborted_ = true;
- // Post a task for the abort (only if necessary).
- if (!abort_impl_factory_.HasWeakPtrs()) {
- MessageLoop::current()->PostTask(
- FROM_HERE,
- base::Bind(&TrackedCallback::AbortImpl,
- abort_impl_factory_.GetWeakPtr()));
- }
- }
-}
-
-TrackedCallback::~TrackedCallback() {
- // The tracker must ensure that the callback is completed (maybe abortively).
- DCHECK(completed_);
-}
-
-void TrackedCallback::MarkAsCompleted() {
- DCHECK(!completed());
-
- // We will be removed; maintain a reference to ensure we won't be deleted
- // until we're done.
- scoped_refptr<TrackedCallback> thiz = this;
- completed_ = true;
- tracker_->Remove(thiz);
- tracker_ = NULL;
-}
-
-// TrackedCompletionCallback ---------------------------------------------------
-
-TrackedCompletionCallback::TrackedCompletionCallback(
- const scoped_refptr<CallbackTracker>& tracker,
- PP_Resource resource_id,
- const PP_CompletionCallback& callback)
- : TrackedCallback(tracker, resource_id),
- callback_(callback) {
-}
-
-void TrackedCompletionCallback::Run(int32_t result) {
- if (!completed()) {
- // Cancel any pending calls.
- abort_impl_factory_.InvalidateWeakPtrs();
-
- // Copy |callback_| and look at |aborted()| now, since |MarkAsCompleted()|
- // may delete us.
- PP_CompletionCallback callback = callback_;
- if (aborted())
- result = PP_ERROR_ABORTED;
-
- // Do this before running the callback in case of reentrancy (which
- // shouldn't happen, but avoid strange failures).
- MarkAsCompleted();
- PP_RunCompletionCallback(&callback, result);
- }
-}
-
-void TrackedCompletionCallback::AbortImpl() {
- Run(PP_ERROR_ABORTED);
-}
-
-} // namespace ppapi
-} // namespace webkit
« no previous file with comments | « webkit/plugins/ppapi/callbacks.h ('k') | webkit/plugins/ppapi/callbacks_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698