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

Unified Diff: ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_core.cc

Issue 7740013: Cloning a bunch of stuff from the native_client repository at r6528 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 4 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
Index: ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_core.cc
===================================================================
--- ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_core.cc (revision 0)
+++ ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_core.cc (revision 0)
@@ -0,0 +1,146 @@
+// Copyright 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.
+
+#include "native_client/src/shared/ppapi_proxy/plugin_ppb_core.h"
+#include <stdio.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/plugin_resource_tracker.h"
+#include "native_client/src/shared/ppapi_proxy/plugin_upcall.h"
+#include "native_client/src/shared/ppapi_proxy/utility.h"
+#include "ppapi/c/pp_completion_callback.h"
+#include "ppapi/c/pp_resource.h"
+#include "ppapi/c/ppb_core.h"
+#include "srpcgen/ppb_rpc.h"
+
+using ppapi_proxy::DebugPrintf;
+using ppapi_proxy::GetMainSrpcChannel;
+
+// All of the methods here are invoked from the plugin's main (UI) thread,
+// so no locking is done.
+
+namespace {
+
+__thread bool is_main_thread = false;
+bool main_thread_marked = false;
+
+// Increment the reference count for a specified resource. This only takes
+// care of the plugin's reference count - the Resource should obtain the
+// browser reference when it stores the browser's Resource id. When the
+// Resource's reference count goes to zero, the destructor should make sure
+// the browser reference is returned.
+void AddRefResource(PP_Resource resource) {
+ DebugPrintf("PPB_Core::AddRefResource: resource=%"NACL_PRIu32"\n",
+ resource);
+ if (!ppapi_proxy::PluginResourceTracker::Get()->AddRefResource(resource)) {
+ DebugPrintf("PPB_Core::AddRefResource: not tracked locally\n");
+ NaClSrpcError srpc_result = PpbCoreRpcClient::PPB_Core_AddRefResource(
+ GetMainSrpcChannel(), resource);
+ DebugPrintf("PPB_Core::AddRefResource: %s\n",
+ NaClSrpcErrorString(srpc_result));
+
+ }
+}
+
+void ReleaseResource(PP_Resource resource) {
+ DebugPrintf("PPB_Core::ReleaseResource: resource=%"NACL_PRIu32"\n",
+ resource);
+ if (!ppapi_proxy::PluginResourceTracker::Get()->UnrefResource(resource)) {
+ DebugPrintf("PPB_Core::ReleaseResource: not tracked locally\n");
+ NaClSrpcError srpc_result = PpbCoreRpcClient::PPB_Core_ReleaseResource(
+ GetMainSrpcChannel(), resource);
+ DebugPrintf("PPB_Core::ReleaseResource: %s\n",
+ NaClSrpcErrorString(srpc_result));
+ }
+}
+
+PP_TimeTicks GetTime() {
+ DebugPrintf("PPB_Core::GetTime\n");
+ double time;
+ NaClSrpcError srpc_result = PpbCoreRpcClient::PPB_Core_GetTime(
+ GetMainSrpcChannel(), &time);
+ DebugPrintf("PPB_Core::GetTime: %s\n", NaClSrpcErrorString(srpc_result));
+ if (srpc_result != NACL_SRPC_RESULT_OK) {
+ return static_cast<PP_Time>(-1.0);
+ } else {
+ return static_cast<PP_Time>(time);
+ }
+}
+
+PP_TimeTicks GetTimeTicks() {
+ DebugPrintf("PPB_Core::GetTimeTicks\n");
+ double time_ticks;
+ NaClSrpcError srpc_result = PpbCoreRpcClient::PPB_Core_GetTimeTicks(
+ GetMainSrpcChannel(), &time_ticks);
+ DebugPrintf("PPB_Core::GetTimeTicks: %s\n", NaClSrpcErrorString(srpc_result));
+ if (srpc_result != NACL_SRPC_RESULT_OK) {
+ return static_cast<PP_TimeTicks>(-1.0);
+ } else {
+ return static_cast<PP_TimeTicks>(time_ticks);
+ }
+}
+
+PP_Bool IsMainThread() {
+ DebugPrintf("PPB_Core::IsMainThread\n");
+ return PP_FromBool(is_main_thread);
+}
+
+void CallOnMainThread(int32_t delay_in_milliseconds,
+ PP_CompletionCallback callback,
+ int32_t result) {
+ if (!IsMainThread()) {
+ ppapi_proxy::PluginUpcallCoreCallOnMainThread(
+ delay_in_milliseconds, callback, result);
+ return;
+ }
+
+ int32_t callback_id =
+ ppapi_proxy::CompletionCallbackTable::Get()->AddCallback(callback);
+ if (callback_id == 0)
+ return;
+
+ NaClSrpcError srpc_result =
+ PpbCoreRpcClient::PPB_Core_CallOnMainThread(
+ ppapi_proxy::GetMainSrpcChannel(),
+ delay_in_milliseconds,
+ callback_id,
+ result);
+ DebugPrintf("PPB_Core::CallOnMainThread: %s\n",
+ NaClSrpcErrorString(srpc_result));
+}
+
+} // namespace
+
+namespace ppapi_proxy {
+
+const PPB_Core* PluginCore::GetInterface() {
+ static const PPB_Core core_interface = {
+ AddRefResource,
+ ReleaseResource,
+ GetTime,
+ GetTimeTicks,
+ CallOnMainThread,
+ IsMainThread
+ };
+ return &core_interface;
+}
+
+void PluginCore::MarkMainThread() {
+ if (main_thread_marked) {
+ // A main thread was already designated. Fail.
+ NACL_NOTREACHED();
+ } else {
+ is_main_thread = true;
+ // Setting this once works because the main thread will call this function
+ // before calling any pthread_creates. Hence the result is already
+ // published before other threads might attempt to call it.
+ main_thread_marked = true;
+ }
+}
+
+
+} // namespace ppapi_proxy

Powered by Google App Engine
This is Rietveld 408576698