If current write_buf is fulled, put it into the full list and fetch
a new ring buffer from the free list.
---
gatchat/gatserver.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 60 insertions(+), 3 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index 6b40084..b5ac91e 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -130,13 +130,70 @@ static gboolean alloc_free_list(GAtServer *server)
return TRUE;
}
+static gboolean replace_write_buf(GAtServer *server)
+{
+ struct ring_buffer *free_buf;
+
+ /* Add current buffer into full list and replace current buffer
+ * by a new free buffer */
+ server->full_list = g_slist_append(server->full_list,
+ server->write_buf);
+
+ /* All free lists are exhausted. Allocate more free lists */
+ if (!server->free_list) {
+ if (!alloc_free_list(server)) {
+ /* Failed so shutdown the socket */
+ g_at_server_shutdown(server);
+
+ return FALSE;
+ }
+ }
+
+ free_buf = server->free_list->data;
+
+ server->free_list = g_slist_remove(server->free_list, free_buf);
+
+ server->write_buf = free_buf;
+
+ return TRUE;
+}
+
static void send_common(GAtServer *server, const char *buf)
{
gsize avail = ring_buffer_avail(server->write_buf);
- gsize len = strlen(buf);
+ gsize towrite = strlen(buf);
+ gsize bytes_written;
+ gsize offset = 0;
+
+ if (avail > towrite) {
+ ring_buffer_write(server->write_buf, buf, towrite);
- if (avail >= len)
- ring_buffer_write(server->write_buf, buf, len);
+ g_at_server_wakeup_writer(server);
+
+ return;
+ }
+
+ /* Write as much as we can */
+ bytes_written = ring_buffer_write(server->write_buf, buf, avail);
+ towrite -= bytes_written;
+ offset = bytes_written;
+
+ /* If current write buf is full, replace it with next free buffer */
+ if (!replace_write_buf(server))
+ return;
+
+ bytes_written = ring_buffer_write(server->write_buf, buf + offset,
+ towrite);
+ while (bytes_written < towrite) {
+ /* The next free buf is full, replace with next free one */
+ if (!replace_write_buf(server))
+ return;
+
+ towrite -= bytes_written;
+ offset += bytes_written;
+ bytes_written = ring_buffer_write(server->write_buf,
+ buf + offset, towrite);
+ }
g_at_server_wakeup_writer(server);
}
--
1.6.6.1
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono