Merge branch 'master' into 0.11
[platform/upstream/gstreamer.git] / gst / gsttask.h
index 54a6cac..1417525 100644 (file)
@@ -24,6 +24,7 @@
 #define __GST_TASK_H__
 
 #include <gst/gstobject.h>
+#include <gst/gsttaskpool.h>
 
 G_BEGIN_DECLS
 
@@ -31,27 +32,28 @@ G_BEGIN_DECLS
  * GstTaskFunction:
  * @data: user data passed to the function
  *
- * A function that will repeadedly be called in the thread created by
- * a GstTask. 
+ * A function that will repeatedly be called in the thread created by
+ * a #GstTask.
  */
 typedef void         (*GstTaskFunction)          (void *data);
 
 /* --- standard type macros --- */
-#define GST_TYPE_TASK                  (gst_task_get_type ())
-#define GST_TASK(task)                 (G_TYPE_CHECK_INSTANCE_CAST ((task), GST_TYPE_TASK, GstTask))
-#define GST_IS_TASK(task)              (G_TYPE_CHECK_INSTANCE_TYPE ((task), GST_TYPE_TASK))
-#define GST_TASK_CLASS(tclass)                 (G_TYPE_CHECK_CLASS_CAST ((tclass), GST_TYPE_TASK, GstTaskClass))
-#define GST_IS_TASK_CLASS(tclass)              (G_TYPE_CHECK_CLASS_TYPE ((tclass), GST_TYPE_TASK))
-#define GST_TASK_GET_CLASS(task)       (G_TYPE_INSTANCE_GET_CLASS ((task), GST_TYPE_TASK, GstTaskClass))
-#define GST_TASK_CAST(task)                    ((GstTask*)(task))
+#define GST_TYPE_TASK                   (gst_task_get_type ())
+#define GST_TASK(task)                  (G_TYPE_CHECK_INSTANCE_CAST ((task), GST_TYPE_TASK, GstTask))
+#define GST_IS_TASK(task)               (G_TYPE_CHECK_INSTANCE_TYPE ((task), GST_TYPE_TASK))
+#define GST_TASK_CLASS(tclass)          (G_TYPE_CHECK_CLASS_CAST ((tclass), GST_TYPE_TASK, GstTaskClass))
+#define GST_IS_TASK_CLASS(tclass)       (G_TYPE_CHECK_CLASS_TYPE ((tclass), GST_TYPE_TASK))
+#define GST_TASK_GET_CLASS(task)        (G_TYPE_INSTANCE_GET_CLASS ((task), GST_TYPE_TASK, GstTaskClass))
+#define GST_TASK_CAST(task)             ((GstTask*)(task))
 
 typedef struct _GstTask GstTask;
 typedef struct _GstTaskClass GstTaskClass;
+typedef struct _GstTaskPrivate GstTaskPrivate;
 
 /**
  * GstTaskState:
  * @GST_TASK_STARTED: the task is started and running
- * @GST_TASK_STOPPED:  the task is stopped
+ * @GST_TASK_STOPPED: the task is stopped
  * @GST_TASK_PAUSED: the task is paused
  *
  * The different states a task can be in
@@ -59,7 +61,7 @@ typedef struct _GstTaskClass GstTaskClass;
 typedef enum {
   GST_TASK_STARTED,
   GST_TASK_STOPPED,
-  GST_TASK_PAUSED,
+  GST_TASK_PAUSED
 } GstTaskState;
 
 /**
@@ -68,7 +70,7 @@ typedef enum {
  *
  * Get access to the state of the task.
  */
-#define GST_TASK_STATE(task)           (GST_TASK_CAST(task)->state)
+#define GST_TASK_STATE(task)            (GST_TASK_CAST(task)->state)
 
 /**
  * GST_TASK_GET_COND:
@@ -76,28 +78,28 @@ typedef enum {
  *
  * Get access to the cond of the task.
  */
-#define GST_TASK_GET_COND(task)                (GST_TASK_CAST(task)->cond)
+#define GST_TASK_GET_COND(task)         (GST_TASK_CAST(task)->cond)
 /**
  * GST_TASK_WAIT:
  * @task: Task to wait for
  *
  * Wait for the task cond to be signalled
  */
-#define GST_TASK_WAIT(task)            g_cond_wait(GST_TASK_GET_COND (task), GST_GET_LOCK (task))
+#define GST_TASK_WAIT(task)             g_cond_wait(GST_TASK_GET_COND (task), GST_OBJECT_GET_LOCK (task))
 /**
  * GST_TASK_SIGNAL:
  * @task: Task to signal
  *
  * Signal the task cond
  */
