]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/thread/test/sync/mutual_exclusion/sync_bounded_queue/single_thread_pass.cpp
1 // Copyright (C) 2013 Vicente J. Botet Escriba
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 // <boost/thread/sync_bounded_queue.hpp>
8 // class sync_bounded_queue<T>
10 // sync_bounded_queue();
12 #define BOOST_THREAD_VERSION 4
13 //#define BOOST_THREAD_QUEUE_DEPRECATE_OLD
15 #include <boost/thread/sync_bounded_queue.hpp>
17 #include <boost/detail/lightweight_test.hpp>
21 BOOST_THREAD_MOVABLE_ONLY(non_copyable
)
25 non_copyable(int v
) : val(v
){}
26 non_copyable(BOOST_RV_REF(non_copyable
) x
): val(x
.val
) {}
27 non_copyable
& operator=(BOOST_RV_REF(non_copyable
) x
) { val
=x
.val
; return *this; }
28 bool operator==(non_copyable
const& x
) const {return val
==x
.val
;}
29 template <typename OSTREAM
>
30 friend OSTREAM
& operator <<(OSTREAM
& os
, non_copyable
const&x
)
43 // default queue invariants
44 boost::sync_bounded_queue
<int> q(2);
45 BOOST_TEST(q
.empty());
46 BOOST_TEST(! q
.full());
47 BOOST_TEST_EQ(q
.size(), 0u);
48 BOOST_TEST_EQ(q
.capacity(), 2u);
49 BOOST_TEST(! q
.closed());
51 #ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
53 // empty queue try_pull fails
54 boost::sync_bounded_queue
<int> q(2);
56 BOOST_TEST(! q
.try_pull(i
));
57 BOOST_TEST(q
.empty());
58 BOOST_TEST(! q
.full());
59 BOOST_TEST_EQ(q
.size(), 0u);
60 BOOST_TEST(! q
.closed());
63 // empty queue try_pull fails
64 boost::sync_bounded_queue
<int> q(2);
65 BOOST_TEST(! q
.try_pull());
66 BOOST_TEST(q
.empty());
67 BOOST_TEST(! q
.full());
68 BOOST_TEST_EQ(q
.size(), 0u);
69 BOOST_TEST(! q
.closed());
72 // empty queue push rvalue succeeds
73 boost::sync_bounded_queue
<int> q(2);
75 BOOST_TEST(! q
.empty());
76 BOOST_TEST(! q
.full());
77 BOOST_TEST_EQ(q
.size(), 1u);
78 BOOST_TEST(! q
.closed());
81 // empty queue push rvalue succeeds
82 boost::sync_bounded_queue
<non_copyable
> q(2);
84 q
.push(boost::move(nc
));
85 BOOST_TEST(! q
.empty());
86 BOOST_TEST(! q
.full());
87 BOOST_TEST_EQ(q
.size(), 1u);
88 BOOST_TEST(! q
.closed());
91 // empty queue push rvalue succeeds
92 boost::sync_bounded_queue
<int> q(3);
94 BOOST_TEST_EQ(q
.size(), 1u);
96 BOOST_TEST_EQ(q
.size(), 2u);
98 BOOST_TEST_EQ(q
.size(), 3u);
99 BOOST_TEST(! q
.empty());
100 BOOST_TEST( q
.full());
101 BOOST_TEST(! q
.closed());
104 // empty queue push value succeeds
105 boost::sync_bounded_queue
<int> q(2);
108 BOOST_TEST(! q
.empty());
109 BOOST_TEST(! q
.full());
110 BOOST_TEST_EQ(q
.size(), 1u);
111 BOOST_TEST(! q
.closed());
114 // empty queue try_push rvalue succeeds
115 boost::sync_bounded_queue
<int> q(2);
116 BOOST_TEST(q
.try_push(1));
117 BOOST_TEST(! q
.empty());
118 BOOST_TEST(! q
.full());
119 BOOST_TEST_EQ(q
.size(), 1u);
120 BOOST_TEST(! q
.closed());
123 // empty queue try_push rvalue succeeds
124 boost::sync_bounded_queue
<non_copyable
> q(2);
126 BOOST_TEST(q
.try_push(boost::move(nc
)));
127 BOOST_TEST(! q
.empty());
128 BOOST_TEST(! q
.full());
129 BOOST_TEST_EQ(q
.size(), 1u);
130 BOOST_TEST(! q
.closed());
133 // empty queue try_push value succeeds
134 boost::sync_bounded_queue
<int> q(2);
136 BOOST_TEST(q
.try_push(i
));
137 BOOST_TEST(! q
.empty());
138 BOOST_TEST(! q
.full());
139 BOOST_TEST_EQ(q
.size(), 1u);
140 BOOST_TEST(! q
.closed());
143 // empty queue try_push rvalue succeeds
144 boost::sync_bounded_queue
<int> q(2);
145 BOOST_TEST(q
.try_push(boost::no_block
, 1));
146 BOOST_TEST(! q
.empty());
147 BOOST_TEST(! q
.full());
148 BOOST_TEST_EQ(q
.size(), 1u);
149 BOOST_TEST(! q
.closed());
152 // empty queue try_push rvalue succeeds
153 boost::sync_bounded_queue
<non_copyable
> q(2);
155 BOOST_TEST(q
.try_push(boost::no_block
, boost::move(nc
)));
156 BOOST_TEST(! q
.empty());
157 BOOST_TEST(! q
.full());
158 BOOST_TEST_EQ(q
.size(), 1u);
159 BOOST_TEST(! q
.closed());
162 // 1-element queue pull succeed
163 boost::sync_bounded_queue
<int> q(2);
168 BOOST_TEST(q
.empty());
169 BOOST_TEST(! q
.full());
170 BOOST_TEST_EQ(q
.size(), 0u);
171 BOOST_TEST(! q
.closed());
174 // 1-element queue pull succeed
175 boost::sync_bounded_queue
<non_copyable
> q(2);
177 q
.push(boost::move(nc
));
180 BOOST_TEST_EQ(nc
, nc2
);
181 BOOST_TEST(q
.empty());
182 BOOST_TEST(! q
.full());
183 BOOST_TEST_EQ(q
.size(), 0u);
184 BOOST_TEST(! q
.closed());
187 // 1-element queue pull succeed
188 boost::sync_bounded_queue
<int> q(2);
192 BOOST_TEST(q
.empty());
193 BOOST_TEST(! q
.full());
194 BOOST_TEST_EQ(q
.size(), 0u);
195 BOOST_TEST(! q
.closed());
198 // 1-element queue try_pull succeed
199 boost::sync_bounded_queue
<int> q(2);
202 BOOST_TEST(q
.try_pull(i
));
204 BOOST_TEST(q
.empty());
205 BOOST_TEST(! q
.full());
206 BOOST_TEST_EQ(q
.size(), 0u);
207 BOOST_TEST(! q
.closed());
210 // 1-element queue try_pull succeed
211 boost::sync_bounded_queue
<int> q(2);
214 BOOST_TEST(q
.try_pull(boost::no_block
, i
));
216 BOOST_TEST(q
.empty());
217 BOOST_TEST(! q
.full());
218 BOOST_TEST_EQ(q
.size(), 0u);
219 BOOST_TEST(! q
.closed());
222 // 1-element queue try_pull succeed
223 boost::sync_bounded_queue
<int> q(2);
225 boost::shared_ptr
<int> i
= q
.try_pull();
226 BOOST_TEST_EQ(*i
, 1);
227 BOOST_TEST(q
.empty());
228 BOOST_TEST(! q
.full());
229 BOOST_TEST_EQ(q
.size(), 0u);
230 BOOST_TEST(! q
.closed());
233 // full queue try_push rvalue fails
234 boost::sync_bounded_queue
<int> q(2);
237 BOOST_TEST(! q
.try_push(3));
238 BOOST_TEST(! q
.empty());
239 BOOST_TEST( q
.full());
240 BOOST_TEST_EQ(q
.size(), 2u);
241 BOOST_TEST(! q
.closed());
244 // full queue try_push succeeds
245 boost::sync_bounded_queue
<int> q(2);
248 BOOST_TEST(q
.try_pull());
249 BOOST_TEST(! q
.empty());
250 BOOST_TEST(! q
.full());
251 BOOST_TEST_EQ(q
.size(), 1u);
252 BOOST_TEST(! q
.closed());
257 boost::sync_bounded_queue
<int> q(2);
259 BOOST_TEST(q
.empty());
260 BOOST_TEST(! q
.full());
261 BOOST_TEST_EQ(q
.size(), 0u);
262 BOOST_TEST(q
.closed());
265 // closed queue push fails
266 boost::sync_bounded_queue
<int> q(2);
272 BOOST_TEST(q
.empty());
273 BOOST_TEST(! q
.full());
274 BOOST_TEST_EQ(q
.size(), 0u);
275 BOOST_TEST(q
.closed());
279 // 1-element closed queue pull succeed
280 boost::sync_bounded_queue
<int> q(2);
286 BOOST_TEST(q
.empty());
287 BOOST_TEST(! q
.full());
288 BOOST_TEST_EQ(q
.size(), 0u);
289 BOOST_TEST(q
.closed());
293 // empty queue try_pull fails
294 boost::sync_bounded_queue
<int> q(2);
296 BOOST_TEST( boost::queue_op_status::empty
== q
.try_pull_front(i
));
297 BOOST_TEST(q
.empty());
298 BOOST_TEST(! q
.full());
299 BOOST_TEST_EQ(q
.size(), 0u);
300 BOOST_TEST(! q
.closed());
303 // empty queue push rvalue succeeds
304 boost::sync_bounded_queue
<int> q(2);
306 BOOST_TEST(! q
.empty());
307 BOOST_TEST(! q
.full());
308 BOOST_TEST_EQ(q
.size(), 1u);
309 BOOST_TEST(! q
.closed());
312 // empty queue push rvalue succeeds
313 boost::sync_bounded_queue
<non_copyable
> q(2);
315 q
.push_back(boost::move(nc
));
316 BOOST_TEST(! q
.empty());
317 BOOST_TEST(! q
.full());
318 BOOST_TEST_EQ(q
.size(), 1u);
319 BOOST_TEST(! q
.closed());
322 // empty queue push rvalue succeeds
323 boost::sync_bounded_queue
<int> q(3);
325 BOOST_TEST_EQ(q
.size(), 1u);
327 BOOST_TEST_EQ(q
.size(), 2u);
329 BOOST_TEST_EQ(q
.size(), 3u);
330 BOOST_TEST(! q
.empty());
331 BOOST_TEST( q
.full());
332 BOOST_TEST(! q
.closed());
335 // empty queue push value succeeds
336 boost::sync_bounded_queue
<int> q(2);
339 BOOST_TEST(! q
.empty());
340 BOOST_TEST(! q
.full());
341 BOOST_TEST_EQ(q
.size(), 1u);
342 BOOST_TEST(! q
.closed());
345 // empty queue try_push rvalue succeeds
346 boost::sync_bounded_queue
<int> q(2);
347 BOOST_TEST(boost::queue_op_status::success
== q
.try_push_back(1));
348 BOOST_TEST(! q
.empty());
349 BOOST_TEST(! q
.full());
350 BOOST_TEST_EQ(q
.size(), 1u);
351 BOOST_TEST(! q
.closed());
354 // empty queue try_push rvalue succeeds
355 boost::sync_bounded_queue
<non_copyable
> q(2);
357 BOOST_TEST(boost::queue_op_status::success
== q
.try_push_back(boost::move(nc
)));
358 BOOST_TEST(! q
.empty());
359 BOOST_TEST(! q
.full());
360 BOOST_TEST_EQ(q
.size(), 1u);
361 BOOST_TEST(! q
.closed());
364 // empty queue try_push value succeeds
365 boost::sync_bounded_queue
<int> q(2);
367 BOOST_TEST(boost::queue_op_status::success
== q
.try_push_back(i
));
368 BOOST_TEST(! q
.empty());
369 BOOST_TEST(! q
.full());
370 BOOST_TEST_EQ(q
.size(), 1u);
371 BOOST_TEST(! q
.closed());
374 // empty queue try_push rvalue succeeds
375 boost::sync_bounded_queue
<int> q(2);
376 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_push_back( 1));
377 BOOST_TEST(! q
.empty());
378 BOOST_TEST(! q
.full());
379 BOOST_TEST_EQ(q
.size(), 1u);
380 BOOST_TEST(! q
.closed());
383 // empty queue try_push rvalue succeeds
384 boost::sync_bounded_queue
<non_copyable
> q(2);
386 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_push_back(boost::move(nc
)));
387 BOOST_TEST(! q
.empty());
388 BOOST_TEST(! q
.full());
389 BOOST_TEST_EQ(q
.size(), 1u);
390 BOOST_TEST(! q
.closed());
393 // empty queue wait_push rvalue succeeds
394 boost::sync_bounded_queue
<int> q(2);
395 BOOST_TEST(boost::queue_op_status::success
== q
.wait_push_back(1));
396 BOOST_TEST(! q
.empty());
397 BOOST_TEST(! q
.full());
398 BOOST_TEST_EQ(q
.size(), 1u);
399 BOOST_TEST(! q
.closed());
402 // empty queue wait_push rvalue succeeds
403 boost::sync_bounded_queue
<non_copyable
> q(2);
405 BOOST_TEST(boost::queue_op_status::success
== q
.wait_push_back(boost::move(nc
)));
406 BOOST_TEST(! q
.empty());
407 BOOST_TEST(! q
.full());
408 BOOST_TEST_EQ(q
.size(), 1u);
409 BOOST_TEST(! q
.closed());
412 // empty queue wait_push value succeeds
413 boost::sync_bounded_queue
<int> q(2);
415 BOOST_TEST(boost::queue_op_status::success
== q
.wait_push_back(i
));
416 BOOST_TEST(! q
.empty());
417 BOOST_TEST(! q
.full());
418 BOOST_TEST_EQ(q
.size(), 1u);
419 BOOST_TEST(! q
.closed());
422 // 1-element queue pull succeed
423 boost::sync_bounded_queue
<int> q(2);
428 BOOST_TEST(q
.empty());
429 BOOST_TEST(! q
.full());
430 BOOST_TEST_EQ(q
.size(), 0u);
431 BOOST_TEST(! q
.closed());
434 // 1-element queue pull succeed
435 boost::sync_bounded_queue
<non_copyable
> q(2);
437 q
.push_back(boost::move(nc
));
440 BOOST_TEST_EQ(nc
, nc2
);
441 BOOST_TEST(q
.empty());
442 BOOST_TEST(! q
.full());
443 BOOST_TEST_EQ(q
.size(), 0u);
444 BOOST_TEST(! q
.closed());
447 // 1-element queue pull succeed
448 boost::sync_bounded_queue
<int> q(2);
450 int i
= q
.pull_front();
452 BOOST_TEST(q
.empty());
453 BOOST_TEST(! q
.full());
454 BOOST_TEST_EQ(q
.size(), 0u);
455 BOOST_TEST(! q
.closed());
458 // 1-element queue try_pull succeed
459 boost::sync_bounded_queue
<int> q(2);
462 BOOST_TEST(boost::queue_op_status::success
== q
.try_pull_front(i
));
464 BOOST_TEST(q
.empty());
465 BOOST_TEST(! q
.full());
466 BOOST_TEST_EQ(q
.size(), 0u);
467 BOOST_TEST(! q
.closed());
470 // 1-element queue nonblocking_pull_front succeed
471 boost::sync_bounded_queue
<int> q(2);
474 BOOST_TEST(boost::queue_op_status::success
== q
.nonblocking_pull_front(i
));
476 BOOST_TEST(q
.empty());
477 BOOST_TEST(! q
.full());
478 BOOST_TEST_EQ(q
.size(), 0u);
479 BOOST_TEST(! q
.closed());
482 // 1-element queue wait_pull_front succeed
483 boost::sync_bounded_queue
<int> q(2);
486 BOOST_TEST(boost::queue_op_status::success
== q
.wait_pull_front(i
));
488 BOOST_TEST(q
.empty());
489 BOOST_TEST(! q
.full());
490 BOOST_TEST_EQ(q
.size(), 0u);
491 BOOST_TEST(! q
.closed());
494 // full queue try_push rvalue fails
495 boost::sync_bounded_queue
<int> q(2);
498 BOOST_TEST(boost::queue_op_status::full
== q
.try_push_back(3));
499 BOOST_TEST(! q
.empty());
500 BOOST_TEST( q
.full());
501 BOOST_TEST_EQ(q
.size(), 2u);
502 BOOST_TEST(! q
.closed());
507 boost::sync_bounded_queue
<int> q(2);
509 BOOST_TEST(q
.empty());
510 BOOST_TEST(! q
.full());
511 BOOST_TEST_EQ(q
.size(), 0u);
512 BOOST_TEST(q
.closed());
515 // closed queue push fails
516 boost::sync_bounded_queue
<int> q(2);
522 BOOST_TEST(q
.empty());
523 BOOST_TEST(! q
.full());
524 BOOST_TEST_EQ(q
.size(), 0u);
525 BOOST_TEST(q
.closed());
529 // closed empty queue try_pull_front closed
530 boost::sync_bounded_queue
<int> q(2);
533 BOOST_TEST(boost::queue_op_status::closed
== q
.try_pull_front(i
));
534 BOOST_TEST(q
.empty());
535 BOOST_TEST(! q
.full());
536 BOOST_TEST_EQ(q
.size(), 0u);
537 BOOST_TEST(q
.closed());
540 // closed empty queue nonblocking_pull_front closed
541 boost::sync_bounded_queue
<int> q(2);
544 BOOST_TEST(boost::queue_op_status::closed
== q
.nonblocking_pull_front(i
));
545 BOOST_TEST(q
.empty());
546 BOOST_TEST(! q
.full());
547 BOOST_TEST_EQ(q
.size(), 0u);
548 BOOST_TEST(q
.closed());
551 // 1-element closed queue pull_front succeed
552 boost::sync_bounded_queue
<int> q(2);
558 BOOST_TEST(q
.empty());
559 BOOST_TEST(! q
.full());
560 BOOST_TEST_EQ(q
.size(), 0u);
561 BOOST_TEST(q
.closed());
564 // 1-element closed queue wait_pull_front succeed
565 boost::sync_bounded_queue
<int> q(2);
569 BOOST_TEST(boost::queue_op_status::success
== q
.wait_pull_front(i
));
571 BOOST_TEST(q
.empty());
572 BOOST_TEST(! q
.full());
573 BOOST_TEST_EQ(q
.size(), 0u);
574 BOOST_TEST(q
.closed());
577 // closed empty queue wait_pull_front closed
578 boost::sync_bounded_queue
<int> q(2);
580 BOOST_TEST(q
.empty());
581 BOOST_TEST(q
.closed());
583 BOOST_TEST(boost::queue_op_status::closed
== q
.wait_pull_front(i
));
584 BOOST_TEST(q
.empty());
585 BOOST_TEST(q
.closed());
588 // closed queue wait_push_back fails
589 boost::sync_bounded_queue
<int> q(2);
591 BOOST_TEST(q
.empty());
592 BOOST_TEST(q
.closed());
594 BOOST_TEST(boost::queue_op_status::closed
== q
.wait_push_back(i
));
595 BOOST_TEST(q
.empty());
596 BOOST_TEST(q
.closed());
598 return boost::report_errors();