Index: webkit/glue/plugins/pepper_resource_tracker.cc |
=================================================================== |
--- webkit/glue/plugins/pepper_resource_tracker.cc (revision 69381) |
+++ webkit/glue/plugins/pepper_resource_tracker.cc (working copy) |
@@ -1,193 +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/glue/plugins/pepper_resource_tracker.h" |
- |
-#include <limits> |
-#include <set> |
- |
-#include "base/lazy_instance.h" |
-#include "base/logging.h" |
-#include "base/rand_util.h" |
-#include "ppapi/c/pp_resource.h" |
-#include "webkit/glue/plugins/pepper_resource.h" |
- |
-static base::LazyInstance<pepper::ResourceTracker> g_resource_tracker( |
- base::LINKER_INITIALIZED); |
- |
-namespace pepper { |
- |
-scoped_refptr<Resource> ResourceTracker::GetResource(PP_Resource res) const { |
- ResourceMap::const_iterator result = live_resources_.find(res); |
- if (result == live_resources_.end()) { |
- return scoped_refptr<Resource>(); |
- } |
- return result->second.first; |
-} |
- |
-// static |
-ResourceTracker* ResourceTracker::singleton_override_ = NULL; |
- |
-ResourceTracker::ResourceTracker() |
- : last_id_(0) { |
-} |
- |
-ResourceTracker::~ResourceTracker() { |
-} |
- |
-// static |
-ResourceTracker* ResourceTracker::Get() { |
- if (singleton_override_) |
- return singleton_override_; |
- return g_resource_tracker.Pointer(); |
-} |
- |
-PP_Resource ResourceTracker::AddResource(Resource* resource) { |
- // If the plugin manages to create 4B resources... |
- if (last_id_ == std::numeric_limits<PP_Resource>::max()) { |
- return 0; |
- } |
- // Add the resource with plugin use-count 1. |
- ++last_id_; |
- live_resources_.insert(std::make_pair(last_id_, std::make_pair(resource, 1))); |
- return last_id_; |
-} |
- |
-bool ResourceTracker::AddRefResource(PP_Resource res) { |
- ResourceMap::iterator i = live_resources_.find(res); |
- if (i != live_resources_.end()) { |
- // We don't protect against overflow, since a plugin as malicious as to ref |
- // once per every byte in the address space could have just as well unrefed |
- // one time too many. |
- ++i->second.second; |
- return true; |
- } else { |
- return false; |
- } |
-} |
- |
-bool ResourceTracker::UnrefResource(PP_Resource res) { |
- ResourceMap::iterator i = live_resources_.find(res); |
- if (i != live_resources_.end()) { |
- if (!--i->second.second) { |
- i->second.first->StoppedTracking(); |
- live_resources_.erase(i); |
- } |
- return true; |
- } else { |
- return false; |
- } |
-} |
- |
-void ResourceTracker::ForceDeletePluginResourceRefs(PP_Resource res) { |
- ResourceMap::iterator i = live_resources_.find(res); |
- if (i == live_resources_.end()) |
- return; // Nothing to do. |
- |
- i->second.second = 0; |
- i->second.first->StoppedTracking(); |
- live_resources_.erase(i); |
-} |
- |
-uint32 ResourceTracker::GetLiveObjectsForModule(PluginModule* module) const { |
- // Since this is for testing only, we'll just go through all of them and |
- // count. |
- // |
- // TODO(brettw) we will eventually need to implement more efficient |
- // module->resource lookup to free resources when a module is unloaded. In |
- // this case, this function can be implemented using that system. |
- uint32 count = 0; |
- for (ResourceMap::const_iterator i = live_resources_.begin(); |
- i != live_resources_.end(); ++i) |
- count++; |
- return count; |
-} |
- |
-PP_Instance ResourceTracker::AddInstance(PluginInstance* instance) { |
-#ifndef NDEBUG |
- // Make sure we're not adding one more than once. |
- for (InstanceMap::const_iterator i = instance_map_.begin(); |
- i != instance_map_.end(); ++i) |
- DCHECK(i->second != instance); |
-#endif |
- |
- // Use a random 64-bit number for the instance ID. This helps prevent some |
- // mischeif where you could misallocate resources if you gave a different |
- // instance ID. |
- // |
- // See also AddModule below. |
- // |
- // Need to make sure the random number isn't a duplicate or 0. |
- PP_Instance new_instance; |
- do { |
- new_instance = static_cast<PP_Instance>(base::RandUint64()); |
- } while (!new_instance || |
- instance_map_.find(new_instance) != instance_map_.end()); |
- instance_map_[new_instance] = instance; |
- return new_instance; |
-} |
- |
-void ResourceTracker::InstanceDeleted(PP_Instance instance) { |
- InstanceMap::iterator found = instance_map_.find(instance); |
- if (found == instance_map_.end()) { |
- NOTREACHED(); |
- return; |
- } |
- instance_map_.erase(found); |
-} |
- |
-PluginInstance* ResourceTracker::GetInstance(PP_Instance instance) { |
- InstanceMap::iterator found = instance_map_.find(instance); |
- if (found == instance_map_.end()) |
- return NULL; |
- return found->second; |
-} |
- |
-PP_Module ResourceTracker::AddModule(PluginModule* module) { |
-#ifndef NDEBUG |
- // Make sure we're not adding one more than once. |
- for (ModuleMap::const_iterator i = module_map_.begin(); |
- i != module_map_.end(); ++i) |
- DCHECK(i->second != module); |
-#endif |
- |
- // See AddInstance above. |
- PP_Module new_module; |
- do { |
- new_module = static_cast<PP_Module>(base::RandUint64()); |
- } while (!new_module || |
- module_map_.find(new_module) != module_map_.end()); |
- module_map_[new_module] = module; |
- return new_module; |
-} |
- |
-void ResourceTracker::ModuleDeleted(PP_Module module) { |
- ModuleMap::iterator found = module_map_.find(module); |
- if (found == module_map_.end()) { |
- NOTREACHED(); |
- return; |
- } |
- module_map_.erase(found); |
-} |
- |
-PluginModule* ResourceTracker::GetModule(PP_Module module) { |
- ModuleMap::iterator found = module_map_.find(module); |
- if (found == module_map_.end()) |
- return NULL; |
- return found->second; |
-} |
- |
-// static |
-void ResourceTracker::SetSingletonOverride(ResourceTracker* tracker) { |
- DCHECK(!singleton_override_); |
- singleton_override_ = tracker; |
-} |
- |
-// static |
-void ResourceTracker::ClearSingletonOverride() { |
- DCHECK(singleton_override_); |
- singleton_override_ = NULL; |
-} |
- |
-} // namespace pepper |