@@ -1211,12 +1211,10 @@ mod tests {
1211
1211
}
1212
1212
}
1213
1213
1214
- #[ test]
1215
- fn test_queue_and_iterator ( ) {
1216
- let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1214
+ fn do_test_queue_and_iterator < ' a , Q : QueueT < & ' a AddrSpace > > ( m : & ' a AddrSpace ) {
1217
1215
let vq = MockSplitQueue :: new ( m, 16 ) ;
1218
1216
1219
- let mut q: Queue < _ > = vq. as_queue ( m) ;
1217
+ let mut q: Q = vq. as_queue ( m) ;
1220
1218
1221
1219
// q is currently valid
1222
1220
assert ! ( q. is_valid( ) ) ;
@@ -1326,11 +1324,21 @@ mod tests {
1326
1324
}
1327
1325
1328
1326
#[ test]
1329
- fn test_descriptor_and_iterator ( ) {
1327
+ fn test_queue_and_iterator ( ) {
1328
+ let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1329
+ do_test_queue_and_iterator :: < Queue < & AddrSpace > > ( m) ;
1330
+ }
1331
+
1332
+ #[ test]
1333
+ fn test_queue_and_iterator_sync ( ) {
1330
1334
let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1335
+ do_test_queue_and_iterator :: < QueueSync < & AddrSpace > > ( m) ;
1336
+ }
1337
+
1338
+ fn do_test_descriptor_and_iterator < ' a , Q : QueueT < & ' a AddrSpace > > ( m : & ' a AddrSpace ) {
1331
1339
let vq = MockSplitQueue :: new ( m, 16 ) ;
1332
1340
1333
- let mut q: Queue < _ > = vq. as_queue ( m) ;
1341
+ let mut q: Q = vq. as_queue ( m) ;
1334
1342
1335
1343
// q is currently valid
1336
1344
assert ! ( q. is_valid( ) ) ;
@@ -1390,11 +1398,21 @@ mod tests {
1390
1398
}
1391
1399
1392
1400
#[ test]
1393
- fn test_add_used ( ) {
1401
+ fn test_descriptor_and_iterator ( ) {
1394
1402
let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1403
+ do_test_descriptor_and_iterator :: < Queue < & AddrSpace > > ( m) ;
1404
+ }
1405
+
1406
+ #[ test]
1407
+ fn test_descriptor_and_iterator_sync ( ) {
1408
+ let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1409
+ do_test_descriptor_and_iterator :: < QueueSync < & AddrSpace > > ( m) ;
1410
+ }
1411
+
1412
+ fn do_test_add_used < ' a , Q : QueueT < & ' a AddrSpace > > ( m : & ' a AddrSpace ) {
1395
1413
let vq = MockSplitQueue :: new ( m, 16 ) ;
1396
1414
1397
- let mut q: Queue < _ > = vq. as_queue ( m) ;
1415
+ let mut q: Q = vq. as_queue ( m) ;
1398
1416
1399
1417
assert_eq ! ( vq. used( ) . idx( ) . load( ) , 0 ) ;
1400
1418
@@ -1413,12 +1431,20 @@ mod tests {
1413
1431
}
1414
1432
1415
1433
#[ test]
1416
- fn test_queue_guard ( ) {
1417
- let m = & GuestMemoryMmap :: < ( ) > :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1418
- let vq = MockSplitQueue :: new ( m, 16 ) ;
1434
+ fn test_add_used ( ) {
1435
+ let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1436
+ do_test_add_used :: < Queue < & AddrSpace > > ( m) ;
1437
+ }
1419
1438
1420
- let mut q = vq. create_queue ( m) ;
1421
- let mut qstate = q. acquire ( ) ;
1439
+ #[ test]
1440
+ fn test_add_used_sync ( ) {
1441
+ let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1442
+ do_test_add_used :: < QueueSync < & AddrSpace > > ( m) ;
1443
+ }
1444
+
1445
+ fn do_test_queue_guard < S : DerefMut < Target = QueueState > > (
1446
+ mut qstate : QueueGuard < & AddrSpace , S > ,
1447
+ ) {
1422
1448
qstate. ready = true ;
1423
1449
qstate. reset ( ) ;
1424
1450
assert_eq ! ( qstate. ready, false ) ;
@@ -1427,11 +1453,35 @@ mod tests {
1427
1453
}
1428
1454
1429
1455
#[ test]
1430
- fn test_reset_queue ( ) {
1431
- let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1456
+ fn test_queue_guard ( ) {
1457
+ let m = & GuestMemoryMmap :: < ( ) > :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1458
+ let vq = MockSplitQueue :: new ( m, 16 ) ;
1459
+
1460
+ let mut q = vq. create_queue ( m) ;
1461
+ do_test_queue_guard ( q. acquire ( ) ) ;
1462
+ }
1463
+
1464
+ #[ test]
1465
+ fn test_queue_guard_sync ( ) {
1466
+ let m = & GuestMemoryMmap :: < ( ) > :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1467
+ let vq = MockSplitQueue :: new ( m, 16 ) ;
1468
+
1469
+ // Note how the test_queue_guard above has "let mut" here. A singlethreaded
1470
+ // queue can only be accessed by one thread, and that one needs to have an
1471
+ // exclusive reference; a multithreaded queue can be accessed by many thread
1472
+ // and therefore it has to support interior mutability (via Mutex). On the
1473
+ // other hand, a multithreaded queue is reference counted and therefore it
1474
+ // cannot be accessed via an exclusive reference *at all*. This is the
1475
+ // the reason why only Queue has the acquire() method, and only QueueSync
1476
+ // has a lock() method.
1477
+ let q: QueueSync < _ > = vq. as_queue ( m) ;
1478
+ do_test_queue_guard ( q. lock ( ) ) ;
1479
+ }
1480
+
1481
+ fn do_test_reset_queue < ' a , Q : QueueT < & ' a AddrSpace > > ( m : & ' a AddrSpace ) {
1432
1482
let vq = MockSplitQueue :: new ( m, 16 ) ;
1433
1483
1434
- let mut q: Queue < _ > = vq. as_queue ( m) ;
1484
+ let mut q: Q = vq. as_queue ( m) ;
1435
1485
q. with ( |mut qstate| {
1436
1486
qstate. size = 8 ;
1437
1487
qstate. ready = true ;
@@ -1442,12 +1492,22 @@ mod tests {
1442
1492
}
1443
1493
1444
1494
#[ test]
1445
- fn test_needs_notification ( ) {
1495
+ fn test_reset_queue ( ) {
1446
1496
let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1497
+ do_test_reset_queue :: < Queue < & AddrSpace > > ( m) ;
1498
+ }
1499
+
1500
+ #[ test]
1501
+ fn test_reset_queue_sync ( ) {
1502
+ let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1503
+ do_test_reset_queue :: < QueueSync < & AddrSpace > > ( m) ;
1504
+ }
1505
+
1506
+ fn do_test_needs_notification < ' a , Q : QueueT < & ' a AddrSpace > > ( m : & ' a AddrSpace ) {
1447
1507
let qsize = 16 ;
1448
1508
let vq = MockSplitQueue :: new ( m, qsize) ;
1449
1509
1450
- let mut q: Queue < _ > = vq. as_queue ( m) ;
1510
+ let mut q: Q = vq. as_queue ( m) ;
1451
1511
let avail_addr = vq. avail_addr ( ) ;
1452
1512
1453
1513
// It should always return true when EVENT_IDX isn't enabled.
@@ -1491,11 +1551,21 @@ mod tests {
1491
1551
}
1492
1552
1493
1553
#[ test]
1494
- fn test_enable_disable_notification ( ) {
1554
+ fn test_needs_notification ( ) {
1495
1555
let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1556
+ do_test_needs_notification :: < Queue < & AddrSpace > > ( m) ;
1557
+ }
1558
+
1559
+ #[ test]
1560
+ fn test_needs_notification_sync ( ) {
1561
+ let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1562
+ do_test_needs_notification :: < QueueSync < & AddrSpace > > ( m) ;
1563
+ }
1564
+
1565
+ fn do_test_enable_disable_notification < ' a , Q : QueueT < & ' a AddrSpace > > ( m : & ' a AddrSpace ) {
1496
1566
let vq = MockSplitQueue :: new ( m, 16 ) ;
1497
1567
1498
- let mut q: Queue < _ > = vq. as_queue ( m) ;
1568
+ let mut q: Q = vq. as_queue ( m) ;
1499
1569
let used_addr = vq. used_addr ( ) ;
1500
1570
1501
1571
q. with ( |qstate| assert_eq ! ( qstate. event_idx_enabled, false ) ) ;
@@ -1526,4 +1596,16 @@ mod tests {
1526
1596
q. with ( |mut qstate| qstate. next_avail = Wrapping ( 8 ) ) ;
1527
1597
assert_eq ! ( q. enable_notification( ) . unwrap( ) , false ) ;
1528
1598
}
1599
+
1600
+ #[ test]
1601
+ fn test_enable_disable_notification ( ) {
1602
+ let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1603
+ do_test_enable_disable_notification :: < Queue < & AddrSpace > > ( m) ;
1604
+ }
1605
+
1606
+ #[ test]
1607
+ fn test_enable_disable_notification_sync ( ) {
1608
+ let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1609
+ do_test_enable_disable_notification :: < QueueSync < & AddrSpace > > ( m) ;
1610
+ }
1529
1611
}
0 commit comments