X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgthreadedsocketservice.c;h=ab4bd0050b220aa87ff220202f281a5ac3a45d6e;hb=2138deb07ebb7d7e541c0cd35b966e107d1bf800;hp=f5484c24f9843e40488196b10d09da6a197f4fc9;hpb=80881826447a10b5ae3c08c9a88440eba75bcd05;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gthreadedsocketservice.c b/gio/gthreadedsocketservice.c index f5484c2..ab4bd00 100644 --- a/gio/gthreadedsocketservice.c +++ b/gio/gthreadedsocketservice.c @@ -14,35 +14,34 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . * * Authors: Ryan Lortie * Alexander Larsson */ /** - * SECTION: gthreadedsocketservice + * SECTION:gthreadedsocketservice * @title: GThreadedSocketService - * @short_description: a threaded #GSocketService + * @short_description: A threaded GSocketService + * @include: gio/gio.h * @see_also: #GSocketService. * * A #GThreadedSocketService is a simple subclass of #GSocketService * that handles incoming connections by creating a worker thread and - * dispatching the connection to it by emitting the ::run signal in - * the new thread. + * dispatching the connection to it by emitting the + * #GThreadedSocketService::run signal in the new thread. * * The signal handler may perform blocking IO and need not return * until the connection is closed. * * The service is implemented using a thread pool, so there is a - * limited amount of threads availible to serve incomming requests. + * limited amount of threads available to serve incoming requests. * The service automatically stops the #GSocketService from accepting * new connections when all threads are busy. * - * As with #GSocketService, you may connect to ::run, or subclass and - * override the default handler. + * As with #GSocketService, you may connect to #GThreadedSocketService::run, + * or subclass and override the default handler. */ #include "config.h" @@ -50,15 +49,18 @@ #include "gthreadedsocketservice.h" #include "glibintl.h" -#include "gio-marshal.h" - -#include "gioalias.h" +struct _GThreadedSocketServicePrivate +{ + GThreadPool *thread_pool; + int max_threads; + gint job_count; +}; static guint g_threaded_socket_service_run_signal; -G_DEFINE_TYPE (GThreadedSocketService, - g_threaded_socket_service, - G_TYPE_SOCKET_SERVICE); +G_DEFINE_TYPE_WITH_PRIVATE (GThreadedSocketService, + g_threaded_socket_service, + G_TYPE_SOCKET_SERVICE) enum { @@ -66,19 +68,10 @@ enum PROP_MAX_THREADS }; - G_LOCK_DEFINE_STATIC(job_count); -struct _GThreadedSocketServicePrivate -{ - GThreadPool *thread_pool; - int max_threads; - gint job_count; -}; - typedef struct { - GThreadedSocketService *service; GSocketConnection *connection; GObject *source_object; } GThreadedSocketServiceData; @@ -91,10 +84,9 @@ g_threaded_socket_service_func (gpointer _data, GThreadedSocketServiceData *data = _data; gboolean result; - g_signal_emit (data->service, g_threaded_socket_service_run_signal, + g_signal_emit (threaded, g_threaded_socket_service_run_signal, 0, data->connection, data->source_object, &result); - g_object_unref (data->service); g_object_unref (data->connection); if (data->source_object) g_object_unref (data->source_object); @@ -104,6 +96,8 @@ g_threaded_socket_service_func (gpointer _data, if (threaded->priv->job_count-- == threaded->priv->max_threads) g_socket_service_start (G_SOCKET_SERVICE (threaded)); G_UNLOCK (job_count); + + g_object_unref (threaded); } static gboolean @@ -117,7 +111,10 @@ g_threaded_socket_service_incoming (GSocketService *service, threaded = G_THREADED_SOCKET_SERVICE (service); data = g_slice_new (GThreadedSocketServiceData); - data->service = g_object_ref (service); + + /* Ref the socket service for the thread */ + g_object_ref (service); + data->connection = g_object_ref (connection); if (source_object) data->source_object = g_object_ref (source_object); @@ -139,9 +136,7 @@ g_threaded_socket_service_incoming (GSocketService *service, static void g_threaded_socket_service_init (GThreadedSocketService *service) { - service->priv = G_TYPE_INSTANCE_GET_PRIVATE (service, - G_TYPE_THREADED_SOCKET_SERVICE, - GThreadedSocketServicePrivate); + service->priv = g_threaded_socket_service_get_instance_private (service); service->priv->max_threads = 10; } @@ -164,7 +159,7 @@ g_threaded_socket_service_finalize (GObject *object) { GThreadedSocketService *service = G_THREADED_SOCKET_SERVICE (object); - g_object_unref (service->priv->thread_pool); + g_thread_pool_free (service->priv->thread_pool, FALSE, FALSE); G_OBJECT_CLASS (g_threaded_socket_service_parent_class) ->finalize (object); @@ -215,8 +210,6 @@ g_threaded_socket_service_class_init (GThreadedSocketServiceClass *class) GObjectClass *gobject_class = G_OBJECT_CLASS (class); GSocketServiceClass *ss_class = &class->parent_class; - g_type_class_add_private (class, sizeof (GThreadedSocketServicePrivate)); - gobject_class->constructed = g_threaded_socket_service_constructed; gobject_class->finalize = g_threaded_socket_service_finalize; gobject_class->set_property = g_threaded_socket_service_set_property; @@ -229,20 +222,19 @@ g_threaded_socket_service_class_init (GThreadedSocketServiceClass *class) * @service: the #GThreadedSocketService. * @connection: a new #GSocketConnection object. * @source_object: the source_object passed to g_socket_listener_add_address(). - * @returns: %TRUE if @connection has been handled. * * The ::run signal is emitted in a worker thread in response to an - * incoming connection. This thread is dedicated to handling - * @connection and may perform blocking IO. The signal handler need + * incoming connection. This thread is dedicated to handling + * @connection and may perform blocking IO. The signal handler need * not return until the connection is closed. * - * If %TRUE is returned then no other handlers are called. - **/ + * Returns: %TRUE to stop further signal handlers from being called + */ g_threaded_socket_service_run_signal = g_signal_new ("run", G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GThreadedSocketServiceClass, run), g_signal_accumulator_true_handled, NULL, - _gio_marshal_BOOLEAN__OBJECT_OBJECT, G_TYPE_BOOLEAN, + NULL, G_TYPE_BOOLEAN, 2, G_TYPE_SOCKET_CONNECTION, G_TYPE_OBJECT); g_object_class_install_property (gobject_class, PROP_MAX_THREADS, @@ -257,13 +249,16 @@ g_threaded_socket_service_class_init (GThreadedSocketServiceClass *class) /** * g_threaded_socket_service_new: - * @returns: a new #GSocketService. * @max_threads: the maximal number of threads to execute concurrently - * handling incomming clients, -1 means no limit + * handling incoming clients, -1 means no limit + * + * Creates a new #GThreadedSocketService with no listeners. Listeners + * must be added with one of the #GSocketListener "add" methods. + * + * Returns: a new #GSocketService. * - * Creates a new #GThreadedSocketService with no listeners. Listeners - * must be added with g_socket_service_add_listeners(). - **/ + * Since: 2.22 + */ GSocketService * g_threaded_socket_service_new (int max_threads) { @@ -271,6 +266,3 @@ g_threaded_socket_service_new (int max_threads) "max-threads", max_threads, NULL); } - -#define __G_THREADED_SOCKET_SERVICE_C__ -#include "gioaliasdef.c"