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

Unified Diff: ppapi/native_client/src/shared/ppapi_proxy/plugin_resource.h

Issue 7740013: Cloning a bunch of stuff from the native_client repository at r6528 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 4 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
Index: ppapi/native_client/src/shared/ppapi_proxy/plugin_resource.h
===================================================================
--- ppapi/native_client/src/shared/ppapi_proxy/plugin_resource.h (revision 0)
+++ ppapi/native_client/src/shared/ppapi_proxy/plugin_resource.h (revision 0)
@@ -0,0 +1,149 @@
+// Copyright (c) 2011 The Native Client Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NATIVE_CLIENT_SRC_SHARED_PPAPI_PROXY_PLUGIN_RESOURCE_H_
+#define NATIVE_CLIENT_SRC_SHARED_PPAPI_PROXY_PLUGIN_RESOURCE_H_
+
+#include "native_client/src/include/nacl_base.h"
+#include "native_client/src/include/ref_counted.h"
+#include "native_client/src/shared/ppapi_proxy/plugin_resource_tracker.h"
+#include "ppapi/c/pp_resource.h"
+
+namespace ppapi_proxy {
+
+// If you inherit from resource, make sure you add the class name here.
+#define FOR_ALL_RESOURCES(F) \
+ F(PluginAudio) \
+ F(PluginAudioConfig) \
+ F(PluginBuffer) \
+ F(PluginFont) \
+ F(PluginGraphics2D) \
+ F(PluginGraphics3D) \
+ F(PluginImageData) \
+ F(PluginInputEvent)
+
+// Forward declaration of PluginResource classes.
+#define DECLARE_RESOURCE_CLASS(RESOURCE) class RESOURCE;
+FOR_ALL_RESOURCES(DECLARE_RESOURCE_CLASS)
+#undef DECLARE_RESOURCE_CLASS
+
+class PluginResource : public nacl::RefCounted<PluginResource> {
+ public:
+ PluginResource();
+ virtual ~PluginResource();
+
+ // Returns NULL if the resource is invalid or is a different type.
+ template<typename T>
+ static scoped_refptr<T> GetAs(PP_Resource res) {
+ // See if we have the resource cached.
+ scoped_refptr<PluginResource> resource =
+ PluginResourceTracker::Get()->GetExistingResource(res);
+
+ return resource ? resource->Cast<T>() : NULL;
+ }
+
+ // Adopt the given PP_Resource as type T. Use this function for resources that
+ // the browser provides to the plugin with an incremented ref count (i.e.,
+ // calls AddRefResource); it initializes the browser refcount to 1 or
+ // increments it if the resource already exists.
+ // Returns NULL if the resource is invalid or is a different type.
+ template<typename T>
+ static scoped_refptr<T> AdoptAs(PP_Resource res);
+
+ // Adopt the given PP_Resource as type T. Use this function for resources
+ // when the browser drops the refcount immediately. These resources are
+ // typically meant to be cached on the plugin side, with little or no
+ // interaction back to the browser. For an example, see PluginInputEvent.
+ // This is like AdoptAs above, except it initializes the browser_refcount to
+ // 0 for resources that are new to the plugin, and does not increment the
+ // browser_refcount for resources that exist.
+ // Returns NULL if the resource is invalid or is a different type.
+ template<typename T>
+ static scoped_refptr<T> AdoptAsWithNoBrowserCount(PP_Resource res);
+
+ // Cast the resource into a specified type. This will return NULL if the
+ // resource does not match the specified type. Specializations of this
+ // template call into As* functions.
+ template <typename T> T* Cast() { return NULL; }
+
+ protected:
+ virtual bool InitFromBrowserResource(PP_Resource resource) = 0;
+
+ private:
+ // Type-specific getters for individual resource types. These will return
+ // NULL if the resource does not match the specified type. Used by the Cast()
+ // function.
+ #define DEFINE_TYPE_GETTER(RESOURCE) \
+ virtual RESOURCE* As##RESOURCE() { return NULL; }
+ FOR_ALL_RESOURCES(DEFINE_TYPE_GETTER)
+ #undef DEFINE_TYPE_GETTER
+
+ // Call this macro in the derived class declaration to actually implement the
+ // type getter.
+ #define IMPLEMENT_RESOURCE(RESOURCE) \
+ virtual RESOURCE* As##RESOURCE() { return this; }
+
+ DISALLOW_COPY_AND_ASSIGN(PluginResource);
+};
+
+// Cast() specializations.
+#define DEFINE_RESOURCE_CAST(Type) \
+ template <> inline Type* PluginResource::Cast<Type>() { \
+ return As##Type(); \
+ }
+
+FOR_ALL_RESOURCES(DEFINE_RESOURCE_CAST)
+#undef DEFINE_RESOURCE_CAST
+
+#undef FOR_ALL_RESOURCES
+
+template<typename T> scoped_refptr<T>
+PluginResourceTracker::AdoptBrowserResource(PP_Resource res,
+ size_t browser_refcount) {
+ ResourceMap::iterator result = live_resources_.find(res);
+ // Do we have it already?
+ if (result == live_resources_.end()) {
+ // No - try to create a new one.
+ scoped_refptr<T> new_resource = new T();
+ if (new_resource->InitFromBrowserResource(res)) {
+ AddResource(new_resource, res, browser_refcount);
+ return new_resource;
+ } else {
+ return scoped_refptr<T>();
+ }
+ } else {
+ // Consume more browser refcounts (unless browser_refcount is 0).
+ result->second.browser_refcount += browser_refcount;
+ return result->second.resource->Cast<T>();
+ }
+}
+
+template<typename T>
+scoped_refptr<T> PluginResource::AdoptAs(PP_Resource res) {
+ // Short-circuit if null resource.
+ if (!res)
+ return NULL;
+
+ // Adopt the resource with 1 browser-side refcount.
+ const size_t browser_refcount = 1;
+ return PluginResourceTracker::Get()->AdoptBrowserResource<T>(
+ res, browser_refcount);
+}
+
+template<typename T>
+scoped_refptr<T> PluginResource::AdoptAsWithNoBrowserCount(PP_Resource res) {
+ // Short-circuit if null resource.
+ if (!res)
+ return NULL;
+
+ // Adopt the resource with 0 browser-side refcount.
+ const size_t browser_refcount = 0;
+ return PluginResourceTracker::Get()->AdoptBrowserResource<T>(
+ res, browser_refcount);
+}
+
+} // namespace ppapi_proxy
+
+#endif // NATIVE_CLIENT_SRC_SHARED_PPAPI_PROXY_PLUGIN_RESOURCE_H_
+

Powered by Google App Engine
This is Rietveld 408576698