github.com/igggame/nebulas-go@v2.1.0+incompatible/nbre/test/common/ipc/itest_bookkeeper.cpp (about) 1 // Copyright (C) 2018 go-nebulas authors 2 // 3 // This file is part of the go-nebulas library. 4 // 5 // the go-nebulas library is free software: you can redistribute it and/or 6 // modify 7 // it under the terms of the GNU General Public License as published by 8 // the Free Software Foundation, either version 3 of the License, or 9 // (at your option) any later version. 10 // 11 // the go-nebulas library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 // 16 // You should have received a copy of the GNU General Public License 17 // along with the go-nebulas library. If not, see 18 // <http://www.gnu.org/licenses/>. 19 // 20 #include "common/ipc/shm_bookkeeper.h" 21 #include "fs/util.h" 22 #include "test/common/ipc/ipc_test.h" 23 #include <chrono> 24 #include <exception> 25 #include <thread> 26 27 std::string user_name = neb::fs::get_user_name(); 28 29 auto t1_str = user_name + "t1"; 30 auto t2_str = user_name + "t2"; 31 auto t3_str = user_name + "t3"; 32 auto bk_str = user_name + "test_bookkeeper_simple"; 33 const char *t1_name = t1_str.c_str(); 34 const char *t2_name = t2_str.c_str(); 35 const char *t3_name = t3_str.c_str(); 36 static const char *bk_name = bk_str.c_str(); 37 38 IPC_PRELUDE(test_bookkeeper_simple) { 39 boost::interprocess::named_mutex::remove(t1_name); 40 boost::interprocess::named_semaphore::remove(t2_name); 41 boost::interprocess::named_semaphore::remove(t3_name); 42 boost::interprocess::shared_memory_object::remove(bk_name); 43 } 44 45 IPC_SERVER(test_bookkeeper_simple) { 46 47 neb::ipc::internal::shm_bookkeeper sb(bk_name); 48 auto mutex = sb.acquire_named_mutex(t1_name); 49 bool v = mutex->try_lock(); 50 IPC_EXPECT(v); 51 auto sema = sb.acquire_named_semaphore(t2_name); 52 auto sema2 = sb.acquire_named_semaphore(t3_name); 53 sema->post(); 54 sema2->wait(); 55 sb.release_named_mutex(t1_name); 56 sb.release_named_semaphore(t2_name); 57 sb.release_named_semaphore(t3_name); 58 } 59 60 IPC_CLIENT(test_bookkeeper_simple) { 61 neb::ipc::internal::shm_bookkeeper sb(bk_name); 62 auto sema = sb.acquire_named_semaphore(t2_name); 63 auto mutex = sb.acquire_named_mutex(t1_name); 64 sema->wait(); 65 bool v = mutex->try_lock(); 66 IPC_EXPECT(v == false); 67 auto sema2 = sb.acquire_named_semaphore(t3_name); 68 sema2->post(); 69 sb.release_named_mutex(t1_name); 70 sb.release_named_semaphore(t2_name); 71 sb.release_named_semaphore(t3_name); 72 } 73 auto tc1_str = (user_name + "tc1"); 74 auto tc2_str = (user_name + "tc2"); 75 auto tc3_str = (user_name + "tc3"); 76 auto c1_str = (user_name + "c1"); 77 auto bkc_str = (user_name + "test_bookkeeper_simple_cond"); 78 79 const char *tc1_name = tc1_str.c_str(); 80 const char *tc2_name = tc2_str.c_str(); 81 const char *tc3_name = tc3_str.c_str(); 82 const char *c1_name = c1_str.c_str(); 83 const char *bkc_name = bkc_str.c_str(); 84 85 IPC_PRELUDE(test_bookkeeper_simple_cond) { 86 boost::interprocess::named_mutex::remove(tc1_name); 87 boost::interprocess::named_semaphore::remove(tc2_name); 88 boost::interprocess::named_semaphore::remove(tc3_name); 89 boost::interprocess::shared_memory_object::remove(bkc_name); 90 } 91 IPC_SERVER(test_bookkeeper_simple_cond) { 92 neb::ipc::internal::shm_bookkeeper sb(bkc_name); 93 auto mutex = sb.acquire_named_mutex(tc1_name); 94 bool v = mutex->try_lock(); 95 IPC_EXPECT(v); 96 mutex->unlock(); 97 boost::interprocess::scoped_lock<boost::interprocess::named_mutex> _l( 98 *mutex.get()); 99 auto sema = sb.acquire_named_semaphore(tc2_name); 100 auto sema2 = sb.acquire_named_semaphore(tc3_name); 101 auto cond = sb.acquire_named_condition(c1_name); 102 sema->post(); 103 cond->wait(_l); 104 sema2->wait(); 105 sb.release_named_mutex(tc1_name); 106 sb.release_named_semaphore(tc2_name); 107 sb.release_named_semaphore(tc3_name); 108 sb.release_named_condition(c1_name); 109 } 110 111 IPC_CLIENT(test_bookkeeper_simple_cond) { 112 neb::ipc::internal::shm_bookkeeper sb(bkc_name); 113 auto sema = sb.acquire_named_semaphore(tc2_name); 114 auto cond = sb.acquire_named_condition(c1_name); 115 sema->wait(); 116 auto mutex = sb.acquire_named_mutex(tc1_name); 117 cond->notify_one(); 118 auto sema2 = sb.acquire_named_semaphore(tc3_name); 119 sema2->post(); 120 sb.release_named_mutex(tc1_name); 121 sb.release_named_semaphore(tc2_name); 122 sb.release_named_semaphore(tc3_name); 123 sb.release_named_condition(c1_name); 124 } 125 126 IPC_PRELUDE(test_bookkeeper_release) { 127 boost::interprocess::named_mutex::remove("tr1"); 128 boost::interprocess::named_semaphore::remove("tr2"); 129 boost::interprocess::named_condition::remove("cr1"); 130 boost::interprocess::shared_memory_object::remove( 131 "test_bookkeeper_simple_release"); 132 } 133 134 IPC_SERVER(test_bookkeeper_release) { 135 136 neb::ipc::internal::shm_bookkeeper sb("test_bookkeeper_simple_release"); 137 auto mutex = sb.acquire_named_mutex("tr1"); 138 auto sema = sb.acquire_named_semaphore("tr2"); 139 auto cond = sb.acquire_named_condition("cr1"); 140 sb.release_named_mutex("tr1"); 141 sb.release_named_semaphore("tr2"); 142 sb.release_named_condition("cr1"); 143 144 IPC_EXPECT(neb::ipc::check_exists<boost::interprocess::named_mutex>("tr1") == 145 false); 146 IPC_EXPECT(neb::ipc::check_exists<boost::interprocess::named_condition>( 147 "cr1") == false); 148 IPC_EXPECT(neb::ipc::check_exists<boost::interprocess::named_semaphore>( 149 "tr2") == false); 150 } 151 152 IPC_CLIENT(test_bookkeeper_release) {}