-#define GST_TASK_SIGNAL(task)          g_cond_signal(GST_TASK_GET_COND (task))
+#define GST_TASK_SIGNAL(task)           g_cond_signal(GST_TASK_GET_COND (task))
 /**
  * GST_TASK_BROADCAST:
  * @task: Task to broadcast
  *
  * Send a broadcast signal to all waiting task conds
  */
-#define GST_TASK_BROADCAST(task)       g_cond_breadcast(GST_TASK_GET_COND (task))
+#define GST_TASK_BROADCAST(task)        g_cond_broadcast(GST_TASK_GET_COND (task))
 
 /**
  * GST_TASK_GET_LOCK:
@@ -105,16 +107,35 @@ typedef enum {
  *
  * Get access to the task lock.
  */
-#define GST_TASK_GET_LOCK(task)                (GST_TASK_CAST(task)->lock)
+#define GST_TASK_GET_LOCK(task)         (GST_TASK_CAST(task)->lock)
+
+/**
+ * GstTaskThreadCallbacks:
+ * @enter_thread: a thread is entered, this callback is called when the new
+ *   thread enters its function.
+ * @leave_thread: a thread is exiting, this is called when the thread is about
+ *   to leave its function
+ *
+ * Custom GstTask thread callback functions that can be installed. 
+ *
+ * Since: 0.10.24
+ */
+typedef struct {
+  /* manage the lifetime of the thread */
+  void      (*enter_thread)     (GstTask *task, GThread *thread, gpointer user_data);
+  void      (*leave_thread)     (GstTask *task, GThread *thread, gpointer user_data);
+  /*< private >*/
+  gpointer     _gst_reserved[GST_PADDING];
+} GstTaskThreadCallbacks;
 
 /**
  * GstTask:
  * @state: the state of the task
  * @cond: used to pause/resume the task
- * @lock: The lock taken when iterating the taskfunction
+ * @lock: The lock taken when iterating the task function
  * @func: the function executed by this task
  * @data: data passed to the task function
- * @running: a flag indicating that the task is running.
+ * @running: a flag indicating that the task is running
  *
  * The #GstTask object.
  */
@@ -123,16 +144,20 @@ struct _GstTask {
 
   /*< public >*/ /* with LOCK */
   GstTaskState     state;
-  GCond          *cond;
+  GCond           *cond;
 
   GStaticRecMutex *lock;
 
   GstTaskFunction  func;
-  gpointer        data;
+  gpointer         data;
 
-  gboolean        running;
+  gboolean         running;
 
   /*< private >*/
+  GThread         *thread;
+
+  GstTaskPrivate  *priv;
+
   gpointer _gst_reserved[GST_PADDING];
 };
 
@@ -140,28 +165,37 @@ struct _GstTaskClass {
   GstObjectClass parent_class;
 
   /*< private >*/
-  GThreadPool *pool;
+  GstTaskPool *pool;
 
   /*< private >*/
   gpointer _gst_reserved[GST_PADDING];
 };
 
-void           gst_task_cleanup_all    (void);
+void            gst_task_cleanup_all    (void);
 
 GType           gst_task_get_type       (void);
 
-GstTask*       gst_task_create         (GstTaskFunction func, gpointer data);
-void           gst_task_set_lock       (GstTask *task, GStaticRecMutex *mutex);
+GstTask*        gst_task_new            (GstTaskFunction func, gpointer data);
+void            gst_task_set_lock       (GstTask *task, GStaticRecMutex *mutex);
+void            gst_task_set_priority   (GstTask *task, GThreadPriority priority);
+
+GstTaskPool *   gst_task_get_pool       (GstTask *task);
+void            gst_task_set_pool       (GstTask *task, GstTaskPool *pool);
 
-GstTaskState   gst_task_get_state      (GstTask *task);
+void            gst_task_set_thread_callbacks  (GstTask *task,
+                                                GstTaskThreadCallbacks *callbacks,
+                                                gpointer user_data,
+                                                GDestroyNotify notify);
 
-gboolean       gst_task_start          (GstTask *task);
-gboolean       gst_task_stop           (GstTask *task);
-gboolean       gst_task_pause          (GstTask *task);
+GstTaskState    gst_task_get_state      (GstTask *task);
+gboolean        gst_task_set_state      (GstTask *task, GstTaskState state);
 
-gboolean       gst_task_join           (GstTask *task);
+gboolean        gst_task_start          (GstTask *task);
+gboolean        gst_task_stop           (GstTask *task);
+gboolean        gst_task_pause          (GstTask *task);
+
+gboolean        gst_task_join           (GstTask *task);
 
 G_END_DECLS
 
 #endif /* __GST_TASK_H__ */
-