Hi Padovan,
On 02/11/2010 01:23 AM, Gustavo F. Padovan wrote:
* Zhenhua Zhang<zhenhua.zh...@intel.com> [2010-02-10 16:13:40 +0800]:
+
+ for (i = 0; i< MAX_BUFFER_NUM; i++) {
+#ifdef WRITE_SCHEDULER_DEBUG
+ buf = ring_buffer_new(4);
+#else
+ buf = ring_buffer_new(4096);
+#endif
Why not a macro to define buf size? So you don't need to use ifdef
everytime
#ifdef WRITE_SCHEDULER_DEBUG
BUF_SIZE = 4
#else
BUF_SIZE = 4096
#endif
Good suggestion. We can use a macro to define the buffer size.
+ if (!buf)
+ return FALSE;
+
+ server->free_list = g_slist_prepend(server->free_list, buf);
+ }
+
+ return TRUE;
+}
+
+static void free_ring_buffer(struct ring_buffer *buf)
+{
+ ring_buffer_free(buf);
+}
This seems pointless to me.
It just remind me to call ring_buffer_free. Yes. I can remove it and
call ring_buffer_free in g_slist_foreach() directly.
+
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 */
+ ring_buffer_free(server->write_buf);
+ server->write_buf = NULL;
+
+ if (server->full_list)
+ g_slist_foreach(server->full_list, (GFunc)free_ring_buffer,
+ NULL);
+
+ if (server->free_list)
+ g_slist_foreach(server->free_list, (GFunc)free_ring_buffer,
+ NULL);
+
server->channel = NULL;
}
@@ -446,8 +507,6 @@ 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);
@@ -455,6 +514,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 +559,22 @@ GAtServer *g_at_server_new(GIOChannel *io)
v250_settings_create(&server->v250);
server->channel = io;
server->read_buf = ring_buffer_new(4096);
- server->max_read_attempts = 3;
-
if (!server->read_buf)
goto error;
+#ifdef WRITE_SCHEDULER_DEBUG
+ server->write_buf = ring_buffer_new(4);
+#else
+ server->write_buf = ring_buffer_new(4096);
+#endif
+ if (!server->write_buf)
+ goto error;
+
+ if (!alloc_free_list(server))
+ goto error;
+
+ server->max_read_attempts = 3;
+
if (!g_at_util_setup_io(server->channel, G_IO_FLAG_NONBLOCK))
goto error;
@@ -502,6 +589,13 @@ error:
if (server->read_buf)
ring_buffer_free(server->read_buf);
+ if (server->write_buf)
+ ring_buffer_free(server->write_buf);
+
+ if (server->free_list)
+ g_slist_foreach(server->free_list, (GFunc)free_ring_buffer,
+ NULL);
+
if (server)
g_free(server);
@@ -552,6 +646,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
_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono
_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono