]> git.proxmox.com Git - ceph.git/blame - ceph/src/test/common/test_mutex_debug.cc
import quincy beta 17.1.0
[ceph.git] / ceph / src / test / common / test_mutex_debug.cc
CommitLineData
7c673cae
FG
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 &smarttab
3/*
4 * Ceph - scalable distributed file system
5 *
6 * Copyright (C) 2011 New Dream Network
7 *
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public
10 * License version 2, as published by the Free Software
11 * Foundation. See file COPYING.
12 *
13 */
14
15#include <future>
16#include <mutex>
17#include <thread>
18
19#include "common/mutex_debug.h"
20
21#include "gtest/gtest.h"
22
23
24template<typename Mutex>
25static bool test_try_lock(Mutex* m) {
26 if (!m->try_lock())
27 return false;
28 m->unlock();
29 return true;
30}
31
32template<typename Mutex>
33static void test_lock() {
11fdf7f2 34 Mutex m("mutex");
7c673cae
FG
35 auto ttl = &test_try_lock<Mutex>;
36
37 m.lock();
38 ASSERT_TRUE(m.is_locked());
39 auto f1 = std::async(std::launch::async, ttl, &m);
40 ASSERT_FALSE(f1.get());
41
42 ASSERT_TRUE(m.is_locked());
43 ASSERT_TRUE(!!m);
44
45 m.unlock();
46 ASSERT_FALSE(m.is_locked());
47 ASSERT_FALSE(!!m);
48
49 auto f3 = std::async(std::launch::async, ttl, &m);
50 ASSERT_TRUE(f3.get());
51
52 ASSERT_FALSE(m.is_locked());
53 ASSERT_FALSE(!!m);
54}
55
56TEST(MutexDebug, Lock) {
57 test_lock<ceph::mutex_debug>();
58}
59
60TEST(MutexDebug, NotRecursive) {
11fdf7f2 61 ceph::mutex_debug m("foo");
7c673cae
FG
62 auto ttl = &test_try_lock<mutex_debug>;
63
64 ASSERT_NO_THROW(m.lock());
65 ASSERT_TRUE(m.is_locked());
66 ASSERT_FALSE(std::async(std::launch::async, ttl, &m).get());
67
68 ASSERT_THROW(m.lock(), std::system_error);
69 ASSERT_TRUE(m.is_locked());
70 ASSERT_FALSE(std::async(std::launch::async, ttl, &m).get());
71
72 ASSERT_NO_THROW(m.unlock());
73 ASSERT_FALSE(m.is_locked());
74 ASSERT_TRUE(std::async(std::launch::async, ttl, &m).get());
75}
76
77TEST(MutexRecursiveDebug, Lock) {
78 test_lock<ceph::mutex_recursive_debug>();
79}
80
81
82TEST(MutexRecursiveDebug, Recursive) {
11fdf7f2 83 ceph::mutex_recursive_debug m("m");
7c673cae
FG
84 auto ttl = &test_try_lock<mutex_recursive_debug>;
85
86 ASSERT_NO_THROW(m.lock());
87 ASSERT_TRUE(m.is_locked());
88 ASSERT_FALSE(std::async(std::launch::async, ttl, &m).get());
89
90 ASSERT_NO_THROW(m.lock());
91 ASSERT_TRUE(m.is_locked());
92 ASSERT_FALSE(std::async(std::launch::async, ttl, &m).get());
93
94 ASSERT_NO_THROW(m.unlock());
95 ASSERT_TRUE(m.is_locked());
96 ASSERT_FALSE(std::async(std::launch::async, ttl, &m).get());
97
98 ASSERT_NO_THROW(m.unlock());
99 ASSERT_FALSE(m.is_locked());
100 ASSERT_TRUE(std::async(std::launch::async, ttl, &m).get());
101}