blob: d09b5a4f7ee752c0f18fecc7dfd89121d8267e25 [file] [log] [blame]
Cody Schuffelen134ff032019-11-22 00:25:32 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
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#include "common/vsoc/shm/lock.h"
17
18#include <thread>
19#include <vector>
20
21#include <gtest/gtest.h>
22
23#include "common/vsoc/lib/region_view.h"
24
25#ifdef CUTTLEFISH_HOST
26using MyLock = vsoc::layout::HostLock;
27#else
28using MyLock = vsoc::layout::GuestLock;
29#endif
30
31class SimpleLocker {
32 public:
33 enum State {
34 BEFORE_EXECUTION,
35 BEFORE_LOCK,
36 IN_CRITICAL_SECTION,
37 DONE,
38 JOINED
39 };
40
41 explicit SimpleLocker(MyLock* lock)
42 : lock_(lock), thread_(&SimpleLocker::Work, this) {}
43
44 void Work() {
45 state_ = BEFORE_LOCK;
46 lock_->Lock();
47 state_ = IN_CRITICAL_SECTION;
48 InCriticalSection();
49 lock_->Unlock();
50 state_ = DONE;
51 }
52
53 void InCriticalSection() {}
54
55 void Join() {
56 thread_.join();
57 state_ = JOINED;
58 }
59
60 protected:
61 MyLock* lock_;
62 volatile State state_{BEFORE_EXECUTION};
63 std::thread thread_;
64};
65
66TEST(LockTest, Basic) {
67 // In production regions are always 0 filled on allocation. That's not
68 // true on the stack, so initialize the lock when we declare it.
69 MyLock lock{};
70 SimpleLocker a(&lock);
71 SimpleLocker b(&lock);
72 a.Join();
73 b.Join();
74}