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) {}