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

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

Issue 9802027: WebSocket Pepper API: synchronous completion support (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: rebase again Created 8 years, 8 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_websocket.cc
diff --git a/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_websocket.cc b/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_websocket.cc
index 1fdbf2cca27984223d5bdc0f30f7edefbbfe21e7..d2acf095b7ddcec291ab0b89f29f7f0bbf4909c5 100644
--- a/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_websocket.cc
+++ b/ppapi/native_client/src/shared/ppapi_proxy/plugin_ppb_websocket.cc
@@ -120,25 +120,50 @@ int32_t ReceiveMessage(PP_Resource ws,
PP_CompletionCallback callback) {
DebugPrintf("PPB_WebSocket::ReceiveMessage: ws=%"NACL_PRId32"\n", ws);
+ if (message == NULL)
+ return PP_ERROR_FAILED;
int32_t callback_id =
CompletionCallbackTable::Get()->AddCallback(callback, message);
if (callback_id == 0)
return PP_ERROR_BLOCKS_MAIN_THREAD;
- // TODO(toyoshim): ReceiveMessage needs performance optimization to reduce
- // chances to call RPC.
+ nacl_abi_size_t sync_read_buffer_size = kMaxReturnVarSize;
+ nacl::scoped_array<char> sync_read_buffer_bytes(
+ new char[sync_read_buffer_size]);
+
int32_t pp_error;
NaClSrpcError srpc_result =
PpbWebSocketRpcClient::PPB_WebSocket_ReceiveMessage(
GetMainSrpcChannel(),
ws,
callback_id,
- &pp_error);
+ &pp_error,
+ &sync_read_buffer_size,
+ sync_read_buffer_bytes.get());
DebugPrintf("PPB_WebSocket::ReceiveMessage: %s\n",
NaClSrpcErrorString(srpc_result));
if (srpc_result != NACL_SRPC_RESULT_OK)
pp_error = PP_ERROR_FAILED;
+
+ if (pp_error != PP_OK_COMPLETIONPENDING) {
+ // Consumes plugin callback and deserialize received data.
+ void* plugin_buffer;
+ PP_Var* plugin_var;
+ PP_CompletionCallback plugin_callback =
+ CompletionCallbackTable::Get()->RemoveCallback(callback_id,
+ &plugin_buffer,
+ &plugin_var);
+ DCHECK(plugin_callback.func == callback.func);
+ DCHECK(plugin_var == message);
+ if (pp_error == PP_OK) {
+ *message = PP_MakeUndefined();
+ if (!DeserializeTo(sync_read_buffer_bytes.get(),
+ sync_read_buffer_size, 1, message))
+ return PP_ERROR_FAILED;
+ }
+ }
+
return MayForceCallback(callback, pp_error);
}

Powered by Google App Engine
This is Rietveld 408576698