[gnio/connection-factory] Stop socket service when thread pool is full



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]