diff options
-rw-r--r-- | libadhocutil/polyfill-semaphore.cpp | 43 | ||||
-rw-r--r-- | libadhocutil/polyfill-semaphore.h | 53 | ||||
-rw-r--r-- | libadhocutil/resourcePool.cpp | 6 | ||||
-rw-r--r-- | libadhocutil/resourcePool.h | 5 | ||||
-rw-r--r-- | libadhocutil/unittests/Jamfile.jam | 11 | ||||
-rw-r--r-- | libadhocutil/unittests/testResourcePool.cpp | 5 | ||||
-rw-r--r-- | libadhocutil/unittests/testSemaphore.cpp | 66 |
7 files changed, 2 insertions, 187 deletions
diff --git a/libadhocutil/polyfill-semaphore.cpp b/libadhocutil/polyfill-semaphore.cpp deleted file mode 100644 index efe5be6..0000000 --- a/libadhocutil/polyfill-semaphore.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "polyfill-semaphore.h" -#include <chrono> - -namespace AdHoc { - Semaphore::Semaphore(std::ptrdiff_t initial) : count(initial) { } - - void - Semaphore::release() - { - std::scoped_lock lock(mutex); - ++count; - condition.notify_one(); - } - - void - Semaphore::acquire() - { - std::unique_lock lock(mutex); - while (!count) { - condition.wait(lock); - } - --count; - } - - bool - Semaphore::try_acquire_for(std::chrono::milliseconds timeout) - { - std::unique_lock lock(mutex); - while (!count) { - if (condition.wait_for(lock, timeout) == std::cv_status::timeout) { - return false; - } - } - --count; - return true; - } - - std::ptrdiff_t - Semaphore::freeCount() const - { - return count; - } -} diff --git a/libadhocutil/polyfill-semaphore.h b/libadhocutil/polyfill-semaphore.h deleted file mode 100644 index 9279b26..0000000 --- a/libadhocutil/polyfill-semaphore.h +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef ADHOCUTIL_SEMAPHORE_H -#define ADHOCUTIL_SEMAPHORE_H - -// Borrowed from StackOverflow -// http://stackoverflow.com/questions/4792449/c0x-has-no-semaphores-how-to-synchronize-threads - -#include "visibility.h" -#include <chrono> -#include <condition_variable> -#include <cstddef> -#include <mutex> - -namespace AdHoc { - /// A portable semaphore with timeout support - class DLL_PUBLIC Semaphore { - public: - /// Construct a new semaphore with optional initial count. - explicit Semaphore(std::ptrdiff_t initial); - - /// Notify one waiting thread. - void release(); - /// Wait for a single count. - void acquire(); - /// Wait for a single count with timeout. - /// @param ms Timeout how long to wait. - bool try_acquire_for(std::chrono::milliseconds ms); - /// Wait for a single count with timeout. - /// @param ms Timeout how long to wait. - bool - try_acquire_for(unsigned int ms) - { - return try_acquire_for(std::chrono::milliseconds(ms)); - } - /// Wait for a single count with timeout. - /// @param ms Timeout how long to wait. - template<class Rep, class Period> - bool - try_acquire_for(const std::chrono::duration<Rep, Period> & rel_time) - { - return std::chrono::duration_cast<std::chrono::milliseconds>(rel_time); - } - - /// Free - [[nodiscard]] std::ptrdiff_t freeCount() const; - - private: - std::mutex mutex; - std::condition_variable condition; - std::ptrdiff_t count; - }; -} - -#endif diff --git a/libadhocutil/resourcePool.cpp b/libadhocutil/resourcePool.cpp index 5e9bbb0..c7980d0 100644 --- a/libadhocutil/resourcePool.cpp +++ b/libadhocutil/resourcePool.cpp @@ -1,10 +1,6 @@ #include "resourcePool.h" #include "compileTimeFormatter.h" -#ifdef __cpp_lib_semaphore -# include <semaphore> -#else -# include "polyfill-semaphore.h" -#endif +#include <semaphore> namespace AdHoc { ResourcePoolBase::ResourcePoolBase(std::ptrdiff_t maxSize, std::size_t keep_) : diff --git a/libadhocutil/resourcePool.h b/libadhocutil/resourcePool.h index 1a29dc9..495eb61 100644 --- a/libadhocutil/resourcePool.h +++ b/libadhocutil/resourcePool.h @@ -3,9 +3,7 @@ #include "c++11Helpers.h" #include "exception.h" -#ifdef __cpp_lib_semaphore -# include <semaphore> -#endif +#include <semaphore> #include "visibility.h" #include <chrono> #include <cstddef> @@ -16,7 +14,6 @@ #include <string> #include <thread> #include <tuple> -// IWYU pragma: no_include "polyfill-semaphore.h" namespace AdHoc { template<typename Resource> class ResourcePool; diff --git a/libadhocutil/unittests/Jamfile.jam b/libadhocutil/unittests/Jamfile.jam index adb2645..9547322 100644 --- a/libadhocutil/unittests/Jamfile.jam +++ b/libadhocutil/unittests/Jamfile.jam @@ -252,17 +252,6 @@ run ; run - testSemaphore.cpp - : : : - <define>BOOST_TEST_DYN_LINK - <library>..//adhocutil - <library>boost_utf - <library>pthread - : - testSemaphore - ; - -run testException.cpp : : : <define>BOOST_TEST_DYN_LINK diff --git a/libadhocutil/unittests/testResourcePool.cpp b/libadhocutil/unittests/testResourcePool.cpp index cecfb46..79c53ad 100644 --- a/libadhocutil/unittests/testResourcePool.cpp +++ b/libadhocutil/unittests/testResourcePool.cpp @@ -4,11 +4,6 @@ #include "c++11Helpers.h" #include "lockHelpers.h" #include "resourcePool.impl.h" -#ifdef __cpp_lib_semaphore -# include <semaphore> -#else -# include "polyfill-semaphore.h" // IWYU pragma: keep -#endif #include <atomic> #include <list> #include <map> diff --git a/libadhocutil/unittests/testSemaphore.cpp b/libadhocutil/unittests/testSemaphore.cpp deleted file mode 100644 index 999cff3..0000000 --- a/libadhocutil/unittests/testSemaphore.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#define BOOST_TEST_MODULE Semaphore -#include <boost/test/unit_test.hpp> - -#include <polyfill-semaphore.h> -#include <thread> -#include <unistd.h> - -BOOST_AUTO_TEST_CASE(addRemoveOne) -{ - AdHoc::Semaphore s {0}; - s.release(); - s.acquire(); -} - -BOOST_AUTO_TEST_CASE(initial) -{ - AdHoc::Semaphore s(2); - s.acquire(); - s.acquire(); - // cppcheck-suppress assertWithSideEffect - BOOST_REQUIRE_EQUAL(false, s.try_acquire_for(0)); -} - -BOOST_AUTO_TEST_CASE(addRemoveSome) -{ - AdHoc::Semaphore s {0}; - BOOST_REQUIRE_EQUAL(0, s.freeCount()); - s.release(); - BOOST_REQUIRE_EQUAL(1, s.freeCount()); - s.release(); - BOOST_REQUIRE_EQUAL(2, s.freeCount()); - s.release(); - BOOST_REQUIRE_EQUAL(3, s.freeCount()); - s.acquire(); - BOOST_REQUIRE_EQUAL(2, s.freeCount()); - s.acquire(); - BOOST_REQUIRE_EQUAL(1, s.freeCount()); - s.acquire(); - BOOST_REQUIRE_EQUAL(0, s.freeCount()); -} - -BOOST_AUTO_TEST_CASE(addRemoveTimeOut) -{ - AdHoc::Semaphore s {0}; - s.release(); - s.acquire(); - // cppcheck-suppress assertWithSideEffect - BOOST_REQUIRE_EQUAL(false, s.try_acquire_for(100)); - // cppcheck-suppress assertWithSideEffect - BOOST_REQUIRE_EQUAL(false, s.try_acquire_for(0)); -} - -BOOST_AUTO_TEST_CASE(addRemoveWait) -{ - AdHoc::Semaphore s {0}; - s.release(); - s.acquire(); - std::thread th([&s]() { - usleep(100000); - s.release(); - }); - // cppcheck-suppress assertWithSideEffect - BOOST_REQUIRE_EQUAL(false, s.try_acquire_for(1)); - s.acquire(); - th.join(); -} |