mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
task: configure the object name as thread name
When we have prctl available, use it to set the configured object name as the thread name for better debugging. Based on patch by Robert Swain.
This commit is contained in:
parent
f089c3cceb
commit
f9c74afe62
2 changed files with 36 additions and 4 deletions
|
@ -281,6 +281,10 @@ dnl check for pthreads
|
|||
AC_CHECK_HEADERS([pthread.h], HAVE_PTHREAD_H=yes)
|
||||
AM_CONDITIONAL(HAVE_PTHREAD_H, test "x$HAVE_PTHREAD_H" = "xyes")
|
||||
|
||||
dnl check for sys/prctl
|
||||
AC_CHECK_HEADERS([sys/prctl.h], HAVE_SYS_PRCTL_H=yes)
|
||||
AM_CONDITIONAL(HAVE_SYS_PRTCL_H, test "x$HAVE_SYS_PRCTL_H" = "xyes")
|
||||
|
||||
dnl Check for valgrind.h
|
||||
dnl separate from HAVE_VALGRIND because you can have the program, but not
|
||||
dnl the dev package
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* is typically done when the demuxer can perform random access on the upstream
|
||||
* peer element for improved performance.
|
||||
*
|
||||
* Although convenience functions exist on #GstPad to start/pause/stop tasks, it
|
||||
* Although convenience functions exist on #GstPad to start/pause/stop tasks, it
|
||||
* might sometimes be needed to create a #GstTask manually if it is not related to
|
||||
* a #GstPad.
|
||||
*
|
||||
|
@ -68,6 +68,10 @@
|
|||
#include "gstinfo.h"
|
||||
#include "gsttask.h"
|
||||
|
||||
#ifdef HAVE_SYS_PRCTL_H
|
||||
#include <sys/prctl.h>
|
||||
#endif
|
||||
|
||||
GST_DEBUG_CATEGORY_STATIC (task_debug);
|
||||
#define GST_CAT_DEFAULT (task_debug)
|
||||
|
||||
|
@ -177,6 +181,27 @@ gst_task_finalize (GObject * object)
|
|||
G_OBJECT_CLASS (gst_task_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
/* should be called with the object LOCK */
|
||||
static void
|
||||
gst_task_configure_name (GstTask * task)
|
||||
{
|
||||
#ifdef HAVE_SYS_PRCTL_H
|
||||
const gchar *name;
|
||||
gchar thread_name[17] = { 0, };
|
||||
|
||||
name = GST_OBJECT_NAME (task);
|
||||
|
||||
/* set the thread name to something easily identifiable */
|
||||
if (!snprintf (thread_name, 17, "%s", GST_STR_NULL (name))) {
|
||||
GST_DEBUG_OBJECT (task, "Could not create thread name for '%s'", name);
|
||||
} else {
|
||||
GST_DEBUG_OBJECT (task, "Setting thread name to '%s'", thread_name);
|
||||
if (prctl (PR_SET_NAME, (unsigned long int) thread_name))
|
||||
GST_DEBUG_OBJECT (task, "Failed to set thread name");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
gst_task_func (GstTask * task)
|
||||
{
|
||||
|
@ -212,6 +237,9 @@ gst_task_func (GstTask * task)
|
|||
/* locking order is TASK_LOCK, LOCK */
|
||||
g_static_rec_mutex_lock (lock);
|
||||
GST_OBJECT_LOCK (task);
|
||||
/* configure the thread name now */
|
||||
gst_task_configure_name (task);
|
||||
|
||||
while (G_LIKELY (task->state != GST_TASK_STOPPED)) {
|
||||
while (G_UNLIKELY (task->state == GST_TASK_PAUSED)) {
|
||||
gint t;
|
||||
|
@ -257,8 +285,8 @@ exit:
|
|||
g_thread_set_priority (tself, G_THREAD_PRIORITY_NORMAL);
|
||||
}
|
||||
/* now we allow messing with the lock again by setting the running flag to
|
||||
* FALSE. Together with the SIGNAL this is the sign for the _join() to
|
||||
* complete.
|
||||
* FALSE. Together with the SIGNAL this is the sign for the _join() to
|
||||
* complete.
|
||||
* Note that we still have not dropped the final ref on the task. We could
|
||||
* check here if there is a pending join() going on and drop the last ref
|
||||
* before releasing the lock as we can be sure that a ref is held by the
|
||||
|
@ -709,7 +737,7 @@ gst_task_pause (GstTask * task)
|
|||
* The task will automatically be stopped with this call.
|
||||
*
|
||||
* This function cannot be called from within a task function as this
|
||||
* would cause a deadlock. The function will detect this and print a
|
||||
* would cause a deadlock. The function will detect this and print a
|
||||
* g_warning.
|
||||
*
|
||||
* Returns: %TRUE if the task could be joined.
|
||||
|
|
Loading…
Reference in a new issue