mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
rtspconnection: Fix connection_poll()
* Only check for conditions we are interested in. * Makes no sense to specify G_IO_ERR and G_IO_HUP in condition, they will always be reported if they are true. * Do not create timed source if timeout is NULL. * Correctly wait for sources to be dispatched, context_iteration() is not guaranteed to always block even if set to do so. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=726641
This commit is contained in:
parent
bf4079277d
commit
e0af857445
1 changed files with 19 additions and 22 deletions
|
@ -2313,7 +2313,6 @@ GstRTSPResult
|
||||||
gst_rtsp_connection_poll (GstRTSPConnection * conn, GstRTSPEvent events,
|
gst_rtsp_connection_poll (GstRTSPConnection * conn, GstRTSPEvent events,
|
||||||
GstRTSPEvent * revents, GTimeVal * timeout)
|
GstRTSPEvent * revents, GTimeVal * timeout)
|
||||||
{
|
{
|
||||||
GstClockTime to;
|
|
||||||
GMainContext *ctx;
|
GMainContext *ctx;
|
||||||
GSource *rs, *ws, *ts;
|
GSource *rs, *ws, *ts;
|
||||||
GIOCondition condition;
|
GIOCondition condition;
|
||||||
|
@ -2327,45 +2326,43 @@ gst_rtsp_connection_poll (GstRTSPConnection * conn, GstRTSPEvent events,
|
||||||
ctx = g_main_context_new ();
|
ctx = g_main_context_new ();
|
||||||
|
|
||||||
/* configure timeout if any */
|
/* configure timeout if any */
|
||||||
to = timeout ? GST_TIMEVAL_TO_TIME (*timeout) : GST_CLOCK_TIME_NONE;
|
|
||||||
|
|
||||||
if (timeout) {
|
if (timeout) {
|
||||||
ts = g_timeout_source_new (to / GST_MSECOND);
|
ts = g_timeout_source_new (GST_TIMEVAL_TO_TIME (*timeout) / GST_MSECOND);
|
||||||
g_source_set_dummy_callback (ts);
|
g_source_set_dummy_callback (ts);
|
||||||
g_source_attach (ts, ctx);
|
g_source_attach (ts, ctx);
|
||||||
g_source_unref (ts);
|
g_source_unref (ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
rs = g_socket_create_source (conn->read_socket,
|
if (events & GST_RTSP_EV_READ) {
|
||||||
G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP, conn->cancellable);
|
rs = g_socket_create_source (conn->read_socket, G_IO_IN | G_IO_PRI,
|
||||||
|
conn->cancellable);
|
||||||
g_source_set_dummy_callback (rs);
|
g_source_set_dummy_callback (rs);
|
||||||
g_source_attach (rs, ctx);
|
g_source_attach (rs, ctx);
|
||||||
g_source_unref (rs);
|
g_source_unref (rs);
|
||||||
|
}
|
||||||
|
|
||||||
ws = g_socket_create_source (conn->write_socket,
|
if (events & GST_RTSP_EV_WRITE) {
|
||||||
G_IO_OUT | G_IO_ERR | G_IO_HUP, conn->cancellable);
|
ws = g_socket_create_source (conn->write_socket, G_IO_OUT,
|
||||||
|
conn->cancellable);
|
||||||
g_source_set_dummy_callback (ws);
|
g_source_set_dummy_callback (ws);
|
||||||
g_source_attach (ws, ctx);
|
g_source_attach (ws, ctx);
|
||||||
g_source_unref (ws);
|
g_source_unref (ws);
|
||||||
|
}
|
||||||
|
|
||||||
/* Returns after handling all pending events */
|
/* Returns after handling all pending events */
|
||||||
g_main_context_iteration (ctx, TRUE);
|
while (!g_main_context_iteration (ctx, TRUE));
|
||||||
|
|
||||||
g_main_context_unref (ctx);
|
g_main_context_unref (ctx);
|
||||||
|
|
||||||
condition =
|
|
||||||
g_socket_condition_check (conn->read_socket,
|
|
||||||
G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP);
|
|
||||||
condition |=
|
|
||||||
g_socket_condition_check (conn->write_socket,
|
|
||||||
G_IO_OUT | G_IO_ERR | G_IO_HUP);
|
|
||||||
|
|
||||||
*revents = 0;
|
*revents = 0;
|
||||||
if (events & GST_RTSP_EV_READ) {
|
if (events & GST_RTSP_EV_READ) {
|
||||||
|
condition = g_socket_condition_check (conn->read_socket,
|
||||||
|
G_IO_IN | G_IO_PRI);
|
||||||
if ((condition & G_IO_IN) || (condition & G_IO_PRI))
|
if ((condition & G_IO_IN) || (condition & G_IO_PRI))
|
||||||
*revents |= GST_RTSP_EV_READ;
|
*revents |= GST_RTSP_EV_READ;
|
||||||
}
|
}
|
||||||
if (events & GST_RTSP_EV_WRITE) {
|
if (events & GST_RTSP_EV_WRITE) {
|
||||||
|
condition = g_socket_condition_check (conn->write_socket, G_IO_OUT);
|
||||||
if ((condition & G_IO_OUT))
|
if ((condition & G_IO_OUT))
|
||||||
*revents |= GST_RTSP_EV_WRITE;
|
*revents |= GST_RTSP_EV_WRITE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue