]> git.proxmox.com Git - ceph.git/blob - ceph/src/test/common/test_lockdep.cc
import 15.2.5
[ceph.git] / ceph / src / test / common / test_lockdep.cc
1 // -*- mode:C; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #include "gtest/gtest.h"
5
6 #include "common/ceph_argparse.h"
7 #include "common/ceph_context.h"
8 #include "common/ceph_mutex.h"
9 #include "common/common_init.h"
10 #include "common/lockdep.h"
11 #include "include/util.h"
12 #include "include/coredumpctl.h"
13 #include "log/Log.h"
14
15 class lockdep : public ::testing::Test
16 {
17 protected:
18 void SetUp() override {
19 #ifndef CEPH_DEBUG_MUTEX
20 GTEST_SKIP() << "WARNING: CEPH_DEBUG_MUTEX is not defined, lockdep will not work";
21 #endif
22 CephInitParameters params(CEPH_ENTITY_TYPE_CLIENT);
23 cct = common_preinit(params, CODE_ENVIRONMENT_UTILITY,
24 CINIT_FLAG_NO_DEFAULT_CONFIG_FILE);
25 cct->_conf->cluster = "ceph";
26 cct->_conf.set_val("lockdep", "true");
27 cct->_conf.apply_changes(nullptr);
28 ASSERT_TRUE(g_lockdep);
29 }
30 void TearDown() final
31 {
32 if (cct) {
33 cct->put();
34 cct = nullptr;
35 }
36 }
37 protected:
38 CephContext *cct = nullptr;
39 };
40
41 TEST_F(lockdep, abba)
42 {
43 ceph::mutex a(ceph::make_mutex("a")), b(ceph::make_mutex("b"));
44 a.lock();
45 ASSERT_TRUE(ceph_mutex_is_locked(a));
46 ASSERT_TRUE(ceph_mutex_is_locked_by_me(a));
47 b.lock();
48 ASSERT_TRUE(ceph_mutex_is_locked(b));
49 ASSERT_TRUE(ceph_mutex_is_locked_by_me(b));
50 a.unlock();
51 b.unlock();
52
53 b.lock();
54 PrCtl unset_dumpable;
55 EXPECT_DEATH(a.lock(), "");
56 b.unlock();
57 }
58
59 TEST_F(lockdep, recursive)
60 {
61 ceph::mutex a(ceph::make_mutex("a"));
62 a.lock();
63 PrCtl unset_dumpable;
64 EXPECT_DEATH(a.lock(), "");
65 a.unlock();
66
67 ceph::recursive_mutex b(ceph::make_recursive_mutex("b"));
68 b.lock();
69 ASSERT_TRUE(ceph_mutex_is_locked(b));
70 ASSERT_TRUE(ceph_mutex_is_locked_by_me(b));
71 b.lock();
72 b.unlock();
73 b.unlock();
74 }