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

Side by Side Diff: ppapi/native_client/src/shared/ppapi_proxy/plugin_callback.cc

Issue 9227008: WebSocket Pepper API: SRPC proxy implementation (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix win32 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include "native_client/src/shared/ppapi_proxy/plugin_callback.h" 5 #include "native_client/src/shared/ppapi_proxy/plugin_callback.h"
6 #include <string.h> 6 #include <string.h>
7 #include "native_client/src/shared/ppapi_proxy/object_serialize.h"
7 #include "native_client/src/shared/ppapi_proxy/utility.h" 8 #include "native_client/src/shared/ppapi_proxy/utility.h"
8 #include "ppapi/c/pp_errors.h" 9 #include "ppapi/c/pp_errors.h"
9 #include "srpcgen/ppp_rpc.h" 10 #include "srpcgen/ppp_rpc.h"
10 11
11 namespace ppapi_proxy { 12 namespace ppapi_proxy {
12 13
13 int32_t MayForceCallback(PP_CompletionCallback callback, int32_t result) { 14 int32_t MayForceCallback(PP_CompletionCallback callback, int32_t result) {
14 if (result == PP_OK_COMPLETIONPENDING) 15 if (result == PP_OK_COMPLETIONPENDING)
15 return result; 16 return result;
16 17
17 if (callback.func == NULL || 18 if (callback.func == NULL ||
18 (callback.flags & PP_COMPLETIONCALLBACK_FLAG_OPTIONAL) != 0) 19 (callback.flags & PP_COMPLETIONCALLBACK_FLAG_OPTIONAL) != 0)
19 return result; 20 return result;
20 21
21 PPBCoreInterface()->CallOnMainThread(0, callback, result); 22 PPBCoreInterface()->CallOnMainThread(0, callback, result);
22 return PP_OK_COMPLETIONPENDING; 23 return PP_OK_COMPLETIONPENDING;
23 } 24 }
24 25
25 // Initialize static mutex used as critical section for all callback tables. 26 // Initialize static mutex used as critical section for all callback tables.
26 pthread_mutex_t CompletionCallbackTable::mutex_ = PTHREAD_MUTEX_INITIALIZER; 27 pthread_mutex_t CompletionCallbackTable::mutex_ = PTHREAD_MUTEX_INITIALIZER;
27 28
28 int32_t CompletionCallbackTable::AddCallback( 29 int32_t CompletionCallbackTable::AddCallback(
29 const PP_CompletionCallback& callback, 30 const PP_CompletionCallback& callback,
30 void* read_buffer) { 31 void* read_buffer,
32 PP_Var* read_var) {
31 CallbackTableCriticalSection guard; 33 CallbackTableCriticalSection guard;
34 DCHECK (!read_buffer || !read_var);
32 if (callback.func == NULL) { 35 if (callback.func == NULL) {
33 DebugPrintf("CompletionCallbackTable attempted to add NULL func!!\n"); 36 DebugPrintf("CompletionCallbackTable attempted to add NULL func!!\n");
34 return 0; 37 return 0;
35 } 38 }
36 int32_t callback_id = next_id_; 39 int32_t callback_id = next_id_;
37 ++next_id_; 40 ++next_id_;
38 CallbackInfo info = { callback, read_buffer }; 41 CallbackInfo info = { callback, read_buffer, read_var };
39 table_.insert(std::pair<int32_t, CallbackInfo>(callback_id, info)); 42 table_.insert(std::pair<int32_t, CallbackInfo>(callback_id, info));
40 return callback_id; 43 return callback_id;
41 } 44 }
42 45
43 int32_t CompletionCallbackTable::AddCallback( 46 int32_t CompletionCallbackTable::AddCallback(
44 const PP_CompletionCallback& callback) { 47 const PP_CompletionCallback& callback) {
45 return AddCallback(callback, NULL); 48 return AddCallback(callback, NULL, NULL);
46 } 49 }
47 50
51 int32_t CompletionCallbackTable::AddCallback(
52 const PP_CompletionCallback& callback,
53 void* read_buffer) {
54 return AddCallback(callback, read_buffer, NULL);
55 }
56
57 int32_t CompletionCallbackTable::AddCallback(
58 const PP_CompletionCallback& callback,
59 PP_Var* read_var) {
60 return AddCallback(callback, NULL, read_var);
61 }
62
63
48 PP_CompletionCallback CompletionCallbackTable::RemoveCallback( 64 PP_CompletionCallback CompletionCallbackTable::RemoveCallback(
49 int32_t callback_id, void** read_buffer) { 65 int32_t callback_id, void** read_buffer, PP_Var** read_var) {
50 CallbackTableCriticalSection guard; 66 CallbackTableCriticalSection guard;
51 CallbackTable::iterator it = table_.find(callback_id); 67 CallbackTable::iterator it = table_.find(callback_id);
52 DebugPrintf("CompletionCallbackTable::RemoveCallback id: %"NACL_PRId32"\n", 68 DebugPrintf("CompletionCallbackTable::RemoveCallback id: %"NACL_PRId32"\n",
53 callback_id); 69 callback_id);
54 if (table_.end() != it) { 70 if (table_.end() != it) {
55 CallbackInfo info = it->second; 71 CallbackInfo info = it->second;
56 table_.erase(it); 72 table_.erase(it);
57 if (read_buffer != NULL) 73 if (read_buffer != NULL)
58 *read_buffer = info.read_buffer; 74 *read_buffer = info.read_buffer;
75 if (read_var != NULL)
76 *read_var = info.read_var;
59 return info.callback; 77 return info.callback;
60 } 78 }
61 *read_buffer = NULL; 79 *read_buffer = NULL;
62 return PP_BlockUntilComplete(); 80 return PP_BlockUntilComplete();
63 } 81 }
64 82
65 } // namespace ppapi_proxy 83 } // namespace ppapi_proxy
66 84
67 // SRPC-abstraction wrapper around a PP_CompletionCallback. 85 // SRPC-abstraction wrapper around a PP_CompletionCallback.
68 void CompletionCallbackRpcServer::RunCompletionCallback( 86 void CompletionCallbackRpcServer::RunCompletionCallback(
69 NaClSrpcRpc* rpc, 87 NaClSrpcRpc* rpc,
70 NaClSrpcClosure* done, 88 NaClSrpcClosure* done,
71 // inputs 89 // inputs
72 int32_t callback_id, 90 int32_t callback_id,
73 int32_t result, 91 int32_t result,
74 // TODO(polina): use shm for read buffer 92 // TODO(polina): use shm for read buffer
75 nacl_abi_size_t read_buffer_size, char* read_buffer) { 93 nacl_abi_size_t read_buffer_size, char* read_buffer) {
76 NaClSrpcClosureRunner runner(done); 94 NaClSrpcClosureRunner runner(done);
77 rpc->result = NACL_SRPC_RESULT_APP_ERROR; 95 rpc->result = NACL_SRPC_RESULT_APP_ERROR;
78 96
79 void* user_buffer; 97 void* user_buffer;
98 PP_Var* user_var;
80 PP_CompletionCallback callback = 99 PP_CompletionCallback callback =
81 ppapi_proxy::CompletionCallbackTable::Get()->RemoveCallback( 100 ppapi_proxy::CompletionCallbackTable::Get()->RemoveCallback(
82 callback_id, &user_buffer); 101 callback_id, &user_buffer, &user_var);
83 if (callback.func == NULL) { 102 if (callback.func == NULL) {
84 ppapi_proxy::DebugPrintf( 103 ppapi_proxy::DebugPrintf(
85 "CompletionCallbackRpcServer: id of %"NACL_PRId32" is NULL callback!\n", 104 "CompletionCallbackRpcServer: id of %"NACL_PRId32" is NULL callback!\n",
86 callback_id); 105 callback_id);
87 return; 106 return;
88 } 107 }
89 108
90 if (user_buffer != NULL && read_buffer_size > 0) 109 if (user_buffer != NULL && read_buffer_size > 0)
91 memcpy(user_buffer, read_buffer, read_buffer_size); 110 memcpy(user_buffer, read_buffer, read_buffer_size);
111 if (user_var != NULL && read_buffer_size > 0)
dmichael (off chromium) 2012/01/17 23:32:45 nit: else if, just for clarity
Takashi Toyoshima 2012/01/18 11:07:16 Done.
112 ppapi_proxy::DeserializeTo(read_buffer, read_buffer_size, 1, user_var);
92 PP_RunCompletionCallback(&callback, result); 113 PP_RunCompletionCallback(&callback, result);
93 114
94 rpc->result = NACL_SRPC_RESULT_OK; 115 rpc->result = NACL_SRPC_RESULT_OK;
95 } 116 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698