single_thread_pass.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. // Copyright (C) 2013 Vicente J. Botet Escriba
  2. //
  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)
  5. // <boost/thread/sync_bounded_queue.hpp>
  6. // class sync_bounded_queue<T>
  7. // sync_bounded_queue();
  8. #define BOOST_THREAD_VERSION 4
  9. //#define BOOST_THREAD_QUEUE_DEPRECATE_OLD
  10. #include <boost/thread/sync_bounded_queue.hpp>
  11. #include <boost/detail/lightweight_test.hpp>
  12. class non_copyable
  13. {
  14. BOOST_THREAD_MOVABLE_ONLY(non_copyable)
  15. int val;
  16. public:
  17. non_copyable() {}
  18. non_copyable(int v) : val(v){}
  19. non_copyable(BOOST_RV_REF(non_copyable) x): val(x.val) {}
  20. non_copyable& operator=(BOOST_RV_REF(non_copyable) x) { val=x.val; return *this; }
  21. bool operator==(non_copyable const& x) const {return val==x.val;}
  22. template <typename OSTREAM>
  23. friend OSTREAM& operator <<(OSTREAM& os, non_copyable const&x )
  24. {
  25. os << x.val;
  26. return os;
  27. }
  28. };
  29. int main()
  30. {
  31. {
  32. // default queue invariants
  33. boost::sync_bounded_queue<int> q(2);
  34. BOOST_TEST(q.empty());
  35. BOOST_TEST(! q.full());
  36. BOOST_TEST_EQ(q.size(), 0u);
  37. BOOST_TEST_EQ(q.capacity(), 2u);
  38. BOOST_TEST(! q.closed());
  39. }
  40. #ifndef BOOST_THREAD_QUEUE_DEPRECATE_OLD
  41. {
  42. // empty queue try_pull fails
  43. boost::sync_bounded_queue<int> q(2);
  44. int i;
  45. BOOST_TEST(! q.try_pull(i));
  46. BOOST_TEST(q.empty());
  47. BOOST_TEST(! q.full());
  48. BOOST_TEST_EQ(q.size(), 0u);
  49. BOOST_TEST(! q.closed());
  50. }
  51. {
  52. // empty queue try_pull fails
  53. boost::sync_bounded_queue<int> q(2);
  54. BOOST_TEST(! q.try_pull());
  55. BOOST_TEST(q.empty());
  56. BOOST_TEST(! q.full());
  57. BOOST_TEST_EQ(q.size(), 0u);
  58. BOOST_TEST(! q.closed());
  59. }
  60. {
  61. // empty queue push rvalue succeeds
  62. boost::sync_bounded_queue<int> q(2);
  63. q.push(1);
  64. BOOST_TEST(! q.empty());
  65. BOOST_TEST(! q.full());
  66. BOOST_TEST_EQ(q.size(), 1u);
  67. BOOST_TEST(! q.closed());
  68. }
  69. {
  70. // empty queue push rvalue succeeds
  71. boost::sync_bounded_queue<non_copyable> q(2);
  72. non_copyable nc(1);
  73. q.push(boost::move(nc));
  74. BOOST_TEST(! q.empty());
  75. BOOST_TEST(! q.full());
  76. BOOST_TEST_EQ(q.size(), 1u);
  77. BOOST_TEST(! q.closed());
  78. }
  79. {
  80. // empty queue push rvalue succeeds
  81. boost::sync_bounded_queue<int> q(3);
  82. q.push(1);
  83. BOOST_TEST_EQ(q.size(), 1u);
  84. q.push(2);
  85. BOOST_TEST_EQ(q.size(), 2u);
  86. q.push(2);
  87. BOOST_TEST_EQ(q.size(), 3u);
  88. BOOST_TEST(! q.empty());
  89. BOOST_TEST( q.full());
  90. BOOST_TEST(! q.closed());
  91. }
  92. {
  93. // empty queue push value succeeds
  94. boost::sync_bounded_queue<int> q(2);
  95. int i;
  96. q.push(i);
  97. BOOST_TEST(! q.empty());
  98. BOOST_TEST(! q.full());
  99. BOOST_TEST_EQ(q.size(), 1u);
  100. BOOST_TEST(! q.closed());
  101. }
  102. {
  103. // empty queue try_push rvalue succeeds
  104. boost::sync_bounded_queue<int> q(2);
  105. BOOST_TEST(q.try_push(1));
  106. BOOST_TEST(! q.empty());
  107. BOOST_TEST(! q.full());
  108. BOOST_TEST_EQ(q.size(), 1u);
  109. BOOST_TEST(! q.closed());
  110. }
  111. {
  112. // empty queue try_push rvalue succeeds
  113. boost::sync_bounded_queue<non_copyable> q(2);
  114. non_copyable nc(1);
  115. BOOST_TEST(q.try_push(boost::move(nc)));
  116. BOOST_TEST(! q.empty());
  117. BOOST_TEST(! q.full());
  118. BOOST_TEST_EQ(q.size(), 1u);
  119. BOOST_TEST(! q.closed());
  120. }
  121. {
  122. // empty queue try_push value succeeds
  123. boost::sync_bounded_queue<int> q(2);
  124. int i=1;
  125. BOOST_TEST(q.try_push(i));
  126. BOOST_TEST(! q.empty());
  127. BOOST_TEST(! q.full());
  128. BOOST_TEST_EQ(q.size(), 1u);
  129. BOOST_TEST(! q.closed());
  130. }
  131. {
  132. // empty queue try_push rvalue succeeds
  133. boost::sync_bounded_queue<int> q(2);
  134. BOOST_TEST(q.try_push(boost::no_block, 1));
  135. BOOST_TEST(! q.empty());
  136. BOOST_TEST(! q.full());
  137. BOOST_TEST_EQ(q.size(), 1u);
  138. BOOST_TEST(! q.closed());
  139. }
  140. {
  141. // empty queue try_push rvalue succeeds
  142. boost::sync_bounded_queue<non_copyable> q(2);
  143. non_copyable nc(1);
  144. BOOST_TEST(q.try_push(boost::no_block, boost::move(nc)));
  145. BOOST_TEST(! q.empty());
  146. BOOST_TEST(! q.full());
  147. BOOST_TEST_EQ(q.size(), 1u);
  148. BOOST_TEST(! q.closed());
  149. }
  150. {
  151. // 1-element queue pull succeed
  152. boost::sync_bounded_queue<int> q(2);
  153. q.push(1);
  154. int i;
  155. q.pull(i);
  156. BOOST_TEST_EQ(i, 1);
  157. BOOST_TEST(q.empty());
  158. BOOST_TEST(! q.full());
  159. BOOST_TEST_EQ(q.size(), 0u);
  160. BOOST_TEST(! q.closed());
  161. }
  162. {
  163. // 1-element queue pull succeed
  164. boost::sync_bounded_queue<non_copyable> q(2);
  165. non_copyable nc(1);
  166. q.push(boost::move(nc));
  167. non_copyable nc2(2);
  168. q.pull(nc2);
  169. BOOST_TEST_EQ(nc, nc2);
  170. BOOST_TEST(q.empty());
  171. BOOST_TEST(! q.full());
  172. BOOST_TEST_EQ(q.size(), 0u);
  173. BOOST_TEST(! q.closed());
  174. }
  175. {
  176. // 1-element queue pull succeed
  177. boost::sync_bounded_queue<int> q(2);
  178. q.push(1);
  179. int i = q.pull();
  180. BOOST_TEST_EQ(i, 1);
  181. BOOST_TEST(q.empty());
  182. BOOST_TEST(! q.full());
  183. BOOST_TEST_EQ(q.size(), 0u);
  184. BOOST_TEST(! q.closed());
  185. }
  186. {
  187. // 1-element queue try_pull succeed
  188. boost::sync_bounded_queue<int> q(2);
  189. q.push(1);
  190. int i;
  191. BOOST_TEST(q.try_pull(i));
  192. BOOST_TEST_EQ(i, 1);
  193. BOOST_TEST(q.empty());
  194. BOOST_TEST(! q.full());
  195. BOOST_TEST_EQ(q.size(), 0u);
  196. BOOST_TEST(! q.closed());
  197. }
  198. {
  199. // 1-element queue try_pull succeed
  200. boost::sync_bounded_queue<int> q(2);
  201. q.push(1);
  202. int i;
  203. BOOST_TEST(q.try_pull(boost::no_block, i));
  204. BOOST_TEST_EQ(i, 1);
  205. BOOST_TEST(q.empty());
  206. BOOST_TEST(! q.full());
  207. BOOST_TEST_EQ(q.size(), 0u);
  208. BOOST_TEST(! q.closed());
  209. }
  210. {
  211. // 1-element queue try_pull succeed
  212. boost::sync_bounded_queue<int> q(2);
  213. q.push(1);
  214. boost::shared_ptr<int> i = q.try_pull();
  215. BOOST_TEST_EQ(*i, 1);
  216. BOOST_TEST(q.empty());
  217. BOOST_TEST(! q.full());
  218. BOOST_TEST_EQ(q.size(), 0u);
  219. BOOST_TEST(! q.closed());
  220. }
  221. {
  222. // full queue try_push rvalue fails
  223. boost::sync_bounded_queue<int> q(2);
  224. q.push(1);
  225. q.push(2);
  226. BOOST_TEST(! q.try_push(3));
  227. BOOST_TEST(! q.empty());
  228. BOOST_TEST( q.full());
  229. BOOST_TEST_EQ(q.size(), 2u);
  230. BOOST_TEST(! q.closed());
  231. }
  232. {
  233. // full queue try_push succeeds
  234. boost::sync_bounded_queue<int> q(2);
  235. q.push(1);
  236. q.push(2);
  237. BOOST_TEST(q.try_pull());
  238. BOOST_TEST(! q.empty());
  239. BOOST_TEST(! q.full());
  240. BOOST_TEST_EQ(q.size(), 1u);
  241. BOOST_TEST(! q.closed());
  242. }
  243. {
  244. // closed invariants
  245. boost::sync_bounded_queue<int> q(2);
  246. q.close();
  247. BOOST_TEST(q.empty());
  248. BOOST_TEST(! q.full());
  249. BOOST_TEST_EQ(q.size(), 0u);
  250. BOOST_TEST(q.closed());
  251. }
  252. {
  253. // closed queue push fails
  254. boost::sync_bounded_queue<int> q(2);
  255. q.close();
  256. try {
  257. q.push(1);
  258. BOOST_TEST(false);
  259. } catch (...) {
  260. BOOST_TEST(q.empty());
  261. BOOST_TEST(! q.full());
  262. BOOST_TEST_EQ(q.size(), 0u);
  263. BOOST_TEST(q.closed());
  264. }
  265. }
  266. {
  267. // 1-element closed queue pull succeed
  268. boost::sync_bounded_queue<int> q(2);
  269. q.push(1);
  270. q.close();
  271. int i;
  272. q.pull(i);
  273. BOOST_TEST_EQ(i, 1);
  274. BOOST_TEST(q.empty());
  275. BOOST_TEST(! q.full());
  276. BOOST_TEST_EQ(q.size(), 0u);
  277. BOOST_TEST(q.closed());
  278. }
  279. #endif
  280. {
  281. // empty queue try_pull fails
  282. boost::sync_bounded_queue<int> q(2);
  283. int i;
  284. BOOST_TEST( boost::queue_op_status::empty == q.try_pull_front(i));
  285. BOOST_TEST(q.empty());
  286. BOOST_TEST(! q.full());
  287. BOOST_TEST_EQ(q.size(), 0u);
  288. BOOST_TEST(! q.closed());
  289. }
  290. {
  291. // empty queue push rvalue succeeds
  292. boost::sync_bounded_queue<int> q(2);
  293. q.push_back(1);
  294. BOOST_TEST(! q.empty());
  295. BOOST_TEST(! q.full());
  296. BOOST_TEST_EQ(q.size(), 1u);
  297. BOOST_TEST(! q.closed());
  298. }
  299. {
  300. // empty queue push rvalue succeeds
  301. boost::sync_bounded_queue<non_copyable> q(2);
  302. non_copyable nc(1);
  303. q.push_back(boost::move(nc));
  304. BOOST_TEST(! q.empty());
  305. BOOST_TEST(! q.full());
  306. BOOST_TEST_EQ(q.size(), 1u);
  307. BOOST_TEST(! q.closed());
  308. }
  309. {
  310. // empty queue push rvalue succeeds
  311. boost::sync_bounded_queue<int> q(3);
  312. q.push_back(1);
  313. BOOST_TEST_EQ(q.size(), 1u);
  314. q.push_back(2);
  315. BOOST_TEST_EQ(q.size(), 2u);
  316. q.push_back(3);
  317. BOOST_TEST_EQ(q.size(), 3u);
  318. BOOST_TEST(! q.empty());
  319. BOOST_TEST( q.full());
  320. BOOST_TEST(! q.closed());
  321. }
  322. {
  323. // empty queue push value succeeds
  324. boost::sync_bounded_queue<int> q(2);
  325. int i;
  326. q.push_back(i);
  327. BOOST_TEST(! q.empty());
  328. BOOST_TEST(! q.full());
  329. BOOST_TEST_EQ(q.size(), 1u);
  330. BOOST_TEST(! q.closed());
  331. }
  332. {
  333. // empty queue try_push rvalue succeeds
  334. boost::sync_bounded_queue<int> q(2);
  335. BOOST_TEST(boost::queue_op_status::success == q.try_push_back(1));
  336. BOOST_TEST(! q.empty());
  337. BOOST_TEST(! q.full());
  338. BOOST_TEST_EQ(q.size(), 1u);
  339. BOOST_TEST(! q.closed());
  340. }
  341. {
  342. // empty queue try_push rvalue succeeds
  343. boost::sync_bounded_queue<non_copyable> q(2);
  344. non_copyable nc(1);
  345. BOOST_TEST(boost::queue_op_status::success == q.try_push_back(boost::move(nc)));
  346. BOOST_TEST(! q.empty());
  347. BOOST_TEST(! q.full());
  348. BOOST_TEST_EQ(q.size(), 1u);
  349. BOOST_TEST(! q.closed());
  350. }
  351. {
  352. // empty queue try_push value succeeds
  353. boost::sync_bounded_queue<int> q(2);
  354. int i=1;
  355. BOOST_TEST(boost::queue_op_status::success == q.try_push_back(i));
  356. BOOST_TEST(! q.empty());
  357. BOOST_TEST(! q.full());
  358. BOOST_TEST_EQ(q.size(), 1u);
  359. BOOST_TEST(! q.closed());
  360. }
  361. {
  362. // empty queue try_push rvalue succeeds
  363. boost::sync_bounded_queue<int> q(2);
  364. BOOST_TEST(boost::queue_op_status::success == q.nonblocking_push_back( 1));
  365. BOOST_TEST(! q.empty());
  366. BOOST_TEST(! q.full());
  367. BOOST_TEST_EQ(q.size(), 1u);
  368. BOOST_TEST(! q.closed());
  369. }
  370. {
  371. // empty queue try_push rvalue succeeds
  372. boost::sync_bounded_queue<non_copyable> q(2);
  373. non_copyable nc(1);
  374. BOOST_TEST(boost::queue_op_status::success == q.nonblocking_push_back(boost::move(nc)));
  375. BOOST_TEST(! q.empty());
  376. BOOST_TEST(! q.full());
  377. BOOST_TEST_EQ(q.size(), 1u);
  378. BOOST_TEST(! q.closed());
  379. }
  380. {
  381. // empty queue wait_push rvalue succeeds
  382. boost::sync_bounded_queue<int> q(2);
  383. BOOST_TEST(boost::queue_op_status::success == q.wait_push_back(1));
  384. BOOST_TEST(! q.empty());
  385. BOOST_TEST(! q.full());
  386. BOOST_TEST_EQ(q.size(), 1u);
  387. BOOST_TEST(! q.closed());
  388. }
  389. {
  390. // empty queue wait_push rvalue succeeds
  391. boost::sync_bounded_queue<non_copyable> q(2);
  392. non_copyable nc(1);
  393. BOOST_TEST(boost::queue_op_status::success == q.wait_push_back(boost::move(nc)));
  394. BOOST_TEST(! q.empty());
  395. BOOST_TEST(! q.full());
  396. BOOST_TEST_EQ(q.size(), 1u);
  397. BOOST_TEST(! q.closed());
  398. }
  399. {
  400. // empty queue wait_push value succeeds
  401. boost::sync_bounded_queue<int> q(2);
  402. int i;
  403. BOOST_TEST(boost::queue_op_status::success == q.wait_push_back(i));
  404. BOOST_TEST(! q.empty());
  405. BOOST_TEST(! q.full());
  406. BOOST_TEST_EQ(q.size(), 1u);
  407. BOOST_TEST(! q.closed());
  408. }
  409. {
  410. // 1-element queue pull succeed
  411. boost::sync_bounded_queue<int> q(2);
  412. q.push_back(1);
  413. int i;
  414. q.pull_front(i);
  415. BOOST_TEST_EQ(i, 1);
  416. BOOST_TEST(q.empty());
  417. BOOST_TEST(! q.full());
  418. BOOST_TEST_EQ(q.size(), 0u);
  419. BOOST_TEST(! q.closed());
  420. }
  421. {
  422. // 1-element queue pull succeed
  423. boost::sync_bounded_queue<non_copyable> q(2);
  424. non_copyable nc(1);
  425. q.push_back(boost::move(nc));
  426. non_copyable nc2(2);
  427. q.pull_front(nc2);
  428. BOOST_TEST_EQ(nc, nc2);
  429. BOOST_TEST(q.empty());
  430. BOOST_TEST(! q.full());
  431. BOOST_TEST_EQ(q.size(), 0u);
  432. BOOST_TEST(! q.closed());
  433. }
  434. {
  435. // 1-element queue pull succeed
  436. boost::sync_bounded_queue<int> q(2);
  437. q.push_back(1);
  438. int i = q.pull_front();
  439. BOOST_TEST_EQ(i, 1);
  440. BOOST_TEST(q.empty());
  441. BOOST_TEST(! q.full());
  442. BOOST_TEST_EQ(q.size(), 0u);
  443. BOOST_TEST(! q.closed());
  444. }
  445. {
  446. // 1-element queue try_pull succeed
  447. boost::sync_bounded_queue<int> q(2);
  448. q.push_back(1);
  449. int i;
  450. BOOST_TEST(boost::queue_op_status::success == q.try_pull_front(i));
  451. BOOST_TEST_EQ(i, 1);
  452. BOOST_TEST(q.empty());
  453. BOOST_TEST(! q.full());
  454. BOOST_TEST_EQ(q.size(), 0u);
  455. BOOST_TEST(! q.closed());
  456. }
  457. {
  458. // 1-element queue nonblocking_pull_front succeed
  459. boost::sync_bounded_queue<int> q(2);
  460. q.push_back(1);
  461. int i;
  462. BOOST_TEST(boost::queue_op_status::success == q.nonblocking_pull_front(i));
  463. BOOST_TEST_EQ(i, 1);
  464. BOOST_TEST(q.empty());
  465. BOOST_TEST(! q.full());
  466. BOOST_TEST_EQ(q.size(), 0u);
  467. BOOST_TEST(! q.closed());
  468. }
  469. {
  470. // 1-element queue wait_pull_front succeed
  471. boost::sync_bounded_queue<int> q(2);
  472. q.push_back(1);
  473. int i;
  474. BOOST_TEST(boost::queue_op_status::success == q.wait_pull_front(i));
  475. BOOST_TEST_EQ(i, 1);
  476. BOOST_TEST(q.empty());
  477. BOOST_TEST(! q.full());
  478. BOOST_TEST_EQ(q.size(), 0u);
  479. BOOST_TEST(! q.closed());
  480. }
  481. {
  482. // full queue try_push rvalue fails
  483. boost::sync_bounded_queue<int> q(2);
  484. q.push_back(1);
  485. q.push_back(2);
  486. BOOST_TEST(boost::queue_op_status::full == q.try_push_back(3));
  487. BOOST_TEST(! q.empty());
  488. BOOST_TEST( q.full());
  489. BOOST_TEST_EQ(q.size(), 2u);
  490. BOOST_TEST(! q.closed());
  491. }
  492. {
  493. // closed invariants
  494. boost::sync_bounded_queue<int> q(2);
  495. q.close();
  496. BOOST_TEST(q.empty());
  497. BOOST_TEST(! q.full());
  498. BOOST_TEST_EQ(q.size(), 0u);
  499. BOOST_TEST(q.closed());
  500. }
  501. {
  502. // closed queue push fails
  503. boost::sync_bounded_queue<int> q(2);
  504. q.close();
  505. try {
  506. q.push_back(1);
  507. BOOST_TEST(false);
  508. } catch (...) {
  509. BOOST_TEST(q.empty());
  510. BOOST_TEST(! q.full());
  511. BOOST_TEST_EQ(q.size(), 0u);
  512. BOOST_TEST(q.closed());
  513. }
  514. }
  515. {
  516. // closed empty queue try_pull_front closed
  517. boost::sync_bounded_queue<int> q(2);
  518. q.close();
  519. int i;
  520. BOOST_TEST(boost::queue_op_status::closed == q.try_pull_front(i));
  521. BOOST_TEST(q.empty());
  522. BOOST_TEST(! q.full());
  523. BOOST_TEST_EQ(q.size(), 0u);
  524. BOOST_TEST(q.closed());
  525. }
  526. {
  527. // closed empty queue nonblocking_pull_front closed
  528. boost::sync_bounded_queue<int> q(2);
  529. q.close();
  530. int i;
  531. BOOST_TEST(boost::queue_op_status::closed == q.nonblocking_pull_front(i));
  532. BOOST_TEST(q.empty());
  533. BOOST_TEST(! q.full());
  534. BOOST_TEST_EQ(q.size(), 0u);
  535. BOOST_TEST(q.closed());
  536. }
  537. {
  538. // 1-element closed queue pull_front succeed
  539. boost::sync_bounded_queue<int> q(2);
  540. q.push_back(1);
  541. q.close();
  542. int i;
  543. q.pull_front(i);
  544. BOOST_TEST_EQ(i, 1);
  545. BOOST_TEST(q.empty());
  546. BOOST_TEST(! q.full());
  547. BOOST_TEST_EQ(q.size(), 0u);
  548. BOOST_TEST(q.closed());
  549. }
  550. {
  551. // 1-element closed queue wait_pull_front succeed
  552. boost::sync_bounded_queue<int> q(2);
  553. q.push_back(1);
  554. q.close();
  555. int i;
  556. BOOST_TEST(boost::queue_op_status::success == q.wait_pull_front(i));
  557. BOOST_TEST_EQ(i, 1);
  558. BOOST_TEST(q.empty());
  559. BOOST_TEST(! q.full());
  560. BOOST_TEST_EQ(q.size(), 0u);
  561. BOOST_TEST(q.closed());
  562. }
  563. {
  564. // closed empty queue wait_pull_front closed
  565. boost::sync_bounded_queue<int> q(2);
  566. q.close();
  567. BOOST_TEST(q.empty());
  568. BOOST_TEST(q.closed());
  569. int i;
  570. BOOST_TEST(boost::queue_op_status::closed == q.wait_pull_front(i));
  571. BOOST_TEST(q.empty());
  572. BOOST_TEST(q.closed());
  573. }
  574. {
  575. // closed queue wait_push_back fails
  576. boost::sync_bounded_queue<int> q(2);
  577. q.close();
  578. BOOST_TEST(q.empty());
  579. BOOST_TEST(q.closed());
  580. int i;
  581. BOOST_TEST(boost::queue_op_status::closed == q.wait_push_back(i));
  582. BOOST_TEST(q.empty());
  583. BOOST_TEST(q.closed());
  584. }
  585. return boost::report_errors();
  586. }