2 * Copyright 2016 Facebook, Inc.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #include <folly/AtomicStruct.h>
19 #include <gtest/gtest.h>
21 using namespace folly;
28 TEST(AtomicStruct, two_by_32) {
29 AtomicStruct<TwoBy32> a(TwoBy32{ 10, 20 });
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 });
45 EXPECT_EQ(av.left, 90);
46 AtomicStruct<TwoBy32> c;
48 EXPECT_EQ(c.load().right, 40);
51 TEST(AtomicStruct, size_selection) {
52 struct S1 { char x[1]; };
53 struct S2 { char x[2]; };
54 struct S3 { char x[3]; };
55 struct S4 { char x[4]; };
56 struct S5 { char x[5]; };
57 struct S6 { char x[6]; };
58 struct S7 { char x[7]; };
59 struct S8 { char x[8]; };
61 EXPECT_EQ(sizeof(AtomicStruct<S1>), 1);
62 EXPECT_EQ(sizeof(AtomicStruct<S2>), 2);
63 EXPECT_EQ(sizeof(AtomicStruct<S3>), 4);
64 EXPECT_EQ(sizeof(AtomicStruct<S4>), 4);
65 EXPECT_EQ(sizeof(AtomicStruct<S5>), 8);
66 EXPECT_EQ(sizeof(AtomicStruct<S6>), 8);
67 EXPECT_EQ(sizeof(AtomicStruct<S7>), 8);
68 EXPECT_EQ(sizeof(AtomicStruct<S8>), 8);