blob: d09b5a4f7ee752c0f18fecc7dfd89121d8267e25 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "common/vsoc/shm/lock.h"
#include <thread>
#include <vector>
#include <gtest/gtest.h>
#include "common/vsoc/lib/region_view.h"
#ifdef CUTTLEFISH_HOST
using MyLock = vsoc::layout::HostLock;
#else
using MyLock = vsoc::layout::GuestLock;
#endif
class SimpleLocker {
public:
enum State {
BEFORE_EXECUTION,
BEFORE_LOCK,
IN_CRITICAL_SECTION,
DONE,
JOINED
};
explicit SimpleLocker(MyLock* lock)
: lock_(lock), thread_(&SimpleLocker::Work, this) {}
void Work() {
state_ = BEFORE_LOCK;
lock_->Lock();
state_ = IN_CRITICAL_SECTION;
InCriticalSection();
lock_->Unlock();
state_ = DONE;
}
void InCriticalSection() {}
void Join() {
thread_.join();
state_ = JOINED;
}
protected:
MyLock* lock_;
volatile State state_{BEFORE_EXECUTION};
std::thread thread_;
};
TEST(LockTest, Basic) {
// In production regions are always 0 filled on allocation. That's not
// true on the stack, so initialize the lock when we declare it.
MyLock lock{};
SimpleLocker a(&lock);
SimpleLocker b(&lock);
a.Join();
b.Join();
}