Chromium Code Reviews| Index: ppapi/shared_impl/private/udp_socket_private_impl.cc |
| diff --git a/ppapi/shared_impl/private/udp_socket_private_impl.cc b/ppapi/shared_impl/private/udp_socket_private_impl.cc |
| index 388d15922b54dfa1acaa0c111a75281a10dda472..23f125d0acf1fca4445284ef33bf72078e7cd2bf 100644 |
| --- a/ppapi/shared_impl/private/udp_socket_private_impl.cc |
| +++ b/ppapi/shared_impl/private/udp_socket_private_impl.cc |
| @@ -17,14 +17,6 @@ |
| namespace ppapi { |
| -namespace { |
| - |
| -void AbortCallback(PP_CompletionCallback callback) { |
| - PP_RunCompletionCallback(&callback, PP_ERROR_ABORTED); |
| -} |
| - |
| -} // namespace |
| - |
| const int32_t UDPSocketPrivateImpl::kMaxReadSize = 1024 * 1024; |
| const int32_t UDPSocketPrivateImpl::kMaxWriteSize = 1024 * 1024; |
| @@ -54,12 +46,12 @@ int32_t UDPSocketPrivateImpl::Bind(const PP_NetAddress_Private* addr, |
| return PP_ERROR_BADARGUMENT; |
| if (bound_ || closed_) |
| return PP_ERROR_FAILED; |
| - if (bind_callback_.func) |
| + if (TrackedCallback::IsPending(bind_callback_)) |
| return PP_ERROR_INPROGRESS; |
| // TODO(dmichael): use some other strategy for determining if an |
| // operation is in progress |
| - bind_callback_ = callback; |
| + bind_callback_ = new TrackedCallback(this, callback); |
| // Send the request, the browser will call us back via BindACK. |
| SendBind(*addr); |
| @@ -73,12 +65,12 @@ int32_t UDPSocketPrivateImpl::RecvFrom(char* buffer, |
| return PP_ERROR_BADARGUMENT; |
| if (!bound_) |
| return PP_ERROR_FAILED; |
| - if (recvfrom_callback_.func) |
| + if (TrackedCallback::IsPending(recvfrom_callback_)) |
| return PP_ERROR_INPROGRESS; |
| read_buffer_ = buffer; |
| bytes_to_read_ = std::min(num_bytes, kMaxReadSize); |
| - recvfrom_callback_ = callback; |
| + recvfrom_callback_ = new TrackedCallback(this, callback); |
| // Send the request, the browser will call us back via RecvFromACK. |
| SendRecvFrom(bytes_to_read_); |
| @@ -101,13 +93,13 @@ int32_t UDPSocketPrivateImpl::SendTo(const char* buffer, |
| return PP_ERROR_BADARGUMENT; |
| if (!bound_) |
| return PP_ERROR_FAILED; |
| - if (sendto_callback_.func) |
| + if (TrackedCallback::IsPending(sendto_callback_)) |
| return PP_ERROR_INPROGRESS; |
| if (num_bytes > kMaxWriteSize) |
| num_bytes = kMaxWriteSize; |
| - sendto_callback_ = callback; |
| + sendto_callback_ = new TrackedCallback(this, callback); |
| // Send the request, the browser will call us back via SendToACK. |
| SendSendTo(std::string(buffer, num_bytes), *addr); |
| @@ -125,13 +117,13 @@ void UDPSocketPrivateImpl::Close() { |
| socket_id_ = 0; |
| - PostAbortAndClearIfNecessary(&bind_callback_); |
| - PostAbortAndClearIfNecessary(&recvfrom_callback_); |
| - PostAbortAndClearIfNecessary(&sendto_callback_); |
| + PostAbortIfNecessary(&bind_callback_); |
| + PostAbortIfNecessary(&recvfrom_callback_); |
| + PostAbortIfNecessary(&sendto_callback_); |
| } |
| void UDPSocketPrivateImpl::OnBindCompleted(bool succeeded) { |
| - if (!bind_callback_.func) { |
| + if (!TrackedCallback::IsPending(bind_callback_)) { |
| NOTREACHED(); |
| return; |
| } |
| @@ -139,15 +131,15 @@ void UDPSocketPrivateImpl::OnBindCompleted(bool succeeded) { |
| if (succeeded) |
| bound_ = true; |
| - PP_RunAndClearCompletionCallback(&bind_callback_, |
| - succeeded ? PP_OK : PP_ERROR_FAILED); |
| + TrackedCallback::ClearAndRun(&bind_callback_, |
| + succeeded ? PP_OK : PP_ERROR_FAILED); |
| } |
| void UDPSocketPrivateImpl::OnRecvFromCompleted( |
| bool succeeded, |
| const std::string& data, |
| const PP_NetAddress_Private& addr) { |
| - if (!recvfrom_callback_.func || !read_buffer_) { |
| + if (!TrackedCallback::IsPending(recvfrom_callback_) || !read_buffer_) { |
| NOTREACHED(); |
| return; |
| } |
| @@ -161,21 +153,19 @@ void UDPSocketPrivateImpl::OnRecvFromCompleted( |
| bytes_to_read_ = -1; |
| recvfrom_addr_ = addr; |
| - PP_RunAndClearCompletionCallback( |
| - &recvfrom_callback_, |
| + TrackedCallback::ClearAndRun(&recvfrom_callback_, |
| succeeded ? static_cast<int32_t>(data.size()) : |
| static_cast<int32_t>(PP_ERROR_FAILED)); |
| } |
| void UDPSocketPrivateImpl::OnSendToCompleted(bool succeeded, |
| int32_t bytes_written) { |
| - if (!sendto_callback_.func) { |
| + if (!TrackedCallback::IsPending(sendto_callback_)) { |
| NOTREACHED(); |
| return; |
| } |
| - PP_RunAndClearCompletionCallback( |
| - &sendto_callback_, |
| + TrackedCallback::ClearAndRun(&sendto_callback_, |
| succeeded ? bytes_written : static_cast<int32_t>(PP_ERROR_FAILED)); |
| } |
| @@ -184,9 +174,6 @@ void UDPSocketPrivateImpl::Init(uint32 socket_id) { |
| socket_id_ = socket_id; |
| bound_ = false; |
| closed_ = false; |
| - bind_callback_ = PP_BlockUntilComplete(); |
| - recvfrom_callback_ = PP_BlockUntilComplete(); |
| - sendto_callback_ = PP_BlockUntilComplete(); |
| read_buffer_ = NULL; |
| bytes_to_read_ = -1; |
| @@ -195,15 +182,10 @@ void UDPSocketPrivateImpl::Init(uint32 socket_id) { |
| arraysize(recvfrom_addr_.data) * sizeof(*recvfrom_addr_.data)); |
| } |
| -void UDPSocketPrivateImpl::PostAbortAndClearIfNecessary( |
| - PP_CompletionCallback* callback) { |
| - DCHECK(callback); |
| - |
| - if (callback->func) { |
| - MessageLoop::current()->PostTask(FROM_HERE, |
| - base::Bind(&AbortCallback, *callback)); |
| - *callback = PP_BlockUntilComplete(); |
| - } |
| +void UDPSocketPrivateImpl::PostAbortIfNecessary( |
|
viettrungluu
2012/01/04 01:15:14
"
|
| + scoped_refptr<TrackedCallback>* callback) { |
| + if (callback->get()) |
| + (*callback)->PostAbort(); |
| } |
| } // namespace ppapi |