[gst-devel] INCSCHED1: scheduling / threading branch of GStreamer
Tim 'Tool-Man' Taylor
tim at tool-man.org
Fri Mar 30 04:56:31 CEST 2001
I took the liberty of putting Matt's notes into Wiki:
<http://gstreamer.sourceforge.net/cgi-bin/wiki/moin.cgi/SchedulingAndSynchronization>
And linked to it (and the FlowNetwork) from GstDocumentation:
<http://gstreamer.sourceforge.net/cgi-bin/wiki/moin.cgi/GstDocumentation>
BTW, does anyone mind doing some mod_rewrite magic on these Wiki URLs?
Being able to shorten the above URL to something like...
http://gstreamer.sourceforge.net/Wiki/GstDocumentation
...would really be grand. Besides, having "cgi-bin" in a URL is so last
millenium ;)
Tim
Matt Howell wrote:
> erik, brent and i spent some time talking about plans for scheduling re-work
> of GStreamer. following are the notes which i'll also check into docs/random.
>
> take a look and comment / correct.
>
> matt.
>
> ps - erik and i hope to get this done within a couple of weeks.
>
> -----
>
>
>
> ------------------------------------------------------------------------
>
> -----------------------------------------------------------
> - GStreamer Scheduling / Synchronization (incsched) Notes -
> -----------------------------------------------------------
>
> These notes describe deadlock scenarios and proposed solutions for
> GStreamer. This will be implemented in the INCSCHED1 branch.
>
> I. Miscelaneous proposals
> II. Deadlock scenarios and propsed solutions
> III. State transition approach and responsibility
>
> MattH.
>
> --------------------------------
> - I. Miscalenous proposals -
> --------------------------------
>
> 1. Change the names of GstThread and GstQueue to GstPtThread and GstPtQueue
> for pthread versions of Thread and Queue.
>
> 2. Change GstPtQueue to check its pads' peers' managers and make sure
> they are different. If not, fail and generate error message. (This
> ensures a GstPtQueue straddles a pthread boundary.)
>
> 3. Change state transitions to NULL <-> READY <-> PAUSED <-> PLAYING.
>
>
> ---------------------------------------------------
> - II. Deadlock Scenarios and Proposed Solutions -
> - (in the order they will be implemented) -
> ---------------------------------------------------
>
> 1. A downstream element "waits" for a buffer from its upstream element,
> a state change happens and "pauses" the upstream element -- the
> downstream element is blocked and cannot execute its change_state.
>
> Note that this can only happen within a single GstPtQueue! Either a
> downstream element calls Pull, finds no buffer, and does a
> wait_cond(new buffer) or an upstream element calls Push, finds no
> room, and does a wait_cond(new room). Thus, GstPtQueue contains all
> the cond_wait / signal code.
>
> => The managing container (thread, pipeline) "wakes" up any sleep
> conditions of its "bottom half". (In the scenario described, it
> wakes the blocked downstream element's call to Pull.) The GstPtQueue
> cond_wait section determines that it woke up due to a pending state
> change and does a cothread_switch(0) to return to the main loop,
> which then executes the state transition.
>
> Note that a managing container will have only one sleep condition
> in its "bottom half."
>
>
> 2. Element "blocked" on getting I/O and cannot execute its change_state.
>
> => We will provide an I/O library for the elements to use that does
> not actually block. (A retry-loop with timeout or select() on
> 2 -- or more -- file descriptors: one the one you want I/O from,
> the other one that GStreamer uses to "wake" everyone up.) The
> I/O library determines that it was woken due to a pending state
> change and does a cothread_switch(0) to return to the main loop,
> which then executes the state transition.
>
> Note that a managing container will have only one elements in
> the middle of doing blocking I/O.
>
>
> 3. Element using a library (code out of its control) which blocks for
> some reason (e.g., using real blocking I/O) so main loop never gets
> run to execute change_state.
>
> => Build in some timeout in the manging container (the "top half")
> when waiting for bottom half to respond to pending state. If
> managing container times out, kill the element's thread with a
> signal (or series of signals -- escalating priority). This
> requires that the element (the "bottom half") have matching
> signal handler(s) that execute(s) the state-transition.
>
>
> --------------------------------------------------------
> - III. State-transition Approach and Responsibility -
> --------------------------------------------------------
>
> A. The "top half" context of the managing container. (This is likely the
> context of the application.)
>
> Call change_state on the managing container (GstPipeline, GstPtThread).
> If its "bottom half" (main_loop) is asleep, signal the condition to
> wake it up. Then do a cond_wait for the "bottom half" to execute the
> state transition and return (once the state has been changed).
>
>
> B. The main_loop (the "bottom half") of the managing container.
>
> Needs to check for pending state transition after every switch back from
> one of its elements. If a pending state is found, it calls change_state
> on each of its elements, signals the "top half" that the state has been
> changed, then continues executing the plan (if Playing) or puts itself
> to sleep (Paused, Ready).
>
>
> C. Element.
>
> Implement a change_state function to make transition for that element.
> The elements' change_state is what actually changes the state variable
> and notifies the scheduler that the state was changed. This function
> may also do things like close or open resources.
>
> NOTE: when an element goes through certain state transitions (e.g., from
> Paused to Ready) its state (stack) will be wiped out. If it wants to
> preserve any state or data, it needs to store the information in a safe
> place.
>
>
> D. Cothread Scheduler.
>
> Gets notified of state transition by elements' change_state functions
> then (re)set the plan accordingly. Assuming
> NULL <-> READY <-> PAUSED <-> PLAYING, some would be
>
> + Paused -> Playing: jump back where you were in the Plan and continue
> its execution
>
> + Ready -> Paused: reset the cothread pointers foreach cothread in the
> Plan (don't run)
> Scheduling03-29-01.txt
>
> Content-Type:
>
> text/plain
> Content-Encoding:
>
> 7bit
--
Tim Taylor
tim at tool-man.org
More information about the gstreamer-devel
mailing list