@@ -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,18 @@ 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 > > ( mut qstate : QueueGuard < & AddrSpace , S > ) {
1422
1446
qstate. ready = true ;
1423
1447
qstate. reset ( ) ;
1424
1448
assert_eq ! ( qstate. ready, false ) ;
@@ -1427,11 +1451,35 @@ mod tests {
1427
1451
}
1428
1452
1429
1453
#[ test]
1430
- fn test_reset_queue ( ) {
1431
- let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1454
+ fn test_queue_guard ( ) {
1455
+ let m = & GuestMemoryMmap :: < ( ) > :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1456
+ let vq = MockSplitQueue :: new ( m, 16 ) ;
1457
+
1458
+ let mut q = vq. create_queue ( m) ;
1459
+ do_test_queue_guard ( q. acquire ( ) ) ;
1460
+ }
1461
+
1462
+ #[ test]
1463
+ fn test_queue_guard_sync ( ) {
1464
+ let m = & GuestMemoryMmap :: < ( ) > :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1465
+ let vq = MockSplitQueue :: new ( m, 16 ) ;
1466
+
1467
+ // Note how the test_queue_guard above has "let mut" here. A singlethreaded
1468
+ // queue can only be accessed by one thread, and that one needs to have an
1469
+ // exclusive reference; a multithreaded queue can be accessed by many thread
1470
+ // and therefore it has to support interior mutability (via Mutex). On the
1471
+ // other hand, a multithreaded queue is reference counted and therefore it
1472
+ // cannot be accessed via an exclusive reference *at all*. This is the
1473
+ // the reason why only Queue has the acquire() method, and only QueueSync
1474
+ // has a lock() method.
1475
+ let q: QueueSync < _ > = vq. as_queue ( m) ;
1476
+ do_test_queue_guard ( q. lock ( ) ) ;
1477
+ }
1478
+
1479
+ fn do_test_reset_queue < ' a , Q : QueueT < & ' a AddrSpace > > ( m : & ' a AddrSpace ) {
1432
1480
let vq = MockSplitQueue :: new ( m, 16 ) ;
1433
1481
1434
- let mut q: Queue < _ > = vq. as_queue ( m) ;
1482
+ let mut q: Q = vq. as_queue ( m) ;
1435
1483
q. with ( |mut qstate| {
1436
1484
qstate. size = 8 ;
1437
1485
qstate. ready = true ;
@@ -1442,12 +1490,22 @@ mod tests {
1442
1490
}
1443
1491
1444
1492
#[ test]
1445
- fn test_needs_notification ( ) {
1493
+ fn test_reset_queue ( ) {
1446
1494
let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1495
+ do_test_reset_queue :: < Queue < & AddrSpace > > ( m) ;
1496
+ }
1497
+
1498
+ #[ test]
1499
+ fn test_reset_queue_sync ( ) {
1500
+ let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1501
+ do_test_reset_queue :: < QueueSync < & AddrSpace > > ( m) ;
1502
+ }
1503
+
1504
+ fn do_test_needs_notification < ' a , Q : QueueT < & ' a AddrSpace > > ( m : & ' a AddrSpace ) {
1447
1505
let qsize = 16 ;
1448
1506
let vq = MockSplitQueue :: new ( m, qsize) ;
1449
1507
1450
- let mut q: Queue < _ > = vq. as_queue ( m) ;
1508
+ let mut q: Q = vq. as_queue ( m) ;
1451
1509
let avail_addr = vq. avail_addr ( ) ;
1452
1510
1453
1511
// It should always return true when EVENT_IDX isn't enabled.
@@ -1491,11 +1549,21 @@ mod tests {
1491
1549
}
1492
1550
1493
1551
#[ test]
1494
- fn test_enable_disable_notification ( ) {
1552
+ fn test_needs_notification ( ) {
1495
1553
let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1554
+ do_test_needs_notification :: < Queue < & AddrSpace > > ( m) ;
1555
+ }
1556
+
1557
+ #[ test]
1558
+ fn test_needs_notification_sync ( ) {
1559
+ let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1560
+ do_test_needs_notification :: < QueueSync < & AddrSpace > > ( m) ;
1561
+ }
1562
+
1563
+ fn do_test_enable_disable_notification < ' a , Q : QueueT < & ' a AddrSpace > > ( m : & ' a AddrSpace ) {
1496
1564
let vq = MockSplitQueue :: new ( m, 16 ) ;
1497
1565
1498
- let mut q: Queue < _ > = vq. as_queue ( m) ;
1566
+ let mut q: Q = vq. as_queue ( m) ;
1499
1567
let used_addr = vq. used_addr ( ) ;
1500
1568
1501
1569
q. with ( |qstate| assert_eq ! ( qstate. event_idx_enabled, false ) ) ;
@@ -1526,4 +1594,16 @@ mod tests {
1526
1594
q. with ( |mut qstate| qstate. next_avail = Wrapping ( 8 ) ) ;
1527
1595
assert_eq ! ( q. enable_notification( ) . unwrap( ) , false ) ;
1528
1596
}
1597
+
1598
+ #[ test]
1599
+ fn test_enable_disable_notification ( ) {
1600
+ let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1601
+ do_test_enable_disable_notification :: < Queue < & AddrSpace > > ( m) ;
1602
+ }
1603
+
1604
+ #[ test]
1605
+ fn test_enable_disable_notification_sync ( ) {
1606
+ let m = & AddrSpace :: from_ranges ( & [ ( GuestAddress ( 0 ) , 0x10000 ) ] ) . unwrap ( ) ;
1607
+ do_test_enable_disable_notification :: < QueueSync < & AddrSpace > > ( m) ;
1608
+ }
1529
1609
}
0 commit comments