* [PATCH 1/4] Do not trigger user disconnect at g_at_shutdown
@ 2010-02-26 9:56 Zhenhua Zhang
2010-02-26 9:56 ` [PATCH 2/4] Add define for read and write buffer size Zhenhua Zhang
2010-02-26 22:18 ` [PATCH 1/4] Do not trigger user disconnect at g_at_shutdown Denis Kenzior
0 siblings, 2 replies; 9+ messages in thread
From: Zhenhua Zhang @ 2010-02-26 9:56 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 3724 bytes --]
Similar to gatchat, introduce read_watcher_destroy_notify and do
not trigger user disconnect at g_at_shutdown. Delay destroy of
gatserver until read_watcher is destroyed.
---
gatchat/gatserver.c | 42 ++++++++++++++++++++++++++++--------------
1 files changed, 28 insertions(+), 14 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index d131b0c..95a9e8f 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -89,7 +89,7 @@ struct _GAtServer {
gint ref_count; /* Ref count */
struct v250_settings v250; /* V.250 command setting */
GIOChannel *channel; /* Server IO */
- int server_watch; /* Watch for server IO */
+ guint read_watch; /* GSource read id, 0 if none */
guint read_so_far; /* Number of bytes processed */
GAtDisconnectFunc user_disconnect; /* User disconnect func */
gpointer user_disconnect_data; /* User disconnect data */
@@ -98,6 +98,7 @@ struct _GAtServer {
struct ring_buffer *read_buf; /* Current read buffer */
guint max_read_attempts; /* Max reads per select */
enum ParserState parser_state;
+ gboolean destroyed; /* Re-entrancy guard */
};
static void g_at_server_send_result(GAtServer *server, GAtServerResult result)
@@ -380,7 +381,7 @@ static void new_bytes(GAtServer *p)
/* We're overflowing the buffer, shutdown the socket */
if (p->read_buf && ring_buffer_avail(p->read_buf) == 0)
- g_source_remove(p->server_watch);
+ g_source_remove(p->read_watch);
}
static gboolean received_data(GIOChannel *channel, GIOCondition cond,
@@ -431,17 +432,25 @@ static gboolean received_data(GIOChannel *channel, GIOCondition cond,
return TRUE;
}
-static void server_watcher_destroy_notify(GAtServer *server)
+static void g_at_server_cleanup(GAtServer *server)
{
- server->server_watch = 0;
-
+ /* Cleanup all received data */
ring_buffer_free(server->read_buf);
server->read_buf = NULL;
server->channel = NULL;
+}
+
+static void read_watcher_destroy_notify(GAtServer *server)
+{
+ g_at_server_cleanup(server);
+ server->read_watch = 0;
if (server->user_disconnect)
server->user_disconnect(server->user_disconnect_data);
+
+ if (server->destroyed)
+ g_free(server);
}
static void v250_settings_create(struct v250_settings *v250)
@@ -480,10 +489,10 @@ GAtServer *g_at_server_new(GIOChannel *io)
if (!g_at_util_setup_io(server->channel, G_IO_FLAG_NONBLOCK))
goto error;
- server->server_watch = g_io_add_watch_full(io, G_PRIORITY_DEFAULT,
+ server->read_watch = g_io_add_watch_full(io, G_PRIORITY_DEFAULT,
G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
received_data, server,
- (GDestroyNotify)server_watcher_destroy_notify);
+ (GDestroyNotify)read_watcher_destroy_notify);
return server;
@@ -520,6 +529,16 @@ void g_at_server_unref(GAtServer *server)
return;
g_at_server_shutdown(server);
+
+ /* glib delays the destruction of the watcher until it exits, this
+ * means we can't free the data just yet, even though we've been
+ * destroyed already. We have to wait until the read_watcher
+ * destroy function gets called
+ */
+ if (server->read_watch != 0)
+ server->destroyed = TRUE;
+ else
+ g_free(server);
}
gboolean g_at_server_shutdown(GAtServer *server)
@@ -531,13 +550,8 @@ gboolean g_at_server_shutdown(GAtServer *server)
server->user_disconnect = NULL;
server->user_disconnect_data = NULL;
- if (server->server_watch) {
- g_source_remove(server->server_watch);
- server->server_watch = 0;
- }
-
- g_free(server);
- server = NULL;
+ if (server->read_watch)
+ g_source_remove(server->read_watch);
return TRUE;
}
--
1.6.6.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/4] Add define for read and write buffer size
2010-02-26 9:56 [PATCH 1/4] Do not trigger user disconnect at g_at_shutdown Zhenhua Zhang
@ 2010-02-26 9:56 ` Zhenhua Zhang
2010-02-26 9:56 ` [PATCH 3/4] Add write buffer queue for non-blocking write Zhenhua Zhang
2010-02-26 22:19 ` [PATCH 2/4] Add define for read and write buffer size Denis Kenzior
2010-02-26 22:18 ` [PATCH 1/4] Do not trigger user disconnect at g_at_shutdown Denis Kenzior
1 sibling, 2 replies; 9+ messages in thread
From: Zhenhua Zhang @ 2010-02-26 9:56 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 723 bytes --]
---
gatchat/gatserver.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index 95a9e8f..15bbbff 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -32,6 +32,8 @@
#include "ringbuffer.h"
#include "gatserver.h"
+#define BUF_SIZE 4096
+
enum ParserState {
PARSER_STATE_IDLE,
PARSER_STATE_A,
@@ -480,7 +482,7 @@ GAtServer *g_at_server_new(GIOChannel *io)
server->ref_count = 1;
v250_settings_create(&server->v250);
server->channel = io;
- server->read_buf = ring_buffer_new(4096);
+ server->read_buf = ring_buffer_new(BUF_SIZE);
server->max_read_attempts = 3;
if (!server->read_buf)
--
1.6.6.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/4] Add write buffer queue for non-blocking write
2010-02-26 9:56 ` [PATCH 2/4] Add define for read and write buffer size Zhenhua Zhang
@ 2010-02-26 9:56 ` Zhenhua Zhang
2010-02-26 9:56 ` [PATCH 4/4] Add write server response into non-blocking IO Zhenhua Zhang
` (2 more replies)
2010-02-26 22:19 ` [PATCH 2/4] Add define for read and write buffer size Denis Kenzior
1 sibling, 3 replies; 9+ messages in thread
From: Zhenhua Zhang @ 2010-02-26 9:56 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 5682 bytes --]
The head of the queue is the data to be written, the tail is the
free buffer to cache data into.
If the tail of queue is full, allocate a new free buffer and
append it at the tail.
---
gatchat/gatserver.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 95 insertions(+), 10 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index 15bbbff..a136a6f 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -92,17 +92,56 @@ struct _GAtServer {
struct v250_settings v250; /* V.250 command setting */
GIOChannel *channel; /* Server IO */
guint read_watch; /* GSource read id, 0 if none */
+ guint write_watch; /* GSource write id, 0 if none */
guint read_so_far; /* Number of bytes processed */
GAtDisconnectFunc user_disconnect; /* User disconnect func */
gpointer user_disconnect_data; /* User disconnect data */
GAtDebugFunc debugf; /* Debugging output function */
gpointer debug_data; /* Data to pass to debug func */
struct ring_buffer *read_buf; /* Current read buffer */
+ GQueue *write_queue; /* Write buffer queue */
guint max_read_attempts; /* Max reads per select */
enum ParserState parser_state;
gboolean destroyed; /* Re-entrancy guard */
};
+static void g_at_server_wakeup_writer(GAtServer *server);
+
+static struct ring_buffer *allocate_next(GAtServer *server)
+{
+ struct ring_buffer *buf = ring_buffer_new(BUF_SIZE);
+
+ if (!buf)
+ return NULL;
+
+ g_queue_push_tail(server->write_queue, buf);
+
+ return buf;
+}
+
+static void send_common(GAtServer *server, const char *buf, unsigned int len)
+{
+ gsize towrite = len;
+ gsize bytes_written = 0;
+ struct ring_buffer *write_buf;
+
+ write_buf = g_queue_peek_tail(server->write_queue);
+
+ while (bytes_written < towrite) {
+ gsize wbytes = MIN((gsize)ring_buffer_avail(write_buf),
+ towrite - bytes_written);
+
+ bytes_written += ring_buffer_write(write_buf,
+ buf + bytes_written,
+ wbytes);
+
+ if (ring_buffer_avail(write_buf) == 0)
+ write_buf = allocate_next(server);
+ }
+
+ g_at_server_wakeup_writer(server);
+}
+
static void g_at_server_send_result(GAtServer *server, GAtServerResult result)
{
struct v250_settings v250 = server->v250;
@@ -110,7 +149,7 @@ static void g_at_server_send_result(GAtServer *server, GAtServerResult result)
char buf[1024];
char t = v250.s3;
char r = v250.s4;
- gsize wbuf;
+ unsigned int len;
if (v250.quiet)
return;
@@ -119,16 +158,13 @@ static void g_at_server_send_result(GAtServer *server, GAtServerResult result)
return;
if (v250.is_v1)
- snprintf(buf, sizeof(buf), "%c%c%s%c%c", t, r, result_str,
+ len = snprintf(buf, sizeof(buf), "%c%c%s%c%c", t, r, result_str,
t, r);
else
- snprintf(buf, sizeof(buf), "%u%c", (unsigned int) result, t);
-
- g_at_util_debug_chat(FALSE, buf, strlen(buf),
- server->debugf, server->debug_data);
+ len = snprintf(buf, sizeof(buf), "%u%c", (unsigned int) result,
+ t);
- g_io_channel_write(server->channel, (char *) buf, strlen(buf),
- &wbuf);
+ send_common(server, buf, MIN(len, sizeof(buf)-1));
}
static inline gboolean is_at_command_prefix(const char c)
@@ -434,12 +470,31 @@ static gboolean received_data(GIOChannel *channel, GIOCondition cond,
return TRUE;
}
+static gboolean can_write_data(GIOChannel *channel, GIOCondition cond,
+ gpointer data)
+{
+ return FALSE;
+}
+
+static void write_queue_free(GQueue *write_queue)
+{
+ struct ring_buffer *write_buf;
+
+ while ((write_buf = g_queue_pop_head(write_queue)))
+ ring_buffer_free(write_buf);
+
+ g_queue_free(write_queue);
+}
+
static void g_at_server_cleanup(GAtServer *server)
{
/* Cleanup all received data */
ring_buffer_free(server->read_buf);
server->read_buf = NULL;
+ /* Cleanup pending data to write */
+ write_queue_free(server->write_queue);
+
server->channel = NULL;
}
@@ -455,6 +510,23 @@ static void read_watcher_destroy_notify(GAtServer *server)
g_free(server);
}
+static void write_watcher_destroy_notify(GAtServer *server)
+{
+ server->write_watch = 0;
+}
+
+static void g_at_server_wakeup_writer(GAtServer *server)
+{
+ if (server->write_watch != 0)
+ return;
+
+ server->write_watch = g_io_add_watch_full(server->channel,
+ G_PRIORITY_DEFAULT,
+ G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
+ can_write_data, server,
+ (GDestroyNotify)write_watcher_destroy_notify);
+}
+
static void v250_settings_create(struct v250_settings *v250)
{
v250->s3 = '\r';
@@ -483,11 +555,18 @@ GAtServer *g_at_server_new(GIOChannel *io)
v250_settings_create(&server->v250);
server->channel = io;
server->read_buf = ring_buffer_new(BUF_SIZE);
- server->max_read_attempts = 3;
-
if (!server->read_buf)
goto error;
+ server->write_queue = g_queue_new();
+ if (!server->write_queue)
+ goto error;
+
+ if (!allocate_next(server))
+ goto error;
+
+ server->max_read_attempts = 3;
+
if (!g_at_util_setup_io(server->channel, G_IO_FLAG_NONBLOCK))
goto error;
@@ -502,6 +581,9 @@ error:
if (server->read_buf)
ring_buffer_free(server->read_buf);
+ if (server->write_queue)
+ write_queue_free(server->write_queue);
+
if (server)
g_free(server);
@@ -552,6 +634,9 @@ gboolean g_at_server_shutdown(GAtServer *server)
server->user_disconnect = NULL;
server->user_disconnect_data = NULL;
+ if (server->write_watch)
+ g_source_remove(server->write_watch);
+
if (server->read_watch)
g_source_remove(server->read_watch);
--
1.6.6.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/4] Add write server response into non-blocking IO
2010-02-26 9:56 ` [PATCH 3/4] Add write buffer queue for non-blocking write Zhenhua Zhang
@ 2010-02-26 9:56 ` Zhenhua Zhang
2010-02-26 22:20 ` Denis Kenzior
2010-02-26 10:02 ` [PATCH 3/4] Add write buffer queue for non-blocking write Zhenhua Zhang
2010-02-26 22:19 ` Denis Kenzior
2 siblings, 1 reply; 9+ messages in thread
From: Zhenhua Zhang @ 2010-02-26 9:56 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 2313 bytes --]
Write server response into non-blocking GIOChannel when we have
G_IO_OUT signal.
---
gatchat/gatserver.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 66 insertions(+), 0 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index a136a6f..5b5e2f7 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -33,6 +33,7 @@
#include "gatserver.h"
#define BUF_SIZE 4096
+/* #define WRITE_SCHEDULER_DEBUG 1 */
enum ParserState {
PARSER_STATE_IDLE,
@@ -473,6 +474,71 @@ static gboolean received_data(GIOChannel *channel, GIOCondition cond,
static gboolean can_write_data(GIOChannel *channel, GIOCondition cond,
gpointer data)
{
+ GAtServer *server = data;
+ GIOError err;
+ gsize bytes_written;
+ gsize towrite;
+ struct ring_buffer *write_buf;
+ unsigned char *buf;
+ gboolean write_again = FALSE;
+#ifdef WRITE_SCHEDULER_DEBUG
+ int limiter;
+#endif
+
+ if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
+ return FALSE;
+
+ if (!server->write_queue)
+ return FALSE;
+
+ /* Write data out from the head of the queue */
+ write_buf = g_queue_peek_head(server->write_queue);
+
+ buf = ring_buffer_read_ptr(write_buf, 0);
+
+ towrite = ring_buffer_len_no_wrap(write_buf);
+ if (towrite < (gsize)ring_buffer_len(write_buf))
+ write_again = TRUE;
+
+#ifdef WRITE_SCHEDULER_DEBUG
+ limiter = towrite;
+
+ if (limiter > 5)
+ limiter = 5;
+#endif
+
+ err = g_io_channel_write(server->channel,
+ (char *)buf,
+#ifdef WRITE_SCHEDULER_DEBUG
+ limiter,
+#else
+ towrite,
+#endif
+ &bytes_written);
+
+ if (err != G_IO_ERROR_NONE) {
+ g_source_remove(server->read_watch);
+ return FALSE;
+ }
+
+ g_at_util_debug_chat(FALSE, (char *)buf, bytes_written, server->debugf,
+ server->debug_data);
+
+ ring_buffer_drain(write_buf, bytes_written);
+
+ /* All data in current buffer is written, free it
+ * unless it's the last buffer in the queue.
+ */
+ if ((ring_buffer_len(write_buf) == 0) &&
+ (g_queue_get_length(server->write_queue) != 1)) {
+ write_buf = g_queue_pop_head(server->write_queue);
+ ring_buffer_free(write_buf);
+ return TRUE;
+ }
+
+ if (bytes_written < towrite || write_again == TRUE)
+ return TRUE;
+
return FALSE;
}
--
1.6.6.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 3/4] Add write buffer queue for non-blocking write
2010-02-26 9:56 ` [PATCH 3/4] Add write buffer queue for non-blocking write Zhenhua Zhang
2010-02-26 9:56 ` [PATCH 4/4] Add write server response into non-blocking IO Zhenhua Zhang
@ 2010-02-26 10:02 ` Zhenhua Zhang
2010-02-26 22:19 ` Denis Kenzior
2 siblings, 0 replies; 9+ messages in thread
From: Zhenhua Zhang @ 2010-02-26 10:02 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 5148 bytes --]
Hi Denis,
On 02/26/2010 05:56 PM, Zhang, Zhenhua wrote:
> The head of the queue is the data to be written, the tail is the
> free buffer to cache data into.
>
> If the tail of queue is full, allocate a new free buffer and
> append it at the tail.
> ---
> gatchat/gatserver.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++-----
> 1 files changed, 95 insertions(+), 10 deletions(-)
>
> +
> +static void send_common(GAtServer *server, const char *buf, unsigned int len)
> +{
> + gsize towrite = len;
> + gsize bytes_written = 0;
> + struct ring_buffer *write_buf;
> +
> + write_buf = g_queue_peek_tail(server->write_queue);
This is the updated 3/4 patch. For this write_buf, it should alway exist
since we allocate one buffer in g_at_server_new. So I don't check
write_buf here.
> + while (bytes_written< towrite) {
> + gsize wbytes = MIN((gsize)ring_buffer_avail(write_buf),
> + towrite - bytes_written);
> +
> + bytes_written += ring_buffer_write(write_buf,
> + buf + bytes_written,
> + wbytes);
> +
> + if (ring_buffer_avail(write_buf) == 0)
> + write_buf = allocate_next(server);
> + }
> +
> + g_at_server_wakeup_writer(server);
> +}
> +
> static void g_at_server_send_result(GAtServer *server, GAtServerResult result)
> {
> struct v250_settings v250 = server->v250;
> @@ -110,7 +149,7 @@ static void g_at_server_send_result(GAtServer *server, GAtServerResult result)
> char buf[1024];
> char t = v250.s3;
> char r = v250.s4;
> - gsize wbuf;
> + unsigned int len;
>
> if (v250.quiet)
> return;
> @@ -119,16 +158,13 @@ static void g_at_server_send_result(GAtServer *server, GAtServerResult result)
> return;
>
> if (v250.is_v1)
> - snprintf(buf, sizeof(buf), "%c%c%s%c%c", t, r, result_str,
> + len = snprintf(buf, sizeof(buf), "%c%c%s%c%c", t, r, result_str,
> t, r);
> else
> - snprintf(buf, sizeof(buf), "%u%c", (unsigned int) result, t);
> -
> - g_at_util_debug_chat(FALSE, buf, strlen(buf),
> - server->debugf, server->debug_data);
> + len = snprintf(buf, sizeof(buf), "%u%c", (unsigned int) result,
> + t);
>
> - g_io_channel_write(server->channel, (char *) buf, strlen(buf),
> - &wbuf);
> + send_common(server, buf, MIN(len, sizeof(buf)-1));
Update to avoid buffer overflow case. However, it's rarely possible in
g_at_server_result.
Let me know if any comments for the patches. Thanks.
Zhenhua.
> }
>
> static inline gboolean is_at_command_prefix(const char c)
> @@ -434,12 +470,31 @@ static gboolean received_data(GIOChannel *channel, GIOCondition cond,
> return TRUE;
> }
>
> +static gboolean can_write_data(GIOChannel *channel, GIOCondition cond,
> + gpointer data)
> +{
> + return FALSE;
> +}
> +
> +static void write_queue_free(GQueue *write_queue)
> +{
> + struct ring_buffer *write_buf;
> +
> + while ((write_buf = g_queue_pop_head(write_queue)))
> + ring_buffer_free(write_buf);
> +
> + g_queue_free(write_queue);
> +}
> +
> static void g_at_server_cleanup(GAtServer *server)
> {
> /* Cleanup all received data */
> ring_buffer_free(server->read_buf);
> server->read_buf = NULL;
>
> + /* Cleanup pending data to write */
> + write_queue_free(server->write_queue);
> +
> server->channel = NULL;
> }
>
> @@ -455,6 +510,23 @@ static void read_watcher_destroy_notify(GAtServer *server)
> g_free(server);
> }
>
> +static void write_watcher_destroy_notify(GAtServer *server)
> +{
> + server->write_watch = 0;
> +}
> +
> +static void g_at_server_wakeup_writer(GAtServer *server)
> +{
> + if (server->write_watch != 0)
> + return;
> +
> + server->write_watch = g_io_add_watch_full(server->channel,
> + G_PRIORITY_DEFAULT,
> + G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
> + can_write_data, server,
> + (GDestroyNotify)write_watcher_destroy_notify);
> +}
> +
> static void v250_settings_create(struct v250_settings *v250)
> {
> v250->s3 = '\r';
> @@ -483,11 +555,18 @@ GAtServer *g_at_server_new(GIOChannel *io)
> v250_settings_create(&server->v250);
> server->channel = io;
> server->read_buf = ring_buffer_new(BUF_SIZE);
> - server->max_read_attempts = 3;
> -
> if (!server->read_buf)
> goto error;
>
> + server->write_queue = g_queue_new();
> + if (!server->write_queue)
> + goto error;
> +
> + if (!allocate_next(server))
> + goto error;
> +
> + server->max_read_attempts = 3;
> +
> if (!g_at_util_setup_io(server->channel, G_IO_FLAG_NONBLOCK))
> goto error;
>
> @@ -502,6 +581,9 @@ error:
> if (server->read_buf)
> ring_buffer_free(server->read_buf);
>
> + if (server->write_queue)
> + write_queue_free(server->write_queue);
> +
> if (server)
> g_free(server);
>
> @@ -552,6 +634,9 @@ gboolean g_at_server_shutdown(GAtServer *server)
> server->user_disconnect = NULL;
> server->user_disconnect_data = NULL;
>
> + if (server->write_watch)
> + g_source_remove(server->write_watch);
> +
> if (server->read_watch)
> g_source_remove(server->read_watch);
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/4] Do not trigger user disconnect at g_at_shutdown
2010-02-26 9:56 [PATCH 1/4] Do not trigger user disconnect at g_at_shutdown Zhenhua Zhang
2010-02-26 9:56 ` [PATCH 2/4] Add define for read and write buffer size Zhenhua Zhang
@ 2010-02-26 22:18 ` Denis Kenzior
1 sibling, 0 replies; 9+ messages in thread
From: Denis Kenzior @ 2010-02-26 22:18 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 250 bytes --]
Hi Zhenhua,
> Similar to gatchat, introduce read_watcher_destroy_notify and do
> not trigger user disconnect at g_at_shutdown. Delay destroy of
> gatserver until read_watcher is destroyed.
Patch has been applied, thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] Add define for read and write buffer size
2010-02-26 9:56 ` [PATCH 2/4] Add define for read and write buffer size Zhenhua Zhang
2010-02-26 9:56 ` [PATCH 3/4] Add write buffer queue for non-blocking write Zhenhua Zhang
@ 2010-02-26 22:19 ` Denis Kenzior
1 sibling, 0 replies; 9+ messages in thread
From: Denis Kenzior @ 2010-02-26 22:19 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 170 bytes --]
Hi Zhenhua,
> ---
> gatchat/gatserver.c | 4 +++-
> 1 files changed, 3 insertions(+), 1 deletions(-)
>
Patch has been applied, thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/4] Add write buffer queue for non-blocking write
2010-02-26 9:56 ` [PATCH 3/4] Add write buffer queue for non-blocking write Zhenhua Zhang
2010-02-26 9:56 ` [PATCH 4/4] Add write server response into non-blocking IO Zhenhua Zhang
2010-02-26 10:02 ` [PATCH 3/4] Add write buffer queue for non-blocking write Zhenhua Zhang
@ 2010-02-26 22:19 ` Denis Kenzior
2 siblings, 0 replies; 9+ messages in thread
From: Denis Kenzior @ 2010-02-26 22:19 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 290 bytes --]
Hi Zhenhua,
> The head of the queue is the data to be written, the tail is the
> free buffer to cache data into.
>
> If the tail of queue is full, allocate a new free buffer and
> append it at the tail.
Patch has been applied with one minor tweak afterwards.
Thanks,
-Denis
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 4/4] Add write server response into non-blocking IO
2010-02-26 9:56 ` [PATCH 4/4] Add write server response into non-blocking IO Zhenhua Zhang
@ 2010-02-26 22:20 ` Denis Kenzior
0 siblings, 0 replies; 9+ messages in thread
From: Denis Kenzior @ 2010-02-26 22:20 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 185 bytes --]
Hi Zhenhua,
> Write server response into non-blocking GIOChannel when we have
> G_IO_OUT signal.
Patch has been applied with minor simplification afterwards.
Thanks,
-Denis
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2010-02-26 22:20 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-26 9:56 [PATCH 1/4] Do not trigger user disconnect at g_at_shutdown Zhenhua Zhang
2010-02-26 9:56 ` [PATCH 2/4] Add define for read and write buffer size Zhenhua Zhang
2010-02-26 9:56 ` [PATCH 3/4] Add write buffer queue for non-blocking write Zhenhua Zhang
2010-02-26 9:56 ` [PATCH 4/4] Add write server response into non-blocking IO Zhenhua Zhang
2010-02-26 22:20 ` Denis Kenzior
2010-02-26 10:02 ` [PATCH 3/4] Add write buffer queue for non-blocking write Zhenhua Zhang
2010-02-26 22:19 ` Denis Kenzior
2010-02-26 22:19 ` [PATCH 2/4] Add define for read and write buffer size Denis Kenzior
2010-02-26 22:18 ` [PATCH 1/4] Do not trigger user disconnect at g_at_shutdown Denis Kenzior
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.