LCOV - code coverage report
Current view: top level - test/cctest - test-threads.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 24 24 100.0 %
Date: 2019-04-17 Functions: 5 6 83.3 %

          Line data    Source code
       1             : // Copyright 2008 the V8 project authors. All rights reserved.
       2             : // Redistribution and use in source and binary forms, with or without
       3             : // modification, are permitted provided that the following conditions are
       4             : // met:
       5             : //
       6             : //     * Redistributions of source code must retain the above copyright
       7             : //       notice, this list of conditions and the following disclaimer.
       8             : //     * Redistributions in binary form must reproduce the above
       9             : //       copyright notice, this list of conditions and the following
      10             : //       disclaimer in the documentation and/or other materials provided
      11             : //       with the distribution.
      12             : //     * Neither the name of Google Inc. nor the names of its
      13             : //       contributors may be used to endorse or promote products derived
      14             : //       from this software without specific prior written permission.
      15             : //
      16             : // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
      17             : // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
      18             : // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
      19             : // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
      20             : // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      21             : // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
      22             : // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
      23             : // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
      24             : // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
      25             : // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
      26             : // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      27             : 
      28             : #include "test/cctest/cctest.h"
      29             : 
      30             : #include "src/thread-id.h"
      31             : 
      32             : namespace v8 {
      33             : namespace internal {
      34             : 
      35             : // {ThreadId} must be trivially copyable to be stored in {std::atomic}.
      36             : ASSERT_TRIVIALLY_COPYABLE(i::ThreadId);
      37             : using AtomicThreadId = std::atomic<i::ThreadId>;
      38             : 
      39         500 : class ThreadIdValidationThread : public base::Thread {
      40             :  public:
      41             :   ThreadIdValidationThread(base::Thread* thread_to_start, AtomicThreadId* refs,
      42             :                            unsigned int thread_no, base::Semaphore* semaphore)
      43             :       : Thread(Options("ThreadRefValidationThread")),
      44             :         refs_(refs),
      45             :         thread_no_(thread_no),
      46             :         thread_to_start_(thread_to_start),
      47         500 :         semaphore_(semaphore) {}
      48             : 
      49         500 :   void Run() override {
      50             :     i::ThreadId thread_id = i::ThreadId::Current();
      51         500 :     CHECK(thread_id.IsValid());
      52       50000 :     for (int i = 0; i < thread_no_; i++) {
      53       49500 :       CHECK_NE(refs_[i].load(std::memory_order_relaxed), thread_id);
      54             :     }
      55         500 :     refs_[thread_no_].store(thread_id, std::memory_order_relaxed);
      56         500 :     if (thread_to_start_ != nullptr) {
      57         495 :       thread_to_start_->Start();
      58             :     }
      59         500 :     semaphore_->Signal();
      60         500 :   }
      61             : 
      62             :  private:
      63             :   AtomicThreadId* const refs_;
      64             :   const int thread_no_;
      65             :   base::Thread* const thread_to_start_;
      66             :   base::Semaphore* const semaphore_;
      67             : };
      68             : 
      69       26644 : TEST(ThreadIdValidation) {
      70             :   constexpr int kNThreads = 100;
      71         510 :   std::unique_ptr<ThreadIdValidationThread> threads[kNThreads];
      72           5 :   AtomicThreadId refs[kNThreads];
      73          10 :   base::Semaphore semaphore(0);
      74         505 :   for (int i = kNThreads - 1; i >= 0; i--) {
      75             :     ThreadIdValidationThread* prev =
      76        1000 :         i == kNThreads - 1 ? nullptr : threads[i + 1].get();
      77         500 :     threads[i] =
      78        1000 :         base::make_unique<ThreadIdValidationThread>(prev, refs, i, &semaphore);
      79             :   }
      80           5 :   threads[0]->Start();
      81        1005 :   for (int i = 0; i < kNThreads; i++) {
      82         500 :     semaphore.Wait();
      83             :   }
      84           5 : }
      85             : 
      86             : }  // namespace internal
      87       79917 : }  // namespace v8

Generated by: LCOV version 1.10