It is possible that the queue is cleared after the select
and before the callback for writable is called. Check if
the list is not empty brefore taking an item out of it.
struct msgb *msg;
fd->when &= ~BSC_FD_WRITE;
struct msgb *msg;
fd->when &= ~BSC_FD_WRITE;
- msg = msgb_dequeue(&queue->msg_queue);
- if (!msg)
- return -1;
- --queue->current_length;
- queue->write_cb(fd, msg);
- msgb_free(msg);
+ /* the queue might have been emptied */
+ if (!llist_empty(&queue->msg_queue)) {
+ --queue->current_length;
+
+ msg = msgb_dequeue(&queue->msg_queue);
+ queue->write_cb(fd, msg);
+ msgb_free(msg);
- if (!llist_empty(&queue->msg_queue))
- fd->when |= BSC_FD_WRITE;
+ if (!llist_empty(&queue->msg_queue))
+ fd->when |= BSC_FD_WRITE;
+ }