OLD | NEW |
1 // Copyright (c) 2012 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 "ipc/ipc_channel_win.h" | 5 #include "ipc/ipc_channel_win.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 | 8 |
9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 // Closing the handle at this point prevents us from issuing more requests | 63 // Closing the handle at this point prevents us from issuing more requests |
64 // form OnIOCompleted(). | 64 // form OnIOCompleted(). |
65 if (pipe_ != INVALID_HANDLE_VALUE) { | 65 if (pipe_ != INVALID_HANDLE_VALUE) { |
66 CloseHandle(pipe_); | 66 CloseHandle(pipe_); |
67 pipe_ = INVALID_HANDLE_VALUE; | 67 pipe_ = INVALID_HANDLE_VALUE; |
68 } | 68 } |
69 | 69 |
70 // Make sure all IO has completed. | 70 // Make sure all IO has completed. |
71 base::Time start = base::Time::Now(); | 71 base::Time start = base::Time::Now(); |
72 while (input_state_.is_pending || output_state_.is_pending) { | 72 while (input_state_.is_pending || output_state_.is_pending) { |
73 MessageLoopForIO::current()->WaitForIOCompletion(INFINITE, this); | 73 base::MessageLoopForIO::current()->WaitForIOCompletion(INFINITE, this); |
74 } | 74 } |
75 | 75 |
76 while (!output_queue_.empty()) { | 76 while (!output_queue_.empty()) { |
77 Message* m = output_queue_.front(); | 77 Message* m = output_queue_.front(); |
78 output_queue_.pop(); | 78 output_queue_.pop(); |
79 delete m; | 79 delete m; |
80 } | 80 } |
81 } | 81 } |
82 | 82 |
83 bool Channel::ChannelImpl::Send(Message* message) { | 83 bool Channel::ChannelImpl::Send(Message* message) { |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
287 | 287 |
288 bool Channel::ChannelImpl::Connect() { | 288 bool Channel::ChannelImpl::Connect() { |
289 DLOG_IF(WARNING, thread_check_.get()) << "Connect called more than once"; | 289 DLOG_IF(WARNING, thread_check_.get()) << "Connect called more than once"; |
290 | 290 |
291 if (!thread_check_.get()) | 291 if (!thread_check_.get()) |
292 thread_check_.reset(new base::ThreadChecker()); | 292 thread_check_.reset(new base::ThreadChecker()); |
293 | 293 |
294 if (pipe_ == INVALID_HANDLE_VALUE) | 294 if (pipe_ == INVALID_HANDLE_VALUE) |
295 return false; | 295 return false; |
296 | 296 |
297 MessageLoopForIO::current()->RegisterIOHandler(pipe_, this); | 297 base::MessageLoopForIO::current()->RegisterIOHandler(pipe_, this); |
298 | 298 |
299 // Check to see if there is a client connected to our pipe... | 299 // Check to see if there is a client connected to our pipe... |
300 if (waiting_connect_) | 300 if (waiting_connect_) |
301 ProcessConnection(); | 301 ProcessConnection(); |
302 | 302 |
303 if (!input_state_.is_pending) { | 303 if (!input_state_.is_pending) { |
304 // Complete setup asynchronously. By not setting input_state_.is_pending | 304 // Complete setup asynchronously. By not setting input_state_.is_pending |
305 // to true, we indicate to OnIOCompleted that this is the special | 305 // to true, we indicate to OnIOCompleted that this is the special |
306 // initialization signal. | 306 // initialization signal. |
307 MessageLoopForIO::current()->PostTask( | 307 base::MessageLoopForIO::current()->PostTask( |
308 FROM_HERE, base::Bind(&Channel::ChannelImpl::OnIOCompleted, | 308 FROM_HERE, |
309 weak_factory_.GetWeakPtr(), &input_state_.context, | 309 base::Bind(&Channel::ChannelImpl::OnIOCompleted, |
310 0, 0)); | 310 weak_factory_.GetWeakPtr(), |
| 311 &input_state_.context, |
| 312 0, |
| 313 0)); |
311 } | 314 } |
312 | 315 |
313 if (!waiting_connect_) | 316 if (!waiting_connect_) |
314 ProcessOutgoingMessages(NULL, 0); | 317 ProcessOutgoingMessages(NULL, 0); |
315 return true; | 318 return true; |
316 } | 319 } |
317 | 320 |
318 bool Channel::ChannelImpl::ProcessConnection() { | 321 bool Channel::ChannelImpl::ProcessConnection() { |
319 DCHECK(thread_check_->CalledOnValidThread()); | 322 DCHECK(thread_check_->CalledOnValidThread()); |
320 if (input_state_.is_pending) | 323 if (input_state_.is_pending) |
(...skipping 25 matching lines...) Expand all Loading... |
346 return false; | 349 return false; |
347 default: | 350 default: |
348 NOTREACHED(); | 351 NOTREACHED(); |
349 return false; | 352 return false; |
350 } | 353 } |
351 | 354 |
352 return true; | 355 return true; |
353 } | 356 } |
354 | 357 |
355 bool Channel::ChannelImpl::ProcessOutgoingMessages( | 358 bool Channel::ChannelImpl::ProcessOutgoingMessages( |
356 MessageLoopForIO::IOContext* context, | 359 base::MessageLoopForIO::IOContext* context, |
357 DWORD bytes_written) { | 360 DWORD bytes_written) { |
358 DCHECK(!waiting_connect_); // Why are we trying to send messages if there's | 361 DCHECK(!waiting_connect_); // Why are we trying to send messages if there's |
359 // no connection? | 362 // no connection? |
360 DCHECK(thread_check_->CalledOnValidThread()); | 363 DCHECK(thread_check_->CalledOnValidThread()); |
361 | 364 |
362 if (output_state_.is_pending) { | 365 if (output_state_.is_pending) { |
363 DCHECK(context); | 366 DCHECK(context); |
364 output_state_.is_pending = false; | 367 output_state_.is_pending = false; |
365 if (!context || bytes_written == 0) { | 368 if (!context || bytes_written == 0) { |
366 DWORD err = GetLastError(); | 369 DWORD err = GetLastError(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
402 return false; | 405 return false; |
403 } | 406 } |
404 | 407 |
405 DVLOG(2) << "sent message @" << m << " on channel @" << this | 408 DVLOG(2) << "sent message @" << m << " on channel @" << this |
406 << " with type " << m->type(); | 409 << " with type " << m->type(); |
407 | 410 |
408 output_state_.is_pending = true; | 411 output_state_.is_pending = true; |
409 return true; | 412 return true; |
410 } | 413 } |
411 | 414 |
412 void Channel::ChannelImpl::OnIOCompleted(MessageLoopForIO::IOContext* context, | 415 void Channel::ChannelImpl::OnIOCompleted( |
413 DWORD bytes_transfered, | 416 base::MessageLoopForIO::IOContext* context, |
414 DWORD error) { | 417 DWORD bytes_transfered, |
| 418 DWORD error) { |
415 bool ok = true; | 419 bool ok = true; |
416 DCHECK(thread_check_->CalledOnValidThread()); | 420 DCHECK(thread_check_->CalledOnValidThread()); |
417 if (context == &input_state_.context) { | 421 if (context == &input_state_.context) { |
418 if (waiting_connect_) { | 422 if (waiting_connect_) { |
419 if (!ProcessConnection()) | 423 if (!ProcessConnection()) |
420 return; | 424 return; |
421 // We may have some messages queued up to send... | 425 // We may have some messages queued up to send... |
422 if (!output_queue_.empty() && !output_state_.is_pending) | 426 if (!output_queue_.empty() && !output_state_.is_pending) |
423 ProcessOutgoingMessages(NULL, 0); | 427 ProcessOutgoingMessages(NULL, 0); |
424 if (input_state_.is_pending) | 428 if (input_state_.is_pending) |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 int secret; | 508 int secret; |
505 do { // Guarantee we get a non-zero value. | 509 do { // Guarantee we get a non-zero value. |
506 secret = base::RandInt(0, std::numeric_limits<int>::max()); | 510 secret = base::RandInt(0, std::numeric_limits<int>::max()); |
507 } while (secret == 0); | 511 } while (secret == 0); |
508 | 512 |
509 id.append(GenerateUniqueRandomChannelID()); | 513 id.append(GenerateUniqueRandomChannelID()); |
510 return id.append(base::StringPrintf("\\%d", secret)); | 514 return id.append(base::StringPrintf("\\%d", secret)); |
511 } | 515 } |
512 | 516 |
513 } // namespace IPC | 517 } // namespace IPC |
OLD | NEW |