proxygen
CallOnceTest.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2016-present Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <deque>
18 #include <mutex>
19 #include <thread>
20 
23 
24 static size_t const kNumThreads = 16;
25 
26 template <typename CallOnceFunc>
27 void bm_impl(CallOnceFunc&& fn, size_t iters) {
28  std::deque<std::thread> threads;
29  for (size_t i = 0u; i < kNumThreads; ++i) {
30  threads.emplace_back([&fn, iters] {
31  for (size_t j = 0u; j < iters; ++j) {
32  fn();
33  }
34  });
35  }
36  for (std::thread& t : threads) {
37  t.join();
38  }
39 }
40 
41 TEST(FollyCallOnce, Simple) {
43  auto fn = [&](int* outp) { ++*outp; };
44  int out = 0;
45  folly::call_once(flag, fn, &out);
46  folly::call_once(flag, fn, &out);
47  ASSERT_EQ(1, out);
48 }
49 
50 TEST(FollyCallOnce, Exception) {
51  struct ExpectedException {};
53  size_t numCalls = 0;
56  flag,
57  [&] {
58  ++numCalls;
59  throw ExpectedException();
60  }),
61  ExpectedException);
62  EXPECT_EQ(1, numCalls);
63  folly::call_once(flag, [&] { ++numCalls; });
64  EXPECT_EQ(2, numCalls);
65 }
66 
67 TEST(FollyCallOnce, Stress) {
68  for (int i = 0; i < 100; ++i) {
70  int out = 0;
71  bm_impl([&] { folly::call_once(flag, [&] { ++out; }); }, 100);
72  ASSERT_EQ(1, out);
73  }
74 }
#define EXPECT_THROW(statement, expected_exception)
Definition: gtest.h:1843
#define ASSERT_EQ(val1, val2)
Definition: gtest.h:1956
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
static size_t const kNumThreads
static once_flag flag
Definition: Random.cpp:75
std::vector< std::thread::id > threads
FOLLY_ALWAYS_INLINE void call_once(basic_once_flag< Mutex, Atom > &flag, F &&f, Args &&...args)
Definition: CallOnce.h:56
void bm_impl(CallOnceFunc &&fn, size_t iters)
TEST(FollyCallOnce, Simple)