mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-04 17:52:29 +00:00
server: add max-thread property
This commit is contained in:
parent
8523c9ca92
commit
06cadebe71
2 changed files with 71 additions and 7 deletions
|
@ -28,6 +28,7 @@
|
||||||
/* #define DEFAULT_ADDRESS "::0" */
|
/* #define DEFAULT_ADDRESS "::0" */
|
||||||
#define DEFAULT_SERVICE "8554"
|
#define DEFAULT_SERVICE "8554"
|
||||||
#define DEFAULT_BACKLOG 5
|
#define DEFAULT_BACKLOG 5
|
||||||
|
#define DEFAULT_MAX_THREADS 0
|
||||||
|
|
||||||
/* Define to use the SO_LINGER option so that the server sockets can be resused
|
/* Define to use the SO_LINGER option so that the server sockets can be resused
|
||||||
* sooner. Disabled for now because it is not very well implemented by various
|
* sooner. Disabled for now because it is not very well implemented by various
|
||||||
|
@ -44,6 +45,7 @@ enum
|
||||||
|
|
||||||
PROP_SESSION_POOL,
|
PROP_SESSION_POOL,
|
||||||
PROP_MEDIA_MAPPING,
|
PROP_MEDIA_MAPPING,
|
||||||
|
PROP_MAX_THREADS,
|
||||||
PROP_LAST
|
PROP_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -153,6 +155,18 @@ gst_rtsp_server_class_init (GstRTSPServerClass * klass)
|
||||||
"The media mapping to use for client session",
|
"The media mapping to use for client session",
|
||||||
GST_TYPE_RTSP_MEDIA_MAPPING,
|
GST_TYPE_RTSP_MEDIA_MAPPING,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
/**
|
||||||
|
* GstRTSPServer::max-threads:
|
||||||
|
*
|
||||||
|
* The maximum amount of threads to use for client connections. A value of
|
||||||
|
* 0 means to use only the mainloop, -1 means an unlimited amount of
|
||||||
|
* threads.
|
||||||
|
*/
|
||||||
|
g_object_class_install_property (gobject_class, PROP_MAX_THREADS,
|
||||||
|
g_param_spec_int ("max-threads", "Max Threads",
|
||||||
|
"The maximum amount of threads to use for client connections "
|
||||||
|
"(0 = only mainloop, -1 = unlimited)", -1, G_MAXINT,
|
||||||
|
DEFAULT_MAX_THREADS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
gst_rtsp_server_signals[SIGNAL_CLIENT_CONNECTED] =
|
gst_rtsp_server_signals[SIGNAL_CLIENT_CONNECTED] =
|
||||||
g_signal_new ("client-connected", G_TYPE_FROM_CLASS (gobject_class),
|
g_signal_new ("client-connected", G_TYPE_FROM_CLASS (gobject_class),
|
||||||
|
@ -531,6 +545,49 @@ gst_rtsp_server_get_auth (GstRTSPServer * server)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_rtsp_server_set_max_threads:
|
||||||
|
* @server: a #GstRTSPServer
|
||||||
|
* @max_threads: maximum threads
|
||||||
|
*
|
||||||
|
* Set the maximum threads used by the server to handle client requests.
|
||||||
|
* A value of 0 will use the server mainloop, a value of -1 will use an
|
||||||
|
* unlimited number of threads.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_rtsp_server_set_max_threads (GstRTSPServer * server, gint max_threads)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GST_IS_RTSP_SERVER (server));
|
||||||
|
|
||||||
|
GST_RTSP_SERVER_LOCK (server);
|
||||||
|
server->max_threads = max_threads;
|
||||||
|
GST_RTSP_SERVER_UNLOCK (server);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_rtsp_server_get_max_threads:
|
||||||
|
* @server: a #GstRTSPServer
|
||||||
|
*
|
||||||
|
* Get the maximum number of threads used for client connections.
|
||||||
|
* See gst_rtsp_server_set_max_threads().
|
||||||
|
*
|
||||||
|
* Returns: the maximum number of threads.
|
||||||
|
*/
|
||||||
|
gint
|
||||||
|
gst_rtsp_server_get_max_threads (GstRTSPServer * server)
|
||||||
|
{
|
||||||
|
gint res;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_RTSP_SERVER (server), -1);
|
||||||
|
|
||||||
|
GST_RTSP_SERVER_LOCK (server);
|
||||||
|
res = server->max_threads;
|
||||||
|
GST_RTSP_SERVER_UNLOCK (server);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_rtsp_server_get_property (GObject * object, guint propid,
|
gst_rtsp_server_get_property (GObject * object, guint propid,
|
||||||
GValue * value, GParamSpec * pspec)
|
GValue * value, GParamSpec * pspec)
|
||||||
|
@ -556,6 +613,9 @@ gst_rtsp_server_get_property (GObject * object, guint propid,
|
||||||
case PROP_MEDIA_MAPPING:
|
case PROP_MEDIA_MAPPING:
|
||||||
g_value_take_object (value, gst_rtsp_server_get_media_mapping (server));
|
g_value_take_object (value, gst_rtsp_server_get_media_mapping (server));
|
||||||
break;
|
break;
|
||||||
|
case PROP_MAX_THREADS:
|
||||||
|
g_value_set_int (value, gst_rtsp_server_get_max_threads (server));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec);
|
||||||
}
|
}
|
||||||
|
@ -583,6 +643,9 @@ gst_rtsp_server_set_property (GObject * object, guint propid,
|
||||||
case PROP_MEDIA_MAPPING:
|
case PROP_MEDIA_MAPPING:
|
||||||
gst_rtsp_server_set_media_mapping (server, g_value_get_object (value));
|
gst_rtsp_server_set_media_mapping (server, g_value_get_object (value));
|
||||||
break;
|
break;
|
||||||
|
case PROP_MAX_THREADS:
|
||||||
|
gst_rtsp_server_set_max_threads (server, g_value_get_int (value));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec);
|
||||||
}
|
}
|
||||||
|
@ -819,8 +882,7 @@ manage_client (GstRTSPServer * server, GstRTSPClient * client)
|
||||||
ctx = g_slice_new0 (ClientContext);
|
ctx = g_slice_new0 (ClientContext);
|
||||||
ctx->server = server;
|
ctx->server = server;
|
||||||
ctx->client = client;
|
ctx->client = client;
|
||||||
#if 1
|
if (server->max_threads == 0) {
|
||||||
{
|
|
||||||
GSource *source;
|
GSource *source;
|
||||||
|
|
||||||
/* find the context to add the watch */
|
/* find the context to add the watch */
|
||||||
|
@ -828,12 +890,10 @@ manage_client (GstRTSPServer * server, GstRTSPClient * client)
|
||||||
ctx->context = g_main_context_ref (g_source_get_context (source));
|
ctx->context = g_main_context_ref (g_source_get_context (source));
|
||||||
else
|
else
|
||||||
ctx->context = NULL;
|
ctx->context = NULL;
|
||||||
|
} else {
|
||||||
|
ctx->context = g_main_context_new ();
|
||||||
|
ctx->loop = g_main_loop_new (ctx->context, TRUE);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
ctx->context = g_main_context_new ();
|
|
||||||
ctx->loop = g_main_loop_new (ctx->context, TRUE);
|
|
||||||
ctx->dothread = TRUE;
|
|
||||||
#endif
|
|
||||||
gst_rtsp_client_attach (client, ctx->context);
|
gst_rtsp_client_attach (client, ctx->context);
|
||||||
|
|
||||||
GST_RTSP_SERVER_LOCK (server);
|
GST_RTSP_SERVER_LOCK (server);
|
||||||
|
|
|
@ -61,6 +61,7 @@ struct _GstRTSPServer {
|
||||||
gchar *address;
|
gchar *address;
|
||||||
gchar *service;
|
gchar *service;
|
||||||
gint backlog;
|
gint backlog;
|
||||||
|
gint max_threads;
|
||||||
|
|
||||||
GSocket *socket;
|
GSocket *socket;
|
||||||
|
|
||||||
|
@ -122,6 +123,9 @@ GstRTSPMediaMapping * gst_rtsp_server_get_media_mapping (GstRTSPServer *serve
|
||||||
void gst_rtsp_server_set_auth (GstRTSPServer *server, GstRTSPAuth *auth);
|
void gst_rtsp_server_set_auth (GstRTSPServer *server, GstRTSPAuth *auth);
|
||||||
GstRTSPAuth * gst_rtsp_server_get_auth (GstRTSPServer *server);
|
GstRTSPAuth * gst_rtsp_server_get_auth (GstRTSPServer *server);
|
||||||
|
|
||||||
|
void gst_rtsp_server_set_max_threads (GstRTSPServer *server, gint max_threads);
|
||||||
|
gint gst_rtsp_server_get_max_threads (GstRTSPServer *server);
|
||||||
|
|
||||||
gboolean gst_rtsp_server_transfer_connection (GstRTSPServer * server, GSocket *socket,
|
gboolean gst_rtsp_server_transfer_connection (GstRTSPServer * server, GSocket *socket,
|
||||||
const gchar * ip, gint port,
|
const gchar * ip, gint port,
|
||||||
const gchar *initial_buffer);
|
const gchar *initial_buffer);
|
||||||
|
|
Loading…
Reference in a new issue