1 #include <darwintest.h> 2 3 #define DEVELOPMENT 0 4 #define DEBUG 0 5 #define KERNEL_PRIVATE 1 6 #define XNU_KERNEL_PRIVATE 1 7 #define KERNEL 1 8 #include <../osfmk/machine/trap.h> 9 #include <../osfmk/kern/queue.h> 10 11 T_GLOBAL_META( 12 T_META_NAMESPACE("xnu.kern"), 13 T_META_RADAR_COMPONENT_NAME("xnu"), 14 T_META_RADAR_COMPONENT_VERSION("all")); 15 16 struct qe_t2 { 17 int a; 18 queue_chain_t link; 19 int b; 20 }; 21 22 static void 23 check_queue(queue_t q, int *values, int count) 24 { 25 struct qe_t2 *e; 26 int i = 0; 27 28 queue_iterate(q, e, struct qe_t2 *, link) { 29 T_QUIET; T_EXPECT_LT(i, count, "should have elems"); 30 T_QUIET; T_EXPECT_EQ(values[i], e->a, "check elem"); 31 values++; 32 count--; 33 } 34 T_QUIET; T_EXPECT_EQ(count, i, "queue is valid"); 35 } 36 37 38 T_DECL(queue_type2, "test type 2 queues") 39 { 40 static queue_head_t head; 41 static struct qe_t2 elems[4]; 42 struct qe_t2 *e; 43 44 queue_init(&head); 45 46 for (int i = 0; i < 4; i++) { 47 e = &elems[i]; 48 e->a = e->b = i + 1; 49 queue_enter(&head, e, struct qe_t2 *, link); 50 check_queue(&head, (int[]){ 1, 2, 3, 4, }, i + 1); 51 } 52 T_PASS("building list (1, 2, 3, 4)"); 53 54 queue_remove_first(&head, e, struct qe_t2 *, link); 55 T_EXPECT_EQ(e, &elems[0], "removed elem 1"); 56 check_queue(&head, (int[]){ 2, 3, 4, }, 3); 57 58 queue_remove_first(&head, e, struct qe_t2 *, link); 59 T_EXPECT_EQ(e, &elems[1], "removed elem 2"); 60 check_queue(&head, (int[]){ 3, 4, }, 2); 61 62 queue_remove_last(&head, e, struct qe_t2 *, link); 63 T_EXPECT_EQ(e, &elems[3], "removed elem 4"); 64 check_queue(&head, (int[]){ 3 }, 1); 65 66 e = &elems[2]; 67 queue_remove(&head, e, struct qe_t2 *, link); 68 T_EXPECT_EQ(e, &elems[2], "removed elem 3"); 69 check_queue(&head, (int[]){ }, 0); 70 71 queue_enter(&head, &elems[0], struct qe_t2 *, link); 72 check_queue(&head, (int[]){ 1, }, 1); 73 74 queue_enter_first(&head, &elems[1], struct qe_t2 *, link); 75 check_queue(&head, (int[]){ 2, 1, }, 2); 76 77 queue_enter(&head, &elems[2], struct qe_t2 *, link); 78 check_queue(&head, (int[]){ 2, 1, 3, }, 3); 79 } 80