Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(233)

Unified Diff: ppapi/thunk/enter.cc

Issue 9235003: Enhance the PPAPI enter tracking. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix build Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ppapi/thunk/enter.h ('k') | ppapi/thunk/ppb_graphics_2d_thunk.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ppapi/thunk/enter.cc
diff --git a/ppapi/thunk/enter.cc b/ppapi/thunk/enter.cc
index 7e9f70a7bc78cfb66936ab5d072437fca4a82904..42f4a0eaf82e970aed81e7f2ae9e3133520a1dcf 100644
--- a/ppapi/thunk/enter.cc
+++ b/ppapi/thunk/enter.cc
@@ -4,13 +4,89 @@
#include "ppapi/thunk/enter.h"
-#include "base/lazy_instance.h"
+#include "base/bind.h"
+#include "base/logging.h"
+#include "base/message_loop.h"
+#include "ppapi/c/pp_errors.h"
#include "ppapi/thunk/ppb_instance_api.h"
#include "ppapi/thunk/resource_creation_api.h"
namespace ppapi {
namespace thunk {
+namespace subtle {
+
+bool CallbackIsRequired(const PP_CompletionCallback& callback) {
+ return callback.func != NULL &&
+ (callback.flags & PP_COMPLETIONCALLBACK_FLAG_OPTIONAL) == 0;
+}
+
+EnterBase::EnterBase()
+ : callback_(PP_BlockUntilComplete()),
+ retval_(PP_OK) {
+ // TODO(brettw) validate threads.
+}
+
+EnterBase::EnterBase(const PP_CompletionCallback& callback)
+ : callback_(CallbackIsRequired(callback) ? callback
+ : PP_BlockUntilComplete()),
+ retval_(PP_OK) {
+ // TODO(brettw) validate threads.
+}
+
+EnterBase::~EnterBase() {
+ if (callback_.func) {
+ // All async completions should have cleared the callback in SetResult().
+ DCHECK(retval_ != PP_OK_COMPLETIONPENDING && retval_ != PP_OK);
+ MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
+ callback_.func, callback_.user_data, retval_));
+ }
+}
+
+int32_t EnterBase::SetResult(int32_t result) {
+ if (!callback_.func || result == PP_OK_COMPLETIONPENDING) {
+ // Easy case, we don't need to issue the callback (either none is
+ // required, or the implementation will asynchronously issue it
+ // for us), just store the result.
+ callback_ = PP_BlockUntilComplete();
+ retval_ = result;
+ return retval_;
+ }
+
+ // This is a required callback, asynchronously issue it.
+ // TODO(brettw) make this work on different threads, etc.
+ MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
+ callback_.func, callback_.user_data, result));
+
+ // Now that the callback will be issued in the future, we should return
+ // "pending" to the caller, and not issue the callback again.
+ callback_ = PP_BlockUntilComplete();
+ retval_ = PP_OK_COMPLETIONPENDING;
+ return retval_;
+}
+
+FunctionGroupBase* EnterBase::GetFunctions(PP_Instance instance,
+ ApiID id) const {
+ return PpapiGlobals::Get()->GetFunctionAPI(instance, id);
+}
+
+Resource* EnterBase::GetResource(PP_Resource resource) const {
+ return PpapiGlobals::Get()->GetResourceTracker()->GetResource(resource);
+}
+
+void EnterBase::SetStateForResourceError(PP_Resource /* pp_resource */,
+ Resource* /* resource_base */,
+ void* object,
+ bool /* report_error */) {
+ if (object)
+ return; // Everything worked.
+
+ retval_ = PP_ERROR_BADRESOURCE;
+ // TODO(brettw) log the error.
+}
+
+} // namespace subtle
+
EnterResourceCreation::EnterResourceCreation(PP_Instance instance)
: EnterFunctionNoLock<ResourceCreationAPI>(instance, true) {
}
« no previous file with comments | « ppapi/thunk/enter.h ('k') | ppapi/thunk/ppb_graphics_2d_thunk.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698