EXPORT_C #endif gboolean gst_task_stop (GstTask * task) { GstTaskClass *tclass; GstTaskState old; g_return_val_if_fail (GST_IS_TASK (task), FALSE); tclass = GST_TASK_GET_CLASS (task); GST_DEBUG_OBJECT (task, "Stopping task %p", task); GST_OBJECT_LOCK (task); old = task->state; task->state = GST_TASK_STOPPED; switch (old) { case GST_TASK_STOPPED: break; case GST_TASK_PAUSED: GST_TASK_SIGNAL (task); break; case GST_TASK_STARTED: break; } GST_OBJECT_UNLOCK (task); return TRUE; }
EXPORT_C #endif gboolean gst_task_pause (GstTask * task) { GstTaskState old; g_return_val_if_fail (GST_IS_TASK (task), FALSE); GST_DEBUG_OBJECT (task, "Pausing task %p", task); GST_OBJECT_LOCK (task); if (G_UNLIKELY (GST_TASK_GET_LOCK (task) == NULL)) goto no_lock; old = task->state; task->state = GST_TASK_PAUSED; switch (old) { case GST_TASK_STOPPED: { GstTaskClass *tclass; if (task->running) break; gst_object_ref (task); task->running = TRUE; tclass = GST_TASK_GET_CLASS (task); g_static_mutex_lock (&pool_lock); g_thread_pool_push (tclass->pool, task, NULL); g_static_mutex_unlock (&pool_lock); break; } case GST_TASK_PAUSED: break; case GST_TASK_STARTED: break; } GST_OBJECT_UNLOCK (task); return TRUE; /* ERRORS */ no_lock: { GST_WARNING_OBJECT (task, "pausing task without a lock"); GST_OBJECT_UNLOCK (task); g_warning ("pausing task without a lock"); return FALSE; } }
static void gst_task_init (GstTask * task) { GstTaskClass *klass; klass = GST_TASK_GET_CLASS (task); task->priv = GST_TASK_GET_PRIVATE (task); task->running = FALSE; task->abidata.ABI.thread = NULL; task->lock = NULL; task->cond = g_cond_new (); task->state = GST_TASK_STOPPED; task->priv->prio_set = FALSE; /* use the default klass pool for this task, users can * override this later */ g_static_mutex_lock (&pool_lock); task->priv->pool = gst_object_ref (klass->pool); g_static_mutex_unlock (&pool_lock); }
EXPORT_C #endif gboolean gst_task_start (GstTask * task) { GstTaskState old; g_return_val_if_fail (GST_IS_TASK (task), FALSE); GST_DEBUG_OBJECT (task, "Starting task %p", task); GST_OBJECT_LOCK (task); if (G_UNLIKELY (GST_TASK_GET_LOCK (task) == NULL)) goto no_lock; old = task->state; task->state = GST_TASK_STARTED; switch (old) { case GST_TASK_STOPPED: { GstTaskClass *tclass; /* If the task already has a thread scheduled we don't have to do * anything. */ if (task->running) break; /* new task, push on threadpool. We ref before so * that it remains alive while on the threadpool. */ gst_object_ref (task); /* mark task as running so that a join will wait until we schedule * and exit the task function. */ task->running = TRUE; tclass = GST_TASK_GET_CLASS (task); g_static_mutex_lock (&pool_lock); g_thread_pool_push (tclass->pool, task, NULL); g_static_mutex_unlock (&pool_lock); break; } case GST_TASK_PAUSED: /* PAUSE to PLAY, signal */ GST_TASK_SIGNAL (task); break; case GST_TASK_STARTED: /* was OK */ break; } GST_OBJECT_UNLOCK (task); return TRUE; /* ERRORS */ no_lock: { GST_WARNING_OBJECT (task, "starting task without a lock"); GST_OBJECT_UNLOCK (task); g_warning ("starting task without a lock"); return FALSE; } }