| 1464 | } |
| 1465 | |
| 1466 | bool block_reuse() |
| 1467 | { |
| 1468 | int item; |
| 1469 | |
| 1470 | typedef TestTraits<4> SmallBlocks; |
| 1471 | SmallBlocks::reset(); |
| 1472 | { |
| 1473 | ConcurrentQueue<int, SmallBlocks> q(8); // 2 blocks |
| 1474 | ProducerToken t(q); |
| 1475 | |
| 1476 | for (int j = 0; j != 3; ++j) { |
| 1477 | for (int i = 0; i != 4; ++i) { |
| 1478 | ASSERT_OR_FAIL(q.enqueue(t, i)); |
| 1479 | } |
| 1480 | for (int i = 0; i != 4; ++i) { |
| 1481 | ASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item)); |
| 1482 | ASSERT_OR_FAIL(item == i); |
| 1483 | } |
| 1484 | |
| 1485 | for (int i = 0; i != 8; ++i) { |
| 1486 | ASSERT_OR_FAIL(q.enqueue(t, i)); |
| 1487 | } |
| 1488 | for (int i = 0; i != 4; ++i) { |
| 1489 | ASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item)); |
| 1490 | ASSERT_OR_FAIL(item == i); |
| 1491 | } |
| 1492 | for (int i = 0; i != 4; ++i) { |
| 1493 | ASSERT_OR_FAIL(q.enqueue(t, i)); |
| 1494 | } |
| 1495 | for (int i = 0; i != 8; ++i) { |
| 1496 | ASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item)); |
| 1497 | ASSERT_OR_FAIL(item == ((i + 4) & 7)); |
| 1498 | } |
| 1499 | |
| 1500 | ASSERT_OR_FAIL(!q.try_dequeue_from_producer(t, item)); |
| 1501 | } |
| 1502 | } |
| 1503 | |
| 1504 | ASSERT_OR_FAIL(SmallBlocks::malloc_count() == 3); |
| 1505 | ASSERT_OR_FAIL(SmallBlocks::free_count() == SmallBlocks::malloc_count()); |
| 1506 | |
| 1507 | |
| 1508 | typedef TestTraits<8192> HugeBlocks; |
| 1509 | HugeBlocks::reset(); |
| 1510 | { |
| 1511 | ConcurrentQueue<int, HugeBlocks> q(8192 * 2); // 2 blocks |
| 1512 | ProducerToken t(q); |
| 1513 | |
| 1514 | for (int j = 0; j != 3; ++j) { |
| 1515 | for (int i = 0; i != 8192; ++i) { |
| 1516 | ASSERT_OR_FAIL(q.enqueue(t, i)); |
| 1517 | } |
| 1518 | for (int i = 0; i != 8192; ++i) { |
| 1519 | ASSERT_OR_FAIL(q.try_dequeue_from_producer(t, item)); |
| 1520 | ASSERT_OR_FAIL(item == i); |
| 1521 | } |
| 1522 | |
| 1523 | for (int i = 0; i != 8192 * 2; ++i) { |
nothing calls this directly
no test coverage detected