OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 signals_received_.push_back(signum); | 421 signals_received_.push_back(signum); |
422 signaled_thread_ = Thread::Current(); | 422 signaled_thread_ = Thread::Current(); |
423 } | 423 } |
424 | 424 |
425 protected: | 425 protected: |
426 void SetUp() { | 426 void SetUp() { |
427 ss_.reset(new PhysicalSocketServer()); | 427 ss_.reset(new PhysicalSocketServer()); |
428 } | 428 } |
429 | 429 |
430 void TearDown() { | 430 void TearDown() { |
431 ss_.reset(NULL); | 431 ss_.reset(nullptr); |
432 signals_received_.clear(); | 432 signals_received_.clear(); |
433 signaled_thread_ = NULL; | 433 signaled_thread_ = nullptr; |
434 } | 434 } |
435 | 435 |
436 bool ExpectSignal(int signum) { | 436 bool ExpectSignal(int signum) { |
437 if (signals_received_.empty()) { | 437 if (signals_received_.empty()) { |
438 LOG(LS_ERROR) << "ExpectSignal(): No signal received"; | 438 LOG(LS_ERROR) << "ExpectSignal(): No signal received"; |
439 return false; | 439 return false; |
440 } | 440 } |
441 if (signals_received_[0] != signum) { | 441 if (signals_received_[0] != signum) { |
442 LOG(LS_ERROR) << "ExpectSignal(): Received signal " << | 442 LOG(LS_ERROR) << "ExpectSignal(): Received signal " << |
443 signals_received_[0] << ", expected " << signum; | 443 signals_received_[0] << ", expected " << signum; |
(...skipping 12 matching lines...) Expand all Loading... |
456 return ret; | 456 return ret; |
457 } | 457 } |
458 | 458 |
459 static std::vector<int> signals_received_; | 459 static std::vector<int> signals_received_; |
460 static Thread *signaled_thread_; | 460 static Thread *signaled_thread_; |
461 | 461 |
462 std::unique_ptr<PhysicalSocketServer> ss_; | 462 std::unique_ptr<PhysicalSocketServer> ss_; |
463 }; | 463 }; |
464 | 464 |
465 std::vector<int> PosixSignalDeliveryTest::signals_received_; | 465 std::vector<int> PosixSignalDeliveryTest::signals_received_; |
466 Thread *PosixSignalDeliveryTest::signaled_thread_ = NULL; | 466 Thread* PosixSignalDeliveryTest::signaled_thread_ = nullptr; |
467 | 467 |
468 // Test receiving a synchronous signal while not in Wait() and then entering | 468 // Test receiving a synchronous signal while not in Wait() and then entering |
469 // Wait() afterwards. | 469 // Wait() afterwards. |
470 TEST_F(PosixSignalDeliveryTest, RaiseThenWait) { | 470 TEST_F(PosixSignalDeliveryTest, RaiseThenWait) { |
471 ASSERT_TRUE(ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal)); | 471 ASSERT_TRUE(ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal)); |
472 raise(SIGTERM); | 472 raise(SIGTERM); |
473 EXPECT_TRUE(ss_->Wait(0, true)); | 473 EXPECT_TRUE(ss_->Wait(0, true)); |
474 EXPECT_TRUE(ExpectSignal(SIGTERM)); | 474 EXPECT_TRUE(ExpectSignal(SIGTERM)); |
475 EXPECT_TRUE(ExpectNone()); | 475 EXPECT_TRUE(ExpectNone()); |
476 } | 476 } |
(...skipping 24 matching lines...) Expand all Loading... |
501 } | 501 } |
502 | 502 |
503 class RaiseSigTermRunnable : public Runnable { | 503 class RaiseSigTermRunnable : public Runnable { |
504 void Run(Thread *thread) { | 504 void Run(Thread *thread) { |
505 thread->socketserver()->Wait(1000, false); | 505 thread->socketserver()->Wait(1000, false); |
506 | 506 |
507 // Allow SIGTERM. This will be the only thread with it not masked so it will | 507 // Allow SIGTERM. This will be the only thread with it not masked so it will |
508 // be delivered to us. | 508 // be delivered to us. |
509 sigset_t mask; | 509 sigset_t mask; |
510 sigemptyset(&mask); | 510 sigemptyset(&mask); |
511 pthread_sigmask(SIG_SETMASK, &mask, NULL); | 511 pthread_sigmask(SIG_SETMASK, &mask, nullptr); |
512 | 512 |
513 // Raise it. | 513 // Raise it. |
514 raise(SIGTERM); | 514 raise(SIGTERM); |
515 } | 515 } |
516 }; | 516 }; |
517 | 517 |
518 // Test that it works no matter what thread the kernel chooses to give the | 518 // Test that it works no matter what thread the kernel chooses to give the |
519 // signal to (since it's not guaranteed to be the one that Wait() runs on). | 519 // signal to (since it's not guaranteed to be the one that Wait() runs on). |
520 TEST_F(PosixSignalDeliveryTest, SignalOnDifferentThread) { | 520 TEST_F(PosixSignalDeliveryTest, SignalOnDifferentThread) { |
521 ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal); | 521 ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal); |
522 // Mask out SIGTERM so that it can't be delivered to this thread. | 522 // Mask out SIGTERM so that it can't be delivered to this thread. |
523 sigset_t mask; | 523 sigset_t mask; |
524 sigemptyset(&mask); | 524 sigemptyset(&mask); |
525 sigaddset(&mask, SIGTERM); | 525 sigaddset(&mask, SIGTERM); |
526 EXPECT_EQ(0, pthread_sigmask(SIG_SETMASK, &mask, NULL)); | 526 EXPECT_EQ(0, pthread_sigmask(SIG_SETMASK, &mask, nullptr)); |
527 // Start a new thread that raises it. It will have to be delivered to that | 527 // Start a new thread that raises it. It will have to be delivered to that |
528 // thread. Our implementation should safely handle it and dispatch | 528 // thread. Our implementation should safely handle it and dispatch |
529 // RecordSignal() on this thread. | 529 // RecordSignal() on this thread. |
530 std::unique_ptr<Thread> thread(new Thread()); | 530 std::unique_ptr<Thread> thread(new Thread()); |
531 std::unique_ptr<RaiseSigTermRunnable> runnable(new RaiseSigTermRunnable()); | 531 std::unique_ptr<RaiseSigTermRunnable> runnable(new RaiseSigTermRunnable()); |
532 thread->Start(runnable.get()); | 532 thread->Start(runnable.get()); |
533 EXPECT_TRUE(ss_->Wait(1500, true)); | 533 EXPECT_TRUE(ss_->Wait(1500, true)); |
534 EXPECT_TRUE(ExpectSignal(SIGTERM)); | 534 EXPECT_TRUE(ExpectSignal(SIGTERM)); |
535 EXPECT_EQ(Thread::Current(), signaled_thread_); | 535 EXPECT_EQ(Thread::Current(), signaled_thread_); |
536 EXPECT_TRUE(ExpectNone()); | 536 EXPECT_TRUE(ExpectNone()); |
537 } | 537 } |
538 | 538 |
539 #endif | 539 #endif |
540 | 540 |
541 } // namespace rtc | 541 } // namespace rtc |
OLD | NEW |