| // 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" | |
| /// @file | |
| /// This file defines an instance handle used to identify an instance in a | |
| /// constructor for a resource. | |
| namespace pp { | |
| class Instance; | |
| /// An instance handle identifies an instance in a constructor for a resource. | |
| /// This class solves two different problems: | |
| /// | |
| /// 1. A pp::Instance object's lifetime is managed by the system on the main | |
| /// pepper thread of the module. This means that it may get destroyed at any | |
| /// time based on something that happens on the web page. Therefore, it's not | |
| /// safe to refer to a <code>pp::Instance</code> object on a background thread. | |
| /// Instead, we need to pass some kind of identifier 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. | |
| /// | |
| /// 2. <code>PP_Instance</code> would be a good identifier to use for this case. | |
| /// However, using <code>PP_Instance</code> in the constructor to resources is | |
| /// problematic because it is just a typedef for an integer, as is a | |
| /// <code>PP_Resource</code>. Many resources have alternate constructors that | |
| /// just take an existing <code>PP_Resource</code>, so the constructors would | |
| /// be ambiguous. Having this wrapper around a <code>PP_Instance</code> | |
| /// prevents this ambiguity, and also provides a nice place to consolidate an | |
| /// implicit conversion from <code>pp::Instance*</code> for prettier code on | |
| /// the main thread (you can just pass "this" to resource constructors in your | |
| /// instance objects). | |
| /// | |
| /// You should always pass an <code>InstanceHandle</code> to background threads | |
| /// instead of a <code>pp::Instance</code>, and use them in resource | |
| /// constructors and code that may be used from background threads. | |
| class InstanceHandle { | |
| public: | |
| /// Implicit constructor for converting a <code>pp::Instance</code> to an | |
| /// instance handle. | |
| /// | |
| /// @param[in] instance The instance with which this | |
| /// <code>InstanceHandle</code> will be associated. | |
| InstanceHandle(Instance* instance); | |
| /// This constructor explicitly converts a <code>PP_Instance</code> to an | |
| /// instance handle. This should not be implicit because it can make some | |
| /// resource constructors ambiguous. <code>PP_Instance</code> is just a | |
| /// typedef for an integer, as is <code>PP_Resource</code>, so the compiler | |
| /// can get confused between the two. | |
| /// | |
| /// @param[in] pp_instance The instance with which this | |
| /// <code>InstanceHandle</code> will be associated. | |
| explicit InstanceHandle(PP_Instance pp_instance) | |
| : pp_instance_(pp_instance) {} | |
| /// The pp_instance() function returns the <code>PP_Instance</code>. | |
| /// | |
| /// @return A <code>PP_Instance</code> internal instance handle. | |
| PP_Instance pp_instance() const { return pp_instance_; } | |
| private: | |
| PP_Instance pp_instance_; | |
| }; | |
| } // namespace pp | |
| #endif // PPAPI_CPP_INSTANCE_HANDLE_H_ |