[gnio/connection-factory] Stop socket service when thread pool is full
- From: Alexander Larsson <alexl src gnome org>
- To: svn-commits-list gnome org
- Subject: [gnio/connection-factory] Stop socket service when thread pool is full
- Date: Mon, 11 May 2009 15:26:17 -0400 (EDT)
commit e998aeb3a99ebd851f38b471cbc2984e63ab8f7f
Author: Alexander Larsson <alexl redhat com>
Date: Mon May 11 21:25:06 2009 +0200
Stop socket service when thread pool is full
This way we won't accept any new sockets when we're not processing
the currently executing ones.
---
gio/gthreadedsocketservice.c | 17 +++++++++++++++++
1 files changed, 17 insertions(+), 0 deletions(-)
diff --git a/gio/gthreadedsocketservice.c b/gio/gthreadedsocketservice.c
index ff2fe89..990a0f5 100644
--- a/gio/gthreadedsocketservice.c
+++ b/gio/gthreadedsocketservice.c
@@ -38,10 +38,13 @@ G_DEFINE_TYPE (GThreadedSocketService,
g_threaded_socket_service,
G_TYPE_SOCKET_SERVICE);
+G_LOCK_DEFINE_STATIC(job_count);
+
struct _GThreadedSocketServicePrivate
{
GThreadPool *thread_pool;
int max_threads;
+ gint job_count;
};
typedef struct
@@ -55,6 +58,7 @@ static void
g_threaded_socket_service_func (gpointer _data,
gpointer user_data)
{
+ GThreadedSocketService *threaded = user_data;
GThreadedSocketServiceData *data = _data;
gboolean result;
@@ -66,6 +70,11 @@ g_threaded_socket_service_func (gpointer _data,
if (data->source_object)
g_object_unref (data->source_object);
g_slice_free (GThreadedSocketServiceData, data);
+
+ G_LOCK (job_count);
+ if (threaded->priv->job_count-- == threaded->priv->max_threads)
+ g_socket_service_start (G_SOCKET_SERVICE (threaded));
+ G_UNLOCK (job_count);
}
static gboolean
@@ -86,7 +95,15 @@ g_threaded_socket_service_incoming (GSocketService *service,
else
data->source_object = NULL;
+ G_LOCK (job_count);
+ if (++threaded->priv->job_count == threaded->priv->max_threads)
+ g_socket_service_stop (service);
+ G_UNLOCK (job_count);
+
g_thread_pool_push (threaded->priv->thread_pool, data, NULL);
+
+
+
return FALSE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]