Chromium Code Reviews| 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..9c98187d6293bde3d09fe7d31b2d6b1b50d3f53f |
| --- /dev/null |
| +++ b/ppapi/cpp/instance_handle.h |
| @@ -0,0 +1,57 @@ |
| +// 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 |
|
dmichael (off chromium)
2012/02/21 23:38:02
>80 char
|
| +/// existence solves two different problems: |
| +/// |
| +/// pp::Instance objects' lifetime is managed by the system on the main thread |
|
dmichael (off chromium)
2012/02/21 23:38:02
nit: "A pp::Instance object's"?
|
| +/// 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. |
| +/// |
| +/// 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). |
|
dmichael (off chromium)
2012/02/21 23:38:02
This paragraph is good for our use but may not add
brettw
2012/02/22 20:24:36
I added a "background" label to make it more clear
|
| +/// |
| +/// 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_ |