Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef PPAPI_THUNK_ENTER_H_ | 5 #ifndef PPAPI_THUNK_ENTER_H_ |
| 6 #define PPAPI_THUNK_ENTER_H_ | 6 #define PPAPI_THUNK_ENTER_H_ |
| 7 | 7 |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "ppapi/c/pp_resource.h" | 9 #include "ppapi/c/pp_resource.h" |
| 10 #include "ppapi/shared_impl/api_id.h" | 10 #include "ppapi/shared_impl/api_id.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 59 template <> | 59 template <> |
| 60 struct LockOnEntry<true> { | 60 struct LockOnEntry<true> { |
| 61 LockOnEntry() { | 61 LockOnEntry() { |
| 62 ppapi::ProxyLock::Acquire(); | 62 ppapi::ProxyLock::Acquire(); |
| 63 } | 63 } |
| 64 ~LockOnEntry() { | 64 ~LockOnEntry() { |
| 65 ppapi::ProxyLock::Release(); | 65 ppapi::ProxyLock::Release(); |
| 66 } | 66 } |
| 67 }; | 67 }; |
| 68 | 68 |
| 69 // Keep non-templatized since we need non-inline functions here. | |
| 70 class PPAPI_THUNK_EXPORT EnterBase { | |
| 71 public: | |
| 72 EnterBase(); | |
| 73 explicit EnterBase(const PP_CompletionCallback& callback); | |
| 74 virtual ~EnterBase(); | |
| 75 | |
| 76 // Sets the result. | |
| 77 // | |
| 78 // Returns the "retval()". This is to support the typical usage of | |
| 79 // return enter.SetResult(...); | |
| 80 // without having to write a separate "return enter.retval();" line. | |
| 81 int32_t SetResult(int32_t result); | |
| 82 | |
| 83 // Use this value as the return value for the function. | |
| 84 int32_t retval() const { return retval_; } | |
| 85 | |
| 86 protected: | |
| 87 // Helper function to return a Resource from a PP_Resource. Having this | |
|
dmichael (off chromium)
2012/01/24 01:05:11
nit: copy/paste mistake; it's not a Resource
| |
| 88 // code be in the non-templatized base keeps us from having to instantiate | |
| 89 // it in every template. | |
| 90 FunctionGroupBase* GetFunctions(PP_Instance instance, ApiID id) const; | |
| 91 | |
| 92 // Helper function to return a Resource from a PP_Resource. Having this | |
| 93 // code be in the non-templatized base keeps us from having to instantiate | |
| 94 // it in every template. | |
| 95 Resource* GetResource(PP_Resource resource) const; | |
| 96 | |
| 97 // Does error handling associated with entering a resource. The resource_base | |
| 98 // is the result of looking up the given pp_resource. The object is the | |
| 99 // result of converting the base to the desired object (converted back to a | |
| 100 // Resource* so this function doesn't have to be templatized). The reason for | |
| 101 // passing both resource_base and object is that we can differentiate "bad | |
| 102 // resource ID" from "valid resource ID not of the currect type." | |
| 103 // | |
| 104 // This will set retval_ = PP_ERROR_BADRESOURCE if the object is invalid, and | |
| 105 // if report_error is set, log a message to the programmer. | |
| 106 void ValidateResource(PP_Resource pp_resource, | |
| 107 Resource* resource_base, | |
| 108 void* object, | |
| 109 bool report_error); | |
| 110 | |
| 111 private: | |
| 112 // Holds the callback. The function will only be non-NULL when the | |
| 113 // callback is requried. Optional callbacks don't require any special | |
| 114 // handling from us at this layer. | |
| 115 PP_CompletionCallback callback_; | |
| 116 | |
| 117 int32_t retval_; | |
| 118 }; | |
| 119 | |
| 69 } // namespace subtle | 120 } // namespace subtle |
| 70 | 121 |
| 71 | 122 |
| 72 template<typename FunctionsT, bool lock_on_entry = true> | 123 template<typename FunctionsT, bool lock_on_entry = true> |
| 73 class EnterFunction : subtle::LockOnEntry<lock_on_entry> { | 124 class EnterFunction : public subtle::EnterBase, |
| 125 public subtle::LockOnEntry<lock_on_entry> { | |
| 74 public: | 126 public: |
| 75 EnterFunction(PP_Instance instance, bool report_error) | 127 EnterFunction(PP_Instance instance, bool report_error) |
| 76 : functions_(NULL) { | 128 : functions_(NULL) { |
| 77 FunctionGroupBase* base = PpapiGlobals::Get()->GetFunctionAPI( | 129 FunctionGroupBase* base = GetFunctions(instance, FunctionsT::kApiID); |
| 78 instance, FunctionsT::kApiID); | |
| 79 if (base) | 130 if (base) |
| 80 functions_ = base->GetAs<FunctionsT>(); | 131 functions_ = base->GetAs<FunctionsT>(); |
| 81 // TODO(brettw) check error and if report_error is set, do something. | 132 // TODO(brettw) check error and if report_error is set, do something. |
| 82 } | 133 } |
| 83 | 134 |
| 84 ~EnterFunction() {} | 135 ~EnterFunction() {} |
| 85 | 136 |
| 86 bool succeeded() const { return !!functions_; } | 137 bool succeeded() const { return !!functions_; } |
| 87 bool failed() const { return !functions_; } | 138 bool failed() const { return !functions_; } |
| 88 | 139 |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 117 static PP_Instance GetInstanceForResource(PP_Resource resource) { | 168 static PP_Instance GetInstanceForResource(PP_Resource resource) { |
| 118 Resource* object = | 169 Resource* object = |
| 119 PpapiGlobals::Get()->GetResourceTracker()->GetResource(resource); | 170 PpapiGlobals::Get()->GetResourceTracker()->GetResource(resource); |
| 120 return object ? object->pp_instance() : 0; | 171 return object ? object->pp_instance() : 0; |
| 121 } | 172 } |
| 122 }; | 173 }; |
| 123 | 174 |
| 124 // EnterResource --------------------------------------------------------------- | 175 // EnterResource --------------------------------------------------------------- |
| 125 | 176 |
| 126 template<typename ResourceT, bool lock_on_entry = true> | 177 template<typename ResourceT, bool lock_on_entry = true> |
| 127 class EnterResource : subtle::LockOnEntry<lock_on_entry> { | 178 class EnterResource : public subtle::EnterBase, |
| 179 public subtle::LockOnEntry<lock_on_entry> { | |
| 128 public: | 180 public: |
| 129 EnterResource(PP_Resource resource, bool report_error) | 181 EnterResource(PP_Resource resource, bool report_error) |
| 130 : object_(NULL) { | 182 : EnterBase() { |
| 131 resource_ = | 183 Init(resource, report_error); |
| 132 PpapiGlobals::Get()->GetResourceTracker()->GetResource(resource); | 184 } |
| 133 if (resource_) | 185 EnterResource(PP_Resource resource, |
| 134 object_ = resource_->GetAs<ResourceT>(); | 186 const PP_CompletionCallback& callback, |
| 135 // TODO(brettw) check error and if report_error is set, do something. | 187 bool report_error) |
| 188 : EnterBase(callback) { | |
| 189 Init(resource, report_error); | |
| 136 } | 190 } |
| 137 ~EnterResource() {} | 191 ~EnterResource() {} |
| 138 | 192 |
| 139 bool succeeded() const { return !!object_; } | 193 bool succeeded() const { return !!object_; } |
| 140 bool failed() const { return !object_; } | 194 bool failed() const { return !object_; } |
| 141 | 195 |
| 142 ResourceT* object() { return object_; } | 196 ResourceT* object() { return object_; } |
| 143 Resource* resource() { return resource_; } | 197 Resource* resource() { return resource_; } |
| 144 | 198 |
| 145 private: | 199 private: |
| 200 void Init(PP_Resource resource, bool report_error) { | |
| 201 resource_ = GetResource(resource); | |
| 202 if (resource_) | |
| 203 object_ = resource_->GetAs<ResourceT>(); | |
| 204 else | |
| 205 object_ = NULL; | |
| 206 ValidateResource(resource, resource_, object_, report_error); | |
| 207 } | |
| 208 | |
| 146 Resource* resource_; | 209 Resource* resource_; |
| 147 ResourceT* object_; | 210 ResourceT* object_; |
| 148 | 211 |
| 149 DISALLOW_COPY_AND_ASSIGN(EnterResource); | 212 DISALLOW_COPY_AND_ASSIGN(EnterResource); |
| 150 }; | 213 }; |
| 151 | 214 |
| 152 // Like EnterResource but assumes the lock is already held. | 215 // Like EnterResource but assumes the lock is already held. |
| 153 template<typename ResourceT> | 216 template<typename ResourceT> |
| 154 class EnterResourceNoLock : public EnterResource<ResourceT, false> { | 217 class EnterResourceNoLock : public EnterResource<ResourceT, false> { |
| 155 public: | 218 public: |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 175 : public EnterFunctionNoLock<PPB_Instance_FunctionAPI> { | 238 : public EnterFunctionNoLock<PPB_Instance_FunctionAPI> { |
| 176 public: | 239 public: |
| 177 EnterInstance(PP_Instance instance); | 240 EnterInstance(PP_Instance instance); |
| 178 ~EnterInstance(); | 241 ~EnterInstance(); |
| 179 }; | 242 }; |
| 180 | 243 |
| 181 } // namespace thunk | 244 } // namespace thunk |
| 182 } // namespace ppapi | 245 } // namespace ppapi |
| 183 | 246 |
| 184 #endif // PPAPI_THUNK_ENTER_H_ | 247 #endif // PPAPI_THUNK_ENTER_H_ |
| OLD | NEW |