Index: ppapi/native_client/src/shared/ppapi_proxy/plugin_upcall.cc |
=================================================================== |
--- ppapi/native_client/src/shared/ppapi_proxy/plugin_upcall.cc (revision 0) |
+++ ppapi/native_client/src/shared/ppapi_proxy/plugin_upcall.cc (revision 0) |
@@ -0,0 +1,71 @@ |
+// Copyright (c) 2011 The Native Client Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+// |
+// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING |
+// |
+// This is an early draft of background thread support. |
+// Until it is complete, we assume that all proxy functions |
+// (except CallOnMainThread) are called on the main PPAPI thread. |
+// |
+// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING |
+ |
+#include "native_client/src/shared/ppapi_proxy/plugin_upcall.h" |
+ |
+#include <pthread.h> |
+#include <map> |
+ |
+#include "native_client/src/include/nacl_macros.h" |
+#include "native_client/src/include/portability.h" |
+#include "native_client/src/shared/ppapi_proxy/plugin_callback.h" |
+#include "native_client/src/shared/ppapi_proxy/plugin_globals.h" |
+#include "native_client/src/shared/ppapi_proxy/utility.h" |
+#include "native_client/src/shared/srpc/nacl_srpc.h" |
+#include "ppapi/c/pp_errors.h" |
+#include "srpcgen/ppp_rpc.h" |
+#include "srpcgen/upcall.h" |
+ |
+using ppapi_proxy::CompletionCallbackTable; |
+ |
+namespace ppapi_proxy { |
+ |
+namespace { |
+ |
+ class CallOnMainThreadCriticalSection { |
+ static pthread_mutex_t mutex_; |
+ public: |
+ CallOnMainThreadCriticalSection() { pthread_mutex_lock(&mutex_); } |
+ ~CallOnMainThreadCriticalSection() { pthread_mutex_unlock(&mutex_); } |
+ }; |
+ |
+ pthread_mutex_t CallOnMainThreadCriticalSection::mutex_ = |
+ PTHREAD_MUTEX_INITIALIZER; |
+ |
+} // namespace |
+ |
+// The call on main thread is implemented via an RPC to the browser side on the |
+// upcall channel, instead of locally to the plugin. This is to ensure that |
+// when the callback runs (and potentially calls one of the PPB_ methods |
+// over RPC), the browser-side is listening. |
+void PluginUpcallCoreCallOnMainThread(int32_t delay_in_milliseconds, |
+ PP_CompletionCallback callback, |
+ int32_t result) { |
+ // Force PluginUpcallCoreCallOnMainThread, from multiple threads, to occur |
+ // one at a time. |
+ CallOnMainThreadCriticalSection guard; |
+ NaClSrpcChannel* upcall_channel = GetUpcallSrpcChannel(); |
+ if (upcall_channel == NULL) { |
+ DebugPrintf("PluginUpcallCoreCallOnMainThread: NULL channel.\n"); |
+ return; |
+ } |
+ int32_t callback_id = |
+ ppapi_proxy::CompletionCallbackTable::Get()->AddCallback(callback); |
+ if (callback_id == 0) { |
+ DebugPrintf("PluginUpcallCoreCallOnMainThread: NULL callback.\n"); |
+ return; |
+ } |
+ (void) PppUpcallRpcClient::PPB_Core_CallOnMainThread( |
+ upcall_channel, delay_in_milliseconds, callback_id, result); |
+} |
+ |
+} // namespace ppapi_proxy |