Index: ppapi/cpp/instance_handle.h |
diff --git a/ppapi/cpp/instance_handle.h b/ppapi/cpp/instance_handle.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..941db6e1938d034b3cc05fc01065aba4ec446246 |
--- /dev/null |
+++ b/ppapi/cpp/instance_handle.h |
@@ -0,0 +1,58 @@ |
+// Copyright (c) 2012 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. |
+ |
+#ifndef PPAPI_CPP_INSTANCE_HANDLE_H_ |
+#define PPAPI_CPP_INSTANCE_HANDLE_H_ |
+ |
+#include "ppapi/c/pp_instance.h" |
+ |
+namespace pp { |
+ |
+class Instance; |
+ |
+/// An instance handle identifies an instance in a constructor for a resource. |
+/// Its existence solves two different problems: |
+/// |
+/// A pp::Instance objects' lifetime is managed by the system on the main thread |
+/// of the plugin. This means that it may get destroyed at any time based on |
+/// something that happens on the web page. This means that it's never OK to |
+/// refer to a pp::Instance object on a background thread. So we need to pass |
+/// some kind of identifier instead to resource constructors so that they may |
+/// safely be used on background threads. If the instance becomes invalid, the |
+/// resource creation will fail on the background thread, but it won't crash. |
+/// |
+/// Background: PP_Instance would be a good identifier to use for this case. |
+/// However, using it in the constructor to resources is problematic. |
+/// PP_Instance is just a typedef for an integer, as is a PP_Resource. Many |
+/// resources have alternate constructors that just take an existing |
+/// PP_Resource, so the constructors would be ambiguous. Having this wrapper |
+/// around a PP_Instance prevents this ambiguity, and also gives us a nice |
+/// place to consolidate an implicit conversion from pp::Instance* for prettier |
+/// code on the main thread (you can just pass "this" to resource constructors |
+/// in your instance objects). |
+/// |
+/// So you should always pass InstanceHandles to background threads instead of |
+/// a pp::Instance, and use them in resource constructors and code that may be |
+/// used from background threads. |
+class InstanceHandle { |
+ public: |
+ /// Implicit constructor for converting a pp::Instance to an instance handle. |
+ InstanceHandle(Instance* instance); |
+ |
+ /// Explicitly convert a PP_Instance to an instance handle. This should not |
+ /// be implicit because it can make some resource constructors ambiguous. |
+ /// PP_Instance is just a typedef for an integer, as is PP_Resource, so the |
+ /// compiler can get confused between the two. |
+ explicit InstanceHandle(PP_Instance pp_instance) |
+ : pp_instance_(pp_instance) {} |
+ |
+ PP_Instance pp_instance() const { return pp_instance_; } |
+ |
+ private: |
+ PP_Instance pp_instance_; |
+}; |
+ |
+} // namespace pp |
+ |
+#endif // PPAPI_CPP_INSTANCE_HANDLE_H_ |