1 | /* |
2 | * Copyright 2013-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 <folly/synchronization/AtomicStruct.h> |
18 | |
19 | #include <folly/portability/GTest.h> |
20 | |
21 | using namespace folly; |
22 | |
23 | struct TwoBy32 { |
24 | uint32_t left; |
25 | uint32_t right; |
26 | }; |
27 | |
28 | TEST(AtomicStruct, two_by_32) { |
29 | AtomicStruct<TwoBy32> a(TwoBy32{10, 20}); |
30 | TwoBy32 av = a; |
31 | EXPECT_EQ(av.left, 10); |
32 | EXPECT_EQ(av.right, 20); |
33 | EXPECT_TRUE(a.compare_exchange_strong(av, TwoBy32{30, 40})); |
34 | EXPECT_FALSE(a.compare_exchange_weak(av, TwoBy32{31, 41})); |
35 | EXPECT_EQ(av.left, 30); |
36 | EXPECT_TRUE(a.is_lock_free()); |
37 | auto b = a.exchange(TwoBy32{50, 60}); |
38 | EXPECT_EQ(b.left, 30); |
39 | EXPECT_EQ(b.right, 40); |
40 | EXPECT_EQ(a.load().left, 50); |
41 | a = TwoBy32{70, 80}; |
42 | EXPECT_EQ(a.load().right, 80); |
43 | a.store(TwoBy32{90, 100}); |
44 | av = a; |
45 | EXPECT_EQ(av.left, 90); |
46 | AtomicStruct<TwoBy32> c; |
47 | c = b; |
48 | EXPECT_EQ(c.load().right, 40); |
49 | } |
50 | |
51 | template <size_t I> |
52 | struct S { |
53 | char x[I]; |
54 | }; |
55 | |
56 | TEST(AtomicStruct, size_selection) { |
57 | EXPECT_EQ(sizeof(AtomicStruct<S<1>>), 1); |
58 | EXPECT_EQ(sizeof(AtomicStruct<S<2>>), 2); |
59 | EXPECT_EQ(sizeof(AtomicStruct<S<3>>), 4); |
60 | EXPECT_EQ(sizeof(AtomicStruct<S<4>>), 4); |
61 | EXPECT_EQ(sizeof(AtomicStruct<S<5>>), 8); |
62 | EXPECT_EQ(sizeof(AtomicStruct<S<6>>), 8); |
63 | EXPECT_EQ(sizeof(AtomicStruct<S<7>>), 8); |
64 | EXPECT_EQ(sizeof(AtomicStruct<S<8>>), 8); |
65 | } |
66 | |