| 93 | |
| 94 | template <typename DBD> |
| 95 | void test_doubly_buffered_data() { |
| 96 | // test doubly_buffered_data TLS limits |
| 97 | { |
| 98 | std::cout << "current PTHREAD_KEYS_MAX: " << PTHREAD_KEYS_MAX << std::endl; |
| 99 | DBD data[PTHREAD_KEYS_MAX + 1]; |
| 100 | typename DBD::ScopedPtr ptr; |
| 101 | ASSERT_EQ(0, data[PTHREAD_KEYS_MAX].Read(&ptr)); |
| 102 | ASSERT_EQ(0, ptr->x); |
| 103 | } |
| 104 | |
| 105 | DBD d; |
| 106 | { |
| 107 | typename DBD::ScopedPtr ptr; |
| 108 | ASSERT_EQ(0, d.Read(&ptr)); |
| 109 | ASSERT_EQ(0, ptr->x); |
| 110 | } |
| 111 | { |
| 112 | ASSERT_EQ(0, d.Read([](const Foo& f) { |
| 113 | ASSERT_EQ(0, f.x); |
| 114 | })); |
| 115 | ASSERT_EQ(0, d.Read(read_cb)); |
| 116 | ASSERT_EQ(0, d.Read(CallableObj())); |
| 117 | CallableObj co; |
| 118 | ASSERT_EQ(0, d.Read(co)); |
| 119 | } |
| 120 | { |
| 121 | typename DBD::ScopedPtr ptr; |
| 122 | ASSERT_EQ(0, d.Read(&ptr)); |
| 123 | ASSERT_EQ(0, ptr->x); |
| 124 | } |
| 125 | |
| 126 | d.Modify(AddN, 10); |
| 127 | d.Modify([](Foo& f, int n) -> size_t { |
| 128 | f.x += n; |
| 129 | return 1; |
| 130 | }, 10); |
| 131 | { |
| 132 | typename DBD::ScopedPtr ptr; |
| 133 | ASSERT_EQ(0, d.Read(&ptr)); |
| 134 | ASSERT_EQ(20, ptr->x); |
| 135 | } |
| 136 | } |
| 137 | |
| 138 | TEST_F(LoadBalancerTest, doubly_buffered_data) { |
| 139 | test_doubly_buffered_data<butil::DoublyBufferedData<Foo>>(); |
nothing calls this directly
no test coverage detected