Skip to content

Commit 93890e3

Browse files
David-Haimchausnerautoantwort
authored
Version 0.1.3 (#53)
- `resume_on` improvements - `binary_semaphore` polyfill for appleclang - enable dynamic linking on Windows - typo fixes Co-authored-by: chausner <15180557+chausner@users.noreply.github.com> Co-authored-by: autoantwort <41973254+autoantwort@users.noreply.github.com>
1 parent cbfc4a1 commit 93890e3

22 files changed

+221
-95
lines changed

CMakeLists.txt

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cmake_minimum_required(VERSION 3.16)
22

33
project(concurrencpp
4-
VERSION 0.1.2
4+
VERSION 0.1.3
55
LANGUAGES CXX)
66

77
include(cmake/coroutineOptions.cmake)
@@ -15,6 +15,7 @@ if(concurrencpp_INCLUDE_WITHOUT_SYSTEM)
1515
endif()
1616

1717
# ---- Declare library ----
18+
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
1819

1920
set(concurrencpp_sources
2021
source/task.cpp
@@ -28,6 +29,7 @@ set(concurrencpp_sources
2829
source/results/impl/shared_result_state.cpp
2930
source/results/promises.cpp
3031
source/runtime/runtime.cpp
32+
source/threads/binary_semaphore.cpp
3133
source/threads/thread.cpp
3234
source/timers/timer.cpp
3335
source/timers/timer_queue.cpp)
@@ -36,7 +38,7 @@ set(concurrencpp_headers
3638
include/concurrencpp/concurrencpp.h
3739
include/concurrencpp/errors.h
3840
include/concurrencpp/task.h
39-
include/concurrencpp/forward_declerations.h
41+
include/concurrencpp/forward_declarations.h
4042
include/concurrencpp/platform_defs.h
4143
include/concurrencpp/coroutines/coroutine.h
4244
include/concurrencpp/executors/constants.h
@@ -62,18 +64,19 @@ set(concurrencpp_headers
6264
include/concurrencpp/results/shared_result.h
6365
include/concurrencpp/results/result_awaitable.h
6466
include/concurrencpp/results/shared_result_awaitable.h
65-
include/concurrencpp/results/result_fwd_declerations.h
67+
include/concurrencpp/results/result_fwd_declarations.h
6668
include/concurrencpp/results/when_result.h
6769
include/concurrencpp/results/resume_on.h
6870
include/concurrencpp/runtime/constants.h
6971
include/concurrencpp/runtime/runtime.h
72+
include/concurrencpp/threads/binary_semaphore.h
7073
include/concurrencpp/threads/thread.h
7174
include/concurrencpp/timers/constants.h
7275
include/concurrencpp/timers/timer.h
7376
include/concurrencpp/timers/timer_queue.h
7477
include/concurrencpp/utils/bind.h)
7578

76-
add_library(concurrencpp STATIC ${concurrencpp_headers} ${concurrencpp_sources})
79+
add_library(concurrencpp ${concurrencpp_headers} ${concurrencpp_sources})
7780
add_library(concurrencpp::concurrencpp ALIAS concurrencpp)
7881

7982
target_include_directories(concurrencpp
@@ -98,11 +101,9 @@ set(concurrencpp_include_directory "${CMAKE_INSTALL_INCLUDEDIR}/${concurrencpp_d
98101

99102
install(TARGETS concurrencpp
100103
EXPORT concurrencppTargets
101-
ARCHIVE #
102-
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
103-
COMPONENT concurrencpp_Development
104-
INCLUDES #
105-
DESTINATION "${concurrencpp_include_directory}")
104+
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT concurrencpp_Development
105+
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT concurrencpp_Development
106+
INCLUDES DESTINATION "${concurrencpp_include_directory}")
106107

107108
set(concurrencpp_install_cmakedir
108109
"${CMAKE_INSTALL_LIBDIR}/cmake/${concurrencpp_directory}")

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1545,7 +1545,7 @@ Task objects apply the short-buffer-optimization (sbo) for regular, small callab
15451545
/*
15461546
Returns true if *this stores a callable. false otherwise.
15471547
*/
1548-
expliit operator bool() const noexcept;
1548+
explicit operator bool() const noexcept;
15491549
15501550
/*
15511551
Returns true if *this stores a callable,

include/concurrencpp/concurrencpp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef CONCURRENCPP_H
22
#define CONCURRENCPP_H
33

4-
#include "concurrencpp/forward_declerations.h"
4+
#include "concurrencpp/forward_declarations.h"
55
#include "concurrencpp/platform_defs.h"
66

77
#include "concurrencpp/timers/timer.h"

include/concurrencpp/executors/thread_pool_executor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
#define CONCURRENCPP_THREAD_POOL_EXECUTOR_H
33

44
#include "concurrencpp/threads/thread.h"
5+
#include "concurrencpp/threads/binary_semaphore.h"
56
#include "concurrencpp/executors/derivable_executor.h"
67

78
#include <deque>
89
#include <mutex>
9-
#include <semaphore>
1010

1111
namespace concurrencpp::details {
1212
class idle_worker_set {
@@ -49,7 +49,7 @@ namespace concurrencpp::details {
4949
const std::string m_worker_name;
5050
alignas(64) std::mutex m_lock;
5151
std::deque<task> m_public_queue;
52-
std::binary_semaphore m_semaphore;
52+
binary_semaphore m_semaphore;
5353
bool m_idle;
5454
bool m_abort;
5555
std::atomic_bool m_event_found;

include/concurrencpp/executors/worker_thread_executor.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
#define CONCURRENCPP_WORKER_THREAD_EXECUTOR_H
33

44
#include "concurrencpp/threads/thread.h"
5+
#include "concurrencpp/threads/binary_semaphore.h"
56
#include "concurrencpp/executors/derivable_executor.h"
67

78
#include <deque>
89
#include <mutex>
9-
#include <semaphore>
1010

1111
namespace concurrencpp {
1212
class alignas(64) worker_thread_executor final : public derivable_executor<worker_thread_executor> {
@@ -17,7 +17,7 @@ namespace concurrencpp {
1717
details::thread m_thread;
1818
alignas(64) std::mutex m_lock;
1919
std::deque<task> m_public_queue;
20-
std::binary_semaphore m_semaphore;
20+
details::binary_semaphore m_semaphore;
2121
std::atomic_bool m_atomic_abort;
2222
bool m_abort;
2323

include/concurrencpp/forward_declerations.h renamed to include/concurrencpp/forward_declarations.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#ifndef CONCURRENCPP_FORWARD_DECLERATIONS_H
2-
#define CONCURRENCPP_FORWARD_DECLERATIONS_H
1+
#ifndef CONCURRENCPP_FORWARD_DECLARATIONS_H
2+
#define CONCURRENCPP_FORWARD_DECLARATIONS_H
33

44
namespace concurrencpp {
55
struct null_result;
@@ -29,4 +29,4 @@ namespace concurrencpp {
2929
class manual_executor;
3030
} // namespace concurrencpp
3131

32-
#endif // FORWARD_DECLERATIONS_H
32+
#endif // FORWARD_DECLARATIONS_H

include/concurrencpp/platform_defs.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,10 @@
2525
# define CRCPP_DEBUG_MODE
2626
#endif
2727

28+
#include <exception>
29+
30+
#if defined(_LIBCPP_VERSION)
31+
# define CRCPP_LIBCPP_LIB
32+
#endif
33+
2834
#endif // PLATFORM_DEFS_H

include/concurrencpp/results/impl/consumer_context.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#define CONCURRENCPP_CONSUMER_CONTEXT_H
33

44
#include "concurrencpp/coroutines/coroutine.h"
5-
#include "concurrencpp/results/result_fwd_declerations.h"
5+
#include "concurrencpp/results/result_fwd_declarations.h"
66

77
#include <mutex>
88
#include <condition_variable>

include/concurrencpp/results/impl/lazy_result_state.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#include "concurrencpp/coroutines/coroutine.h"
55
#include "concurrencpp/results/impl/producer_context.h"
6-
#include "concurrencpp/results/result_fwd_declerations.h"
6+
#include "concurrencpp/results/result_fwd_declarations.h"
77

88
namespace concurrencpp::details {
99
struct lazy_final_awaiter : public suspend_always {

include/concurrencpp/results/impl/producer_context.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef CONCURRENCPP_PRODUCER_CONTEXT_H
22
#define CONCURRENCPP_PRODUCER_CONTEXT_H
33

4-
#include "concurrencpp/results/result_fwd_declerations.h"
4+
#include "concurrencpp/results/result_fwd_declarations.h"
55

66
#include <exception>
77

include/concurrencpp/results/impl/shared_result_state.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#define CONCURRENCPP_SHARED_RESULT_STATE_H
33

44
#include "concurrencpp/coroutines/coroutine.h"
5-
#include "concurrencpp/forward_declerations.h"
5+
#include "concurrencpp/forward_declarations.h"
66
#include "concurrencpp/results/impl/producer_context.h"
77
#include "concurrencpp/results/impl/return_value_struct.h"
88

include/concurrencpp/results/result_fwd_declerations.h renamed to include/concurrencpp/results/result_fwd_declarations.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
#ifndef CONCURRENCPP_RESULT_FWD_DECLERATIONS_H
2-
#define CONCURRENCPP_RESULT_FWD_DECLERATIONS_H
1+
#ifndef CONCURRENCPP_RESULT_FWD_DECLARATIONS_H
2+
#define CONCURRENCPP_RESULT_FWD_DECLARATIONS_H
33

4-
#include "concurrencpp/forward_declerations.h"
4+
#include "concurrencpp/forward_declarations.h"
55
#include "concurrencpp/coroutines/coroutine.h"
66

77
#include <memory>

include/concurrencpp/results/resume_on.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include "concurrencpp/executors/executor.h"
55
#include "concurrencpp/results/impl/consumer_context.h"
66

7+
#include <type_traits>
8+
79
namespace concurrencpp::details {
810
template<class executor_type>
911
class resume_on_awaitable : public suspend_always {
@@ -23,7 +25,12 @@ namespace concurrencpp::details {
2325

2426
void await_suspend(coroutine_handle<void> handle) {
2527
m_await_ctx.set_coro_handle(handle);
26-
m_executor.template post<await_via_functor>(&m_await_ctx);
28+
29+
try {
30+
m_executor.template post<await_via_functor>(&m_await_ctx);
31+
} catch (...) {
32+
// the exception caused the enqeueud task to be broken and resumed with an interrupt, no need to do anything here.
33+
}
2734
}
2835

2936
void await_resume() const {
@@ -35,6 +42,9 @@ namespace concurrencpp::details {
3542
namespace concurrencpp {
3643
template<class executor_type>
3744
auto resume_on(std::shared_ptr<executor_type> executor) {
45+
static_assert(std::is_base_of_v<concurrencpp::executor, executor_type>,
46+
"concurrencpp::resume_on() - given executor does not derive from concurrencpp::executor");
47+
3848
if (!static_cast<bool>(executor)) {
3949
throw std::invalid_argument(details::consts::k_resume_on_null_exception_err_msg);
4050
}

include/concurrencpp/runtime/constants.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace concurrencpp::details::consts {
1212

1313
constexpr static unsigned int k_concurrencpp_version_major = 0;
1414
constexpr static unsigned int k_concurrencpp_version_minor = 1;
15-
constexpr static unsigned int k_concurrencpp_version_revision = 2;
15+
constexpr static unsigned int k_concurrencpp_version_revision = 3;
1616
} // namespace concurrencpp::details::consts
1717

1818
#endif

include/concurrencpp/runtime/runtime.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#define CONCURRENCPP_RUNTIME_H
33

44
#include "concurrencpp/runtime/constants.h"
5-
#include "concurrencpp/forward_declerations.h"
5+
#include "concurrencpp/forward_declarations.h"
66

77
#include <memory>
88
#include <mutex>
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#ifndef CONCURRENCPP_BINARY_SEMAPHORE_H
2+
#define CONCURRENCPP_BINARY_SEMAPHORE_H
3+
4+
#include "concurrencpp/platform_defs.h"
5+
6+
#if defined(CRCPP_MAC_OS) && defined(CRCPP_LIBCPP_LIB)
7+
8+
# include <mutex>
9+
# include <chrono>
10+
# include <condition_variable>
11+
12+
# include <cstddef>
13+
14+
namespace concurrencpp::details {
15+
16+
class binary_semaphore {
17+
18+
private:
19+
std::mutex m_lock;
20+
std::condition_variable m_condition;
21+
bool m_is_signaled;
22+
23+
bool try_acquire_until_impl(const std::chrono::time_point<std::chrono::system_clock>& abs_time);
24+
25+
public:
26+
binary_semaphore(std::ptrdiff_t desired);
27+
28+
void release(std::ptrdiff_t update = 1);
29+
void acquire();
30+
bool try_acquire() noexcept;
31+
32+
template<class Rep, class Period>
33+
bool try_acquire_for(const std::chrono::duration<Rep, Period>& rel_time) {
34+
const auto deadline = std::chrono::system_clock::now() + rel_time;
35+
return try_acquire_until_impl(deadline);
36+
}
37+
38+
template<class Clock, class Duration>
39+
bool try_acquire_until(const std::chrono::time_point<Clock, Duration>& abs_time) {
40+
const auto src_now = Clock::now();
41+
const auto dst_now = std::chrono::system_clock::now();
42+
const auto deadline = dst_now + std::chrono::duration_cast<std::chrono::milliseconds>(abs_time - src_now);
43+
return try_acquire_until_impl(deadline);
44+
}
45+
};
46+
47+
} // namespace concurrencpp::details
48+
49+
#else
50+
51+
# include <semaphore>
52+
53+
namespace concurrencpp::details {
54+
using binary_semaphore = std::binary_semaphore;
55+
}
56+
57+
#endif
58+
59+
#endif

include/concurrencpp/timers/timer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#ifndef CONCURRENCPP_TIMER_H
22
#define CONCURRENCPP_TIMER_H
33

4-
#include "concurrencpp/forward_declerations.h"
4+
#include "concurrencpp/forward_declarations.h"
55

66
#include <atomic>
77
#include <memory>

source/threads/binary_semaphore.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#include "concurrencpp/threads/binary_semaphore.h"
2+
3+
#if defined(CRCPP_MAC_OS) && defined(CRCPP_LIBCPP_LIB)
4+
5+
# include <cassert>
6+
7+
using concurrencpp::details::binary_semaphore;
8+
9+
binary_semaphore::binary_semaphore(std::ptrdiff_t desired) : m_is_signaled(desired != 0) {}
10+
11+
void binary_semaphore::release(std::ptrdiff_t update) {
12+
auto was_signaled = false;
13+
14+
{
15+
std::unique_lock<std::mutex> lock(m_lock);
16+
was_signaled = m_is_signaled;
17+
m_is_signaled = true;
18+
}
19+
20+
if (!was_signaled) {
21+
m_condition.notify_one();
22+
}
23+
}
24+
25+
void binary_semaphore::acquire() {
26+
std::unique_lock<std::mutex> lock(m_lock);
27+
m_condition.wait(lock, [this] {
28+
return m_is_signaled;
29+
});
30+
31+
assert(m_is_signaled);
32+
m_is_signaled = false;
33+
}
34+
35+
bool binary_semaphore::try_acquire() noexcept {
36+
std::unique_lock<std::mutex> lock(m_lock);
37+
if (m_is_signaled) {
38+
m_is_signaled = false;
39+
return true;
40+
}
41+
42+
return false;
43+
}
44+
45+
bool binary_semaphore::try_acquire_until_impl(const std::chrono::time_point<std::chrono::system_clock>& abs_time) {
46+
std::unique_lock<std::mutex> lock(m_lock);
47+
m_condition.wait_until(lock, abs_time, [this] {
48+
return m_is_signaled;
49+
});
50+
51+
if (m_is_signaled) {
52+
m_is_signaled = false;
53+
return true;
54+
}
55+
56+
return false;
57+
}
58+
59+
#endif

test/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ add_test(NAME make_result_tests PATH source/tests/result_tests/make_result_tests
107107
add_test(NAME result_promise_tests PATH source/tests/result_tests/result_promise_tests.cpp)
108108
add_test(NAME when_all_tests PATH source/tests/result_tests/when_all_tests.cpp)
109109
add_test(NAME when_any_tests PATH source/tests/result_tests/when_any_tests.cpp)
110-
add_test(NAME resume_on PATH source/tests/result_tests/resume_on_tests.cpp)
110+
add_test(NAME resume_on_tests PATH source/tests/result_tests/resume_on_tests.cpp)
111111

112112
add_test(NAME coroutine_promise_tests PATH source/tests/coroutine_tests/coroutine_promise_tests.cpp)
113113
add_test(NAME coroutine_tests PATH source/tests/coroutine_tests/coroutine_tests.cpp)

0 commit comments

Comments
 (0)