diff --git a/build/src.pro b/build/src.pro index 00292f4..17c2765 100644 --- a/build/src.pro +++ b/build/src.pro @@ -1,9 +1,11 @@ TEMPLATE = lib TARGET = ipc -CONFIG += c++14 CONFIG -= qt +msvc:QMAKE_CXXFLAGS += /std:c++17 +else:CONFIG += c++1z + DEFINES += __IPC_LIBRARY__ DESTDIR = ../output diff --git a/build/test.pro b/build/test.pro index 0a4a077..aa06536 100644 --- a/build/test.pro +++ b/build/test.pro @@ -2,9 +2,12 @@ TEMPLATE = app QT += core testlib QT -= gui -CONFIG += console c++14 +CONFIG += console CONFIG -= app_bundle +msvc:QMAKE_CXXFLAGS += /std:c++17 +else:CONFIG += c++1z + DESTDIR = ../output INCLUDEPATH += \ diff --git a/include/rw_lock.h b/include/rw_lock.h index ca0b4f0..43d08b8 100644 --- a/include/rw_lock.h +++ b/include/rw_lock.h @@ -14,7 +14,21 @@ class rw_lock { }; public: - void r_lock(void) { + void lock(void) { + while (1) { + std::size_t expected = 0; + if (lc_.compare_exchange_weak(expected, w_flag, std::memory_order_acq_rel)) { + break; + } + std::this_thread::yield(); + } + } + + void unlock(void) { + lc_.store(0, std::memory_order_release); + } + + void lock_shared(void) { while(1) { std::size_t old = lc_.load(std::memory_order_relaxed); std::size_t unlocked = old + 1; @@ -27,23 +41,9 @@ public: } } - void r_unlock(void) { + void unlock_shared(void) { lc_.fetch_sub(1, std::memory_order_release); } - - void w_lock(void) { - while (1) { - std::size_t expected = 0; - if (lc_.compare_exchange_weak(expected, w_flag, std::memory_order_acq_rel)) { - break; - } - std::this_thread::yield(); - } - } - - void w_unlock(void) { - lc_.store(0, std::memory_order_release); - } }; } // namespace ipc diff --git a/test/test_ipc.cpp b/test/test_ipc.cpp index cd36f3b..eecc1ca 100644 --- a/test/test_ipc.cpp +++ b/test/test_ipc.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include "ipc.h" #include "rw_lock.h" @@ -17,22 +19,12 @@ class Unit : public TestSuite { } private slots: - void test_send_recv(); void test_rw_lock(); + void test_send_recv(); } unit__; #include "test_ipc.moc" -void Unit::test_send_recv() { -// auto h = ipc::connect("my-ipc"); -// QVERIFY(h != nullptr); -// char data[] = "hello ipc!"; -// QVERIFY(ipc::send(h, data, sizeof(data))); -// auto got = ipc::recv(h); -// QCOMPARE((char*)got.data(), data); -// ipc::disconnect(h); -} - void Unit::test_rw_lock() { std::thread r_trd[4]; std::thread w_trd[4]; @@ -46,11 +38,12 @@ void Unit::test_rw_lock() { std::size_t cnt = 0; while (1) { int x = -1; - lc.r_lock(); - if (cnt < datas.size()) { - x = datas[cnt]; + { + [[maybe_unused]] std::shared_lock guard { lc }; + if (cnt < datas.size()) { + x = datas[cnt]; + } } - lc.r_unlock(); if (x == 0) break; // quit if (x != -1) { seq.push_back(x); @@ -70,18 +63,18 @@ void Unit::test_rw_lock() { for (auto& t : w_trd) { t = std::thread([&] { for (int i = 1; i <= 100; ++i) { - lc.w_lock(); + lc.lock(); datas.push_back(i); - lc.w_unlock(); + lc.unlock(); std::this_thread::yield(); } }); } for (auto& t : w_trd) t.join(); - lc.w_lock(); + lc.lock(); datas.push_back(0); - lc.w_unlock(); + lc.unlock(); for (auto& t : r_trd) t.join(); @@ -91,4 +84,14 @@ void Unit::test_rw_lock() { std::cout << std::endl; } +void Unit::test_send_recv() { +// auto h = ipc::connect("my-ipc"); +// QVERIFY(h != nullptr); +// char data[] = "hello ipc!"; +// QVERIFY(ipc::send(h, data, sizeof(data))); +// auto got = ipc::recv(h); +// QCOMPARE((char*)got.data(), data); +// ipc::disconnect(h); +} + } // internal-linkage