summaryrefslogtreecommitdiffstats
path: root/src/write_queue.c
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther2011-02-15 00:42:19 +0100
committerHolger Hans Peter Freyther2011-02-15 01:01:44 +0100
commit76681bafa8013f3dac2a6b66841720e8fc78d76d (patch)
tree7fed3af4996bba99f29bd164f0f9738f0af97037 /src/write_queue.c
parent[utils] introduce ubit_dump to dump buffers of unpacked bits (diff)
downloadlibosmocore-76681bafa8013f3dac2a6b66841720e8fc78d76d.tar.gz
libosmocore-76681bafa8013f3dac2a6b66841720e8fc78d76d.tar.xz
libosmocore-76681bafa8013f3dac2a6b66841720e8fc78d76d.zip
write_queue: Only pop the queue if it is not empty
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.
Diffstat (limited to 'src/write_queue.c')
-rw-r--r--src/write_queue.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/src/write_queue.c b/src/write_queue.c
index 618a8c0..7295569 100644
--- a/src/write_queue.c
+++ b/src/write_queue.c
@@ -39,16 +39,18 @@ int write_queue_bfd_cb(struct bsc_fd *fd, unsigned int what)
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;
+ }
}
return 0;