Hello ;-) I'm Boqun Feng ```clike= // Intrusive part of a queue element struct queue_entry { struct queue_entry *next; } typedef struct queue_entry queue_entry_t; // A queue struct queue { queue_entry_t *head; queue_entry_t *tail; } // Assume q != NULL void init_queue(struct queue *q) { q->head = NULL; q->tail = NULL; } // Assume q != NULL && e != NULL void enqueue(struct queue *q, struct queue_entry *e) { e->next = NULL; if (queue == NULL) return; //lock_head T2 // T1 if (q->head == NULL) { q->head = e; } //unlock_head //T1 //lock_tail //T2 if (q->tail != NULL) { q->tail->next = e; } q->tail = e; //unlock_tail } struct queue *q = ..; init_queue(q); T1: T2: enqueue(q, e1) enqueue(q, e2); // Assume q != NULL struct queue_entry* dequeue_all(struct queue *q) { //lock_head queue_entry_t *ret = q->head; q->head = NULL; //unlock_head //lock_tail q->tail = NULL; //unlock_tail return ret; } ``` Example ```clike= struct queue q; init_queue(&q); // q is [] enqueue(&q, e1); //q->head = e1; // q is [e1] enqueue(&q, e2); // p = e1 // head->e1->e2->X // q is [e1, e2] // q struct queue_entry *p = dequeue_all(&q); // ret = head->e1->e2. // q->X // q is [] // p is [e1, e2], i.e. p == e1, e1->next == e2, and e2->next == NULL ```