All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.