aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2010-02-26 20:30:32 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2010-02-26 20:30:32 +0100
commit8df932a7fd1aecc5660f8b5db0f8f652db3d9474 (patch)
tree9a6997ebf15322e06a5de1f2f742a769de9f4318
parentd60c7a895e1bdfc37de7fe0a63c5c1a7b68cc0db (diff)
[write_queue] Add a generic write queue class
The write queue can be a dropin replacement for the bsc_fd. It is featuring two callbacks. One for ready read and one for ready write. Whenever there is a message in the queue the write_queue will set the BSC_FD_WRITE flag and then call the write callback. It will make sure to delete the msgb after the write function has been called. This class is intended to be be used in the osmocom, layer2, bsc_msc_ip, bsc_hack and other applications.
-rw-r--r--include/osmocore/Makefile.am2
-rw-r--r--include/osmocore/write_queue.h43
-rw-r--r--src/Makefile.am3
-rw-r--r--src/write_queue.c74
4 files changed, 120 insertions, 2 deletions
diff --git a/include/osmocore/Makefile.am b/include/osmocore/Makefile.am
index 021175283..cc9db0848 100644
--- a/include/osmocore/Makefile.am
+++ b/include/osmocore/Makefile.am
@@ -1,6 +1,6 @@
osmocore_HEADERS = signal.h linuxlist.h timer.h talloc.h msgb.h select.h \
tlv.h bitvec.h comp128.h statistics.h gsm_utils.h utils.h \
- gsmtap.h
+ gsmtap.h write_queue.h
osmocoredir = $(includedir)/osmocore
diff --git a/include/osmocore/write_queue.h b/include/osmocore/write_queue.h
new file mode 100644
index 000000000..af3d44be7
--- /dev/null
+++ b/include/osmocore/write_queue.h
@@ -0,0 +1,43 @@
+/* Generic write queue implementation */
+/*
+ * (C) 2010 by Holger Hans Peter Freyther
+ * (C) 2010 by On-Waves
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+#ifndef write_queue_h
+#define write_queue_h
+
+#include "select.h"
+#include "msgb.h"
+
+struct write_queue {
+ struct bsc_fd bfd;
+ unsigned int max_length;
+ unsigned int current_length;
+
+ struct llist_head msg_queue;
+
+ int (*read_cb)(struct bsc_fd *fd);
+ int (*write_cb)(struct bsc_fd *fd, struct msgb *msg);
+};
+
+void write_queue_init(struct write_queue *queue, int max_length);
+int write_queue_enqueue(struct write_queue *queue, struct msgb *data);
+
+#endif
diff --git a/src/Makefile.am b/src/Makefile.am
index b82b6fb10..c0c948831 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -8,4 +8,5 @@ AM_CFLAGS = -fPIC -Wall
lib_LTLIBRARIES = libosmocore.la
libosmocore_la_SOURCES = msgb.c timer.c talloc.c select.c signal.c \
- tlv_parser.c bitvec.c comp128.c gsm_utils.c statistics.c
+ tlv_parser.c bitvec.c comp128.c gsm_utils.c statistics.c \
+ write_queue.c
diff --git a/src/write_queue.c b/src/write_queue.c
new file mode 100644
index 000000000..597fbe751
--- /dev/null
+++ b/src/write_queue.c
@@ -0,0 +1,74 @@
+/* Generic write queue implementation */
+/*
+ * (C) 2010 by Holger Hans Peter Freyther
+ * (C) 2010 by On-Waves
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include <osmocore/write_queue.h>
+
+static int queue_cb(struct bsc_fd *fd, unsigned int what)
+{
+ struct write_queue *queue;
+
+ queue = container_of(fd, struct write_queue, bfd);
+
+ if (what & BSC_FD_READ)
+ queue->read_cb(fd);
+
+ if (what & 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);
+
+ if (!llist_empty(&queue->msg_queue))
+ fd->when |= BSC_FD_WRITE;
+ }
+
+ return 0;
+}
+
+void write_queue_init(struct write_queue *queue, int max_length)
+{
+ queue->max_length = max_length;
+ queue->current_length = 0;
+ queue->read_cb = NULL;
+ queue->write_cb = NULL;
+ queue->bfd.cb = queue_cb;
+ INIT_LLIST_HEAD(&queue->msg_queue);
+}
+
+int write_queue_enqueue(struct write_queue *queue, struct msgb *data)
+{
+// if (queue->current_length + 1 >= queue->max_length)
+// LOGP(DMSC, LOGL_ERROR, "The queue is full. Dropping not yet implemented.\n");
+
+ ++queue->current_length;
+ msgb_enqueue(&queue->msg_queue, data);
+ queue->bfd.when |= BSC_FD_WRITE;
+
+ return 0;
+}