diff --git a/gst/gstbufferpool-default.c b/gst/gstbufferpool-default.c index f9caa13a38..a36b652ca9 100644 --- a/gst/gstbufferpool-default.c +++ b/gst/gstbufferpool-default.c @@ -151,8 +151,16 @@ _gst_buffer_pool_default_free (GstData *data) GstBufferPool *pool = (GstBufferPool*) data; GstBufferPoolDefault *def = (GstBufferPoolDefault*) pool->user_data; GstMemChunk *data_chunk = def->mem_chunk; + guint real_buffer_size; - GST_DEBUG (GST_CAT_BUFFER, "destroying default buffer pool %p", pool); + real_buffer_size = (((def->size-1) / 32) + 1) * 32; + + GST_DEBUG (GST_CAT_BUFFER,"destroying default buffer pool %p bytes:%d size:%d", + pool, real_buffer_size, def->size); + + g_mutex_lock (_default_pool_lock); + g_hash_table_remove (_default_pools, GINT_TO_POINTER (real_buffer_size)); + g_mutex_unlock (_default_pool_lock); /* this is broken right now, FIXME gst_mem_chunk_destroy (data_chunk); */ diff --git a/gst/gstelement.c b/gst/gstelement.c index ef9449131c..0562ba97be 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -2579,7 +2579,7 @@ gst_element_interrupt (GstElement *element) return gst_scheduler_interrupt (GST_ELEMENT_SCHED (element), element); } else - return FALSE; + return TRUE; } /** diff --git a/gst/gstscheduler.c b/gst/gstscheduler.c index 245db62e09..0436e54491 100644 --- a/gst/gstscheduler.c +++ b/gst/gstscheduler.c @@ -464,19 +464,24 @@ gst_scheduler_error (GstScheduler *sched, GstElement *element) * @element: the element requesting a yield * * Tell the scheduler to schedule another element. + * + * Returns: TRUE if the element should save its state, FALSE + * if the scheduler can perform this action itself. */ -void +gboolean gst_scheduler_yield (GstScheduler *sched, GstElement *element) { GstSchedulerClass *sclass; - g_return_if_fail (GST_IS_SCHEDULER (sched)); - g_return_if_fail (GST_IS_ELEMENT (element)); + g_return_val_if_fail (GST_IS_SCHEDULER (sched), TRUE); + g_return_val_if_fail (GST_IS_ELEMENT (element), TRUE); sclass = GST_SCHEDULER_GET_CLASS (sched); if (sclass->yield) - sclass->yield (sched, element); + return sclass->yield (sched, element); + + return TRUE; } /** diff --git a/gst/gstscheduler.h b/gst/gstscheduler.h index 45713082a0..bbac780722 100644 --- a/gst/gstscheduler.h +++ b/gst/gstscheduler.h @@ -89,7 +89,7 @@ struct _GstSchedulerClass { void (*scheduling_change) (GstScheduler *sched, GstElement *element); void (*lock_element) (GstScheduler *sched, GstElement *element); void (*unlock_element) (GstScheduler *sched, GstElement *element); - void (*yield) (GstScheduler *sched, GstElement *element); + gboolean (*yield) (GstScheduler *sched, GstElement *element); gboolean (*interrupt) (GstScheduler *sched, GstElement *element); void (*error) (GstScheduler *sched, GstElement *element); void (*pad_link) (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad); @@ -123,7 +123,7 @@ GstElementStateReturn gst_scheduler_state_transition (GstScheduler *sched, GstEl void gst_scheduler_scheduling_change (GstScheduler *sched, GstElement *element); void gst_scheduler_lock_element (GstScheduler *sched, GstElement *element); void gst_scheduler_unlock_element (GstScheduler *sched, GstElement *element); -void gst_scheduler_yield (GstScheduler *sched, GstElement *element); +gboolean gst_scheduler_yield (GstScheduler *sched, GstElement *element); gboolean gst_scheduler_interrupt (GstScheduler *sched, GstElement *element); void gst_scheduler_error (GstScheduler *sched, GstElement *element); void gst_scheduler_pad_link (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad); diff --git a/gst/schedulers/gstbasicscheduler.c b/gst/schedulers/gstbasicscheduler.c index 20d7dff065..6bef5ce652 100644 --- a/gst/schedulers/gstbasicscheduler.c +++ b/gst/schedulers/gstbasicscheduler.c @@ -116,7 +116,7 @@ static GstElementStateReturn gst_basic_scheduler_state_transition (GstScheduler *sched, GstElement *element, gint transition); static void gst_basic_scheduler_lock_element (GstScheduler *sched, GstElement *element); static void gst_basic_scheduler_unlock_element (GstScheduler *sched, GstElement *element); -static void gst_basic_scheduler_yield (GstScheduler *sched, GstElement *element); +static gboolean gst_basic_scheduler_yield (GstScheduler *sched, GstElement *element); static gboolean gst_basic_scheduler_interrupt (GstScheduler *sched, GstElement *element); static void gst_basic_scheduler_error (GstScheduler *sched, GstElement *element); static void gst_basic_scheduler_pad_link (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad); @@ -1118,7 +1118,7 @@ gst_basic_scheduler_unlock_element (GstScheduler * sched, GstElement * element) do_cothread_unlock (GST_ELEMENT_THREADSTATE (element)); } -static void +static gboolean gst_basic_scheduler_yield (GstScheduler *sched, GstElement *element) { if (GST_ELEMENT_IS_COTHREAD_STOPPING (element)) { @@ -1127,6 +1127,7 @@ gst_basic_scheduler_yield (GstScheduler *sched, GstElement *element) /* no need to do a pre_run, the cothread is stopping */ } + return FALSE; } static gboolean diff --git a/gst/schedulers/gstoptimalscheduler.c b/gst/schedulers/gstoptimalscheduler.c index 48a24f3b06..4a7ddc54bc 100644 --- a/gst/schedulers/gstoptimalscheduler.c +++ b/gst/schedulers/gstoptimalscheduler.c @@ -202,7 +202,7 @@ static GstElementStateReturn static void gst_opt_scheduler_scheduling_change (GstScheduler *sched, GstElement *element); static void gst_opt_scheduler_lock_element (GstScheduler *sched, GstElement *element); static void gst_opt_scheduler_unlock_element (GstScheduler *sched, GstElement *element); -static void gst_opt_scheduler_yield (GstScheduler *sched, GstElement *element); +static gboolean gst_opt_scheduler_yield (GstScheduler *sched, GstElement *element); static gboolean gst_opt_scheduler_interrupt (GstScheduler *sched, GstElement *element); static void gst_opt_scheduler_error (GstScheduler *sched, GstElement *element); static void gst_opt_scheduler_pad_link (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad); @@ -1214,7 +1214,7 @@ gst_opt_scheduler_unlock_element (GstScheduler *sched, GstElement *element) g_warning ("unlock element, implement me"); } -static void +static gboolean gst_opt_scheduler_yield (GstScheduler *sched, GstElement *element) { #ifdef USE_COTHREADS @@ -1224,6 +1224,12 @@ gst_opt_scheduler_yield (GstScheduler *sched, GstElement *element) get_group (element, &group); if (group && group->entry == element) do_cothread_switch (do_cothread_get_main (((GstOptScheduler*)sched)->context)); + + return FALSE; +#else + g_warning ("element %s performs a yield, please fix the element", + GST_ELEMENT_NAME (element)); + return TRUE; #endif }