@@ -244,21 +244,25 @@ struct basic_queue_impl {
244
244
}
245
245
246
246
247
- auto generic_add (auto && add) -> void {
248
- generic_add_impl (lock_type (m_mutex), add);
247
+ auto generic_add (auto const add) -> void {
248
+ auto lock = lock_type (m_mutex);
249
+ derived ().handle_add (m_container, lock);
250
+ generic_add_impl (std::move (lock), add);
249
251
}
250
252
251
- auto generic_non_blocking_add (auto && add) -> bool {
253
+ auto generic_non_blocking_add (auto const add) -> bool {
252
254
auto lock = lock_type (m_mutex, std::try_to_lock);
253
255
if (!lock.owns_lock ()) {
254
256
return false ;
255
257
}
258
+ if (!derived ().handle_non_blocking_add (m_container, lock)) {
259
+ return false ;
260
+ }
256
261
generic_add_impl (std::move (lock), add);
257
262
return true ;
258
263
}
259
264
260
- auto generic_add_impl (lock_type lock, auto && add) -> void {
261
- derived ().handle_add (m_container, lock);
265
+ auto generic_add_impl (lock_type lock, auto const add) -> void {
262
266
auto const was_empty = containers::is_empty (m_container);
263
267
add ();
264
268
lock.unlock ();
@@ -362,6 +366,9 @@ struct basic_unbounded_queue : private basic_queue_impl<Container, Mutex, basic_
362
366
363
367
auto handle_add (Container &, std::unique_lock<Mutex> &) -> void {
364
368
}
369
+ auto handle_non_blocking_add (Container &, std::unique_lock<Mutex> &) -> bool {
370
+ return true ;
371
+ }
365
372
auto handle_remove_all (containers::range_size_t <Container>) -> void {
366
373
}
367
374
auto handle_remove_one (containers::range_size_t <Container>) -> void {
@@ -426,6 +433,9 @@ struct basic_blocking_queue : private basic_queue_impl<Container, Mutex, basic_b
426
433
[&]{ return containers::size (queue) < m_max_size; }
427
434
);
428
435
}
436
+ auto handle_non_blocking_add (Container & queue, std::unique_lock<Mutex> &) -> bool {
437
+ return containers::size (queue) < m_max_size;
438
+ }
429
439
auto handle_remove_all (containers::range_size_t <Container> const previous_size) -> void {
430
440
if (previous_size >= max_size ()) {
431
441
m_notify_removal.notify_all ();
0 commit comments