* [PATCH 1/4] Rename buf to read_buf in GAtServer
@ 2010-02-09 14:59 Zhenhua Zhang
2010-02-09 14:59 ` [PATCH 2/4] Replace sprintf with snprintf Zhenhua Zhang
2010-02-10 22:39 ` [PATCH 1/4] Rename buf to read_buf in GAtServer Denis Kenzior
0 siblings, 2 replies; 7+ messages in thread
From: Zhenhua Zhang @ 2010-02-09 14:59 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 6136 bytes --]
Because we may introduce write_buf for sever response buffer.
---
gatchat/gatserver.c | 54 +++++++++++++++++++++++++-------------------------
1 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index a01ded6..16c976d 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -95,7 +95,7 @@ struct _GAtServer {
gpointer user_disconnect_data; /* User disconnect data */
GAtDebugFunc debugf; /* Debugging output function */
gpointer debug_data; /* Data to pass to debug func */
- struct ring_buffer *buf; /* Current read buffer */
+ struct ring_buffer *read_buf; /* Current read buffer */
guint max_read_attempts; /* Max reads per select */
enum ParserState parser_state;
};
@@ -257,9 +257,9 @@ out:
static char *extract_line(GAtServer *p)
{
- unsigned int wrap = ring_buffer_len_no_wrap(p->buf);
+ unsigned int wrap = ring_buffer_len_no_wrap(p->read_buf);
unsigned int pos = 0;
- unsigned char *buf = ring_buffer_read_ptr(p->buf, pos);
+ unsigned char *buf = ring_buffer_read_ptr(p->read_buf, pos);
int strip_front = 0;
int line_length = 0;
gboolean in_string = FALSE;
@@ -280,7 +280,7 @@ static char *extract_line(GAtServer *p)
pos += 1;
if (pos == wrap)
- buf = ring_buffer_read_ptr(p->buf, pos);
+ buf = ring_buffer_read_ptr(p->read_buf, pos);
}
/* We will strip AT and \r */
@@ -289,17 +289,17 @@ static char *extract_line(GAtServer *p)
line = g_try_new(char, line_length + 1);
if (!line) {
- ring_buffer_drain(p->buf, p->read_so_far);
+ ring_buffer_drain(p->read_buf, p->read_so_far);
return NULL;
}
/* Strip leading whitespace + AT */
- ring_buffer_drain(p->buf, strip_front + 2);
+ ring_buffer_drain(p->read_buf, strip_front + 2);
pos = 0;
i = 0;
- wrap = ring_buffer_len_no_wrap(p->buf);
- buf = ring_buffer_read_ptr(p->buf, pos);
+ wrap = ring_buffer_len_no_wrap(p->read_buf);
+ buf = ring_buffer_read_ptr(p->read_buf, pos);
while (pos < (p->read_so_far - strip_front - 2)) {
if (*buf == '"')
@@ -314,11 +314,11 @@ static char *extract_line(GAtServer *p)
pos += 1;
if (pos == wrap)
- buf = ring_buffer_read_ptr(p->buf, pos);
+ buf = ring_buffer_read_ptr(p->read_buf, pos);
}
/* Strip \r */
- ring_buffer_drain(p->buf, p->read_so_far - strip_front - 2);
+ ring_buffer_drain(p->read_buf, p->read_so_far - strip_front - 2);
line[i] = '\0';
@@ -327,9 +327,9 @@ static char *extract_line(GAtServer *p)
static void new_bytes(GAtServer *p)
{
- unsigned int len = ring_buffer_len(p->buf);
- unsigned int wrap = ring_buffer_len_no_wrap(p->buf);
- unsigned char *buf = ring_buffer_read_ptr(p->buf, p->read_so_far);
+ unsigned int len = ring_buffer_len(p->read_buf);
+ unsigned int wrap = ring_buffer_len_no_wrap(p->read_buf);
+ unsigned char *buf = ring_buffer_read_ptr(p->read_buf, p->read_so_far);
enum ParserState result;
while (p->server_io && (p->read_so_far < len)) {
@@ -340,7 +340,7 @@ static void new_bytes(GAtServer *p)
p->read_so_far += rbytes;
if (p->read_so_far == wrap) {
- buf = ring_buffer_read_ptr(p->buf, p->read_so_far);
+ buf = ring_buffer_read_ptr(p->read_buf, p->read_so_far);
wrap = len;
}
@@ -354,7 +354,7 @@ static void new_bytes(GAtServer *p)
* Empty commands must be OK by the DCE
*/
g_at_server_send_result(p, G_AT_SERVER_RESULT_OK);
- ring_buffer_drain(p->buf, p->read_so_far);
+ ring_buffer_drain(p->read_buf, p->read_so_far);
break;
case PARSER_RESULT_COMMAND:
@@ -364,11 +364,11 @@ static void new_bytes(GAtServer *p)
case PARSER_RESULT_REPEAT_LAST:
/* TODO */
g_at_server_send_result(p, G_AT_SERVER_RESULT_OK);
- ring_buffer_drain(p->buf, p->read_so_far);
+ ring_buffer_drain(p->read_buf, p->read_so_far);
break;
default:
- ring_buffer_drain(p->buf, p->read_so_far);
+ ring_buffer_drain(p->read_buf, p->read_so_far);
break;
}
@@ -378,7 +378,7 @@ static void new_bytes(GAtServer *p)
}
/* We're overflowing the buffer, shutdown the socket */
- if (p->buf && ring_buffer_avail(p->buf) == 0)
+ if (p->read_buf && ring_buffer_avail(p->read_buf) == 0)
g_source_remove(p->server_watch);
}
@@ -397,13 +397,13 @@ static gboolean received_data(GIOChannel *channel, GIOCondition cond,
return FALSE;
do {
- toread = ring_buffer_avail_no_wrap(server->buf);
+ toread = ring_buffer_avail_no_wrap(server->read_buf);
if (toread == 0)
break;
rbytes = 0;
- buf = ring_buffer_write_ptr(server->buf);
+ buf = ring_buffer_write_ptr(server->read_buf);
err = g_io_channel_read(channel, (char *) buf, toread, &rbytes);
g_at_util_debug_chat(TRUE, (char *)buf, rbytes,
@@ -414,7 +414,7 @@ static gboolean received_data(GIOChannel *channel, GIOCondition cond,
total_read += rbytes;
if (rbytes > 0)
- ring_buffer_write_advance(server->buf, rbytes);
+ ring_buffer_write_advance(server->read_buf, rbytes);
} while (err == G_IO_ERROR_NONE && rbytes > 0 &&
read_count < server->max_read_attempts);
@@ -434,8 +434,8 @@ static void server_watcher_destroy_notify(GAtServer *server)
{
server->server_watch = 0;
- ring_buffer_free(server->buf);
- server->buf = NULL;
+ ring_buffer_free(server->read_buf);
+ server->read_buf = NULL;
server->server_io = NULL;
@@ -470,10 +470,10 @@ GAtServer *g_at_server_new(GIOChannel *io)
server->ref_count = 1;
v250_settings_create(&server->v250);
server->server_io = io;
- server->buf = ring_buffer_new(4096);
+ server->read_buf = ring_buffer_new(4096);
server->max_read_attempts = 3;
- if (!server->buf)
+ if (!server->read_buf)
goto error;
if (!g_at_util_setup_io(server->server_io, G_IO_FLAG_NONBLOCK))
@@ -487,8 +487,8 @@ GAtServer *g_at_server_new(GIOChannel *io)
return server;
error:
- if (server->buf)
- ring_buffer_free(server->buf);
+ if (server->read_buf)
+ ring_buffer_free(server->read_buf);
if (server)
g_free(server);
--
1.6.6.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/4] Replace sprintf with snprintf
2010-02-09 14:59 [PATCH 1/4] Rename buf to read_buf in GAtServer Zhenhua Zhang
@ 2010-02-09 14:59 ` Zhenhua Zhang
2010-02-09 14:59 ` [PATCH 3/4] Rename server_io to channel Zhenhua Zhang
2010-02-10 22:40 ` [PATCH 2/4] Replace sprintf with snprintf Denis Kenzior
2010-02-10 22:39 ` [PATCH 1/4] Rename buf to read_buf in GAtServer Denis Kenzior
1 sibling, 2 replies; 7+ messages in thread
From: Zhenhua Zhang @ 2010-02-09 14:59 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 738 bytes --]
---
gatchat/gatserver.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index 16c976d..ad6afb9 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -116,9 +116,10 @@ static void g_at_server_send_result(GAtServer *server, GAtServerResult result)
return;
if (v250.is_v1)
- sprintf(buf, "%c%c%s%c%c", t, r, result_str, t, r);
+ snprintf(buf, sizeof(buf), "%c%c%s%c%c", t, r, result_str,
+ t, r);
else
- sprintf(buf, "%u%c", (unsigned int) result, t);
+ snprintf(buf, sizeof(buf), "%u%c", (unsigned int) result, t);
g_at_util_debug_chat(FALSE, buf, strlen(buf),
server->debugf, server->debug_data);
--
1.6.6.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 3/4] Rename server_io to channel
2010-02-09 14:59 ` [PATCH 2/4] Replace sprintf with snprintf Zhenhua Zhang
@ 2010-02-09 14:59 ` Zhenhua Zhang
2010-02-09 14:59 ` [PATCH 4/4] Do not trigger user disconnect at g_at_shutdown Zhenhua Zhang
2010-02-10 22:41 ` [PATCH 3/4] Rename server_io to channel Denis Kenzior
2010-02-10 22:40 ` [PATCH 2/4] Replace sprintf with snprintf Denis Kenzior
1 sibling, 2 replies; 7+ messages in thread
From: Zhenhua Zhang @ 2010-02-09 14:59 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 2289 bytes --]
To make it consistent with GAtChat.
---
gatchat/gatserver.c | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index ad6afb9..d131b0c 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -88,7 +88,7 @@ struct v250_settings {
struct _GAtServer {
gint ref_count; /* Ref count */
struct v250_settings v250; /* V.250 command setting */
- GIOChannel *server_io; /* Server IO */
+ GIOChannel *channel; /* Server IO */
int server_watch; /* Watch for server IO */
guint read_so_far; /* Number of bytes processed */
GAtDisconnectFunc user_disconnect; /* User disconnect func */
@@ -124,7 +124,7 @@ static void g_at_server_send_result(GAtServer *server, GAtServerResult result)
g_at_util_debug_chat(FALSE, buf, strlen(buf),
server->debugf, server->debug_data);
- g_io_channel_write(server->server_io, (char *) buf, strlen(buf),
+ g_io_channel_write(server->channel, (char *) buf, strlen(buf),
&wbuf);
}
@@ -333,7 +333,7 @@ static void new_bytes(GAtServer *p)
unsigned char *buf = ring_buffer_read_ptr(p->read_buf, p->read_so_far);
enum ParserState result;
- while (p->server_io && (p->read_so_far < len)) {
+ while (p->channel && (p->read_so_far < len)) {
gsize rbytes = MIN(len - p->read_so_far, wrap - p->read_so_far);
result = server_feed(p, (char *)buf, &rbytes);
@@ -438,7 +438,7 @@ static void server_watcher_destroy_notify(GAtServer *server)
ring_buffer_free(server->read_buf);
server->read_buf = NULL;
- server->server_io = NULL;
+ server->channel = NULL;
if (server->user_disconnect)
server->user_disconnect(server->user_disconnect_data);
@@ -470,14 +470,14 @@ GAtServer *g_at_server_new(GIOChannel *io)
server->ref_count = 1;
v250_settings_create(&server->v250);
- server->server_io = io;
+ server->channel = io;
server->read_buf = ring_buffer_new(4096);
server->max_read_attempts = 3;
if (!server->read_buf)
goto error;
- if (!g_at_util_setup_io(server->server_io, G_IO_FLAG_NONBLOCK))
+ 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,
--
1.6.6.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 4/4] Do not trigger user disconnect at g_at_shutdown
2010-02-09 14:59 ` [PATCH 3/4] Rename server_io to channel Zhenhua Zhang
@ 2010-02-09 14:59 ` Zhenhua Zhang
2010-02-10 22:41 ` [PATCH 3/4] Rename server_io to channel Denis Kenzior
1 sibling, 0 replies; 7+ messages in thread
From: Zhenhua Zhang @ 2010-02-09 14:59 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 3756 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 | 44 ++++++++++++++++++++++++++++++--------------
1 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index d131b0c..bf7e847 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,27 @@ 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;
+
+ server->channel = NULL;
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 +491,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 +531,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 +552,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] 7+ messages in thread
* Re: [PATCH 1/4] Rename buf to read_buf in GAtServer
2010-02-09 14:59 [PATCH 1/4] Rename buf to read_buf in GAtServer Zhenhua Zhang
2010-02-09 14:59 ` [PATCH 2/4] Replace sprintf with snprintf Zhenhua Zhang
@ 2010-02-10 22:39 ` Denis Kenzior
1 sibling, 0 replies; 7+ messages in thread
From: Denis Kenzior @ 2010-02-10 22:39 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 147 bytes --]
Hi Zhenhua,
> Because we may introduce write_buf for sever response buffer.
> ---
This patch has been applied, thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/4] Replace sprintf with snprintf
2010-02-09 14:59 ` [PATCH 2/4] Replace sprintf with snprintf Zhenhua Zhang
2010-02-09 14:59 ` [PATCH 3/4] Rename server_io to channel Zhenhua Zhang
@ 2010-02-10 22:40 ` Denis Kenzior
1 sibling, 0 replies; 7+ messages in thread
From: Denis Kenzior @ 2010-02-10 22:40 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 177 bytes --]
Hi Zhenhua,
> ---
> gatchat/gatserver.c | 5 +++--
> 1 files changed, 3 insertions(+), 2 deletions(-)
>
This patch has been applied. Thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 3/4] Rename server_io to channel
2010-02-09 14:59 ` [PATCH 3/4] Rename server_io to channel Zhenhua Zhang
2010-02-09 14:59 ` [PATCH 4/4] Do not trigger user disconnect at g_at_shutdown Zhenhua Zhang
@ 2010-02-10 22:41 ` Denis Kenzior
1 sibling, 0 replies; 7+ messages in thread
From: Denis Kenzior @ 2010-02-10 22:41 UTC (permalink / raw)
To: ofono
[-- Attachment #1: Type: text/plain, Size: 114 bytes --]
Hi Zhenhua,
> To make it consistent with GAtChat.
This patch has been applied, thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-02-10 22:41 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-09 14:59 [PATCH 1/4] Rename buf to read_buf in GAtServer Zhenhua Zhang
2010-02-09 14:59 ` [PATCH 2/4] Replace sprintf with snprintf Zhenhua Zhang
2010-02-09 14:59 ` [PATCH 3/4] Rename server_io to channel Zhenhua Zhang
2010-02-09 14:59 ` [PATCH 4/4] Do not trigger user disconnect at g_at_shutdown Zhenhua Zhang
2010-02-10 22:41 ` [PATCH 3/4] Rename server_io to channel Denis Kenzior
2010-02-10 22:40 ` [PATCH 2/4] Replace sprintf with snprintf Denis Kenzior
2010-02-10 22:39 ` [PATCH 1/4] Rename buf to read_buf in GAtServer Denis Kenzior
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox