// 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 pp::Instance 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. PP_Instance would be a good identifier to use for this case. /// However, using PP_Instance in the constructor to resources is /// problematic because it 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 provides 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). /// /// You should always pass an InstanceHandle 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. /// /// @param[in] instance The instance with which this /// InstanceHandle will be associated. InstanceHandle(Instance* instance); /// This constructor explicitly converts 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. /// /// @param[in] pp_instance The instance with which this /// InstanceHandle will be associated. explicit InstanceHandle(PP_Instance pp_instance) : pp_instance_(pp_instance) {} /// The pp_instance() function returns the PP_Instance. /// /// @return A PP_Instance internal instance handle. PP_Instance pp_instance() const { return pp_instance_; } private: PP_Instance pp_instance_; }; } // namespace pp #endif // PPAPI_CPP_INSTANCE_HANDLE_H_