@@ -13,7 +13,7 @@ namespace detail {
13
13
struct waiter_helper {
14
14
15
15
struct wait_counter {
16
- std::atomic<unsigned > waiting_ { 0 };
16
+ std::atomic<long > waiting_ { 0 };
17
17
long counter_ = 0 ;
18
18
};
19
19
@@ -40,7 +40,7 @@ struct waiter_helper {
40
40
{
41
41
IPC_UNUSED_ auto guard = ctrl.get_lock ();
42
42
if (!std::forward<F>(pred)()) return true ;
43
- counter.counter_ += 1 ;
43
+ counter.counter_ = counter. waiting_ . load (std::memory_order_relaxed) ;
44
44
}
45
45
mtx.unlock ();
46
46
@@ -69,6 +69,11 @@ struct waiter_helper {
69
69
return ret;
70
70
}
71
71
72
+ template <typename Ctrl>
73
+ static void clear_handshake (Ctrl & ctrl) {
74
+ while (ctrl.handshake_wait (0 )) ;
75
+ }
76
+
72
77
template <typename Ctrl>
73
78
static bool notify (Ctrl & ctrl) {
74
79
auto & counter = ctrl.counter ();
@@ -77,6 +82,7 @@ struct waiter_helper {
77
82
}
78
83
bool ret = true ;
79
84
IPC_UNUSED_ auto guard = ctrl.get_lock ();
85
+ clear_handshake (ctrl);
80
86
if (counter.counter_ > 0 ) {
81
87
ret = ctrl.sema_post (1 );
82
88
counter.counter_ -= 1 ;
@@ -93,11 +99,13 @@ struct waiter_helper {
93
99
}
94
100
bool ret = true ;
95
101
IPC_UNUSED_ auto guard = ctrl.get_lock ();
102
+ clear_handshake (ctrl);
96
103
if (counter.counter_ > 0 ) {
97
104
ret = ctrl.sema_post (counter.counter_ );
105
+ auto tm = default_timeout / counter.counter_ ;
98
106
do {
99
107
counter.counter_ -= 1 ;
100
- ret = ret && ctrl.handshake_wait (default_timeout );
108
+ ret = ret && ctrl.handshake_wait (tm );
101
109
} while (counter.counter_ > 0 );
102
110
}
103
111
return ret;
@@ -116,6 +124,7 @@ struct waiter_helper {
116
124
}
117
125
bool ret = true ;
118
126
IPC_UNUSED_ auto guard = ctrl.get_lock ();
127
+ clear_handshake (ctrl);
119
128
if (counter.counter_ > 0 ) {
120
129
ret = ctrl.sema_post (counter.counter_ );
121
130
counter.counter_ -= 1 ;
0 commit comments