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
21using namespace folly;
22
23struct TwoBy32 {
24 uint32_t left;
25 uint32_t right;
26};
27
28TEST(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
51template <size_t I>
52struct S {
53 char x[I];
54};
55
56TEST(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