OLD | NEW |
---|---|
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 } |
OLD | NEW |