--- src/sys/kern/lwkt_msgport.c 2008/11/22 11:03:35 1.53 +++ src/sys/kern/lwkt_msgport.c 2008/11/26 15:05:42 1.54 @@ -225,6 +225,7 @@ _lwkt_initport(lwkt_port_t port, { bzero(port, sizeof(*port)); TAILQ_INIT(&port->mp_msgq); + TAILQ_INIT(&port->mp_msgq_prio); port->mp_getport = gportfn; port->mp_putport = pportfn; port->mp_waitmsg = wmsgfn; @@ -361,10 +362,16 @@ static __inline void _lwkt_pullmsg(lwkt_port_t port, lwkt_msg_t msg) { + lwkt_msg_queue *queue; + /* * normal case, remove and return the message. */ - TAILQ_REMOVE(&port->mp_msgq, msg, ms_node); + if (__predict_false(msg->ms_flags & MSGF_PRIORITY)) + queue = &port->mp_msgq_prio; + else + queue = &port->mp_msgq; + TAILQ_REMOVE(queue, msg, ms_node); msg->ms_flags &= ~MSGF_QUEUED; } @@ -372,14 +379,29 @@ static __inline void _lwkt_pushmsg(lwkt_port_t port, lwkt_msg_t msg) { + lwkt_msg_queue *queue; + msg->ms_flags |= MSGF_QUEUED; - TAILQ_INSERT_TAIL(&port->mp_msgq, msg, ms_node); + if (__predict_false(msg->ms_flags & MSGF_PRIORITY)) + queue = &port->mp_msgq_prio; + else + queue = &port->mp_msgq; + TAILQ_INSERT_TAIL(queue, msg, ms_node); } static __inline lwkt_msg_t _lwkt_pollmsg(lwkt_port_t port) { + lwkt_msg_t msg; + + msg = TAILQ_FIRST(&port->mp_msgq_prio); + if (__predict_false(msg != NULL)) + return msg; + + /* + * Priority queue has no message, fallback to non-priority queue. + */ return TAILQ_FIRST(&port->mp_msgq); }