* Destroy a message queue */
| 1620 | * Destroy a message queue |
| 1621 | */ |
| 1622 | static void |
| 1623 | mqueue_free(struct mqueue *mq) |
| 1624 | { |
| 1625 | struct mqueue_msg *msg; |
| 1626 | |
| 1627 | while ((msg = TAILQ_FIRST(&mq->mq_msgq)) != NULL) { |
| 1628 | TAILQ_REMOVE(&mq->mq_msgq, msg, msg_link); |
| 1629 | free(msg, M_MQUEUEDATA); |
| 1630 | } |
| 1631 | |
| 1632 | mtx_destroy(&mq->mq_mutex); |
| 1633 | seldrain(&mq->mq_rsel); |
| 1634 | seldrain(&mq->mq_wsel); |
| 1635 | knlist_destroy(&mq->mq_rsel.si_note); |
| 1636 | knlist_destroy(&mq->mq_wsel.si_note); |
| 1637 | uma_zfree(mqueue_zone, mq); |
| 1638 | atomic_add_int(&curmq, -1); |
| 1639 | } |
| 1640 | |
| 1641 | /* |
| 1642 | * Load a message from user space |
no test coverage detected