| 1) terms | |
| -------- | |
| - the managing container (top half). This is the main thread that | |
| will create and control the main_loop. | |
| - the main_loop (bottom half), this is the thread that actually does | |
| the work. | |
| 2) state changes | |
| ================ | |
| NULL->READY | |
| ----------- | |
| precondition: | |
| At this point only the top half exists. | |
| flag GST_THREAD_ACTIVE is unset | |
| flow: (TH column 1, BH column 2, ! denotes (possible) thread switch) | |
| get mutex | |
| pthread create BH | |
| wait for spin up (release lock) ! | |
| get mutex | |
| set flag GST_THREAD_ACTIVE | |
| change state of children to READY (*) | |
| signal TH | |
| ! wait for commands (release lock) | |
| (lock reacquired after wait) | |
| unlock mutex | |
| (*) marks a spot that could potentially induce another state change. | |
| READY->NULL | |
| ----------- | |
| precondition: | |
| BH is waiting for commands. | |
| flag GST_THREAD_ACTIVE is set | |
| flow: | |
| get mutex | |
| set command for BH (NULL) | |
| signal for new command | |
| wait for ACK (release lock) ! | |
| (lock reacquired after wait for cmd) | |
| change state of children to NULL (*) | |
| signal TH | |
| unset flag GST_THREAD_ACTIVE | |
| ! unlock (release lock) | |
| ! exit | |
| (lock reacquired after wait) | |
| join | |
| unlock (release lock) | |
| READY->PAUSED | |
| ------------- | |
| precondition: | |
| BH is waiting for commands. | |
| flag GST_THREAD_ACTIVE is set | |
| flow: | |
| get mutex | |
| set command for BH (PAUSED) | |
| signal for new command | |
| wait for ACK (release lock) ! | |
| (lock reacquired after wait for cmd) | |
| change state of children to READY (*) | |
| signal TH | |
| ! wait for commands (release lock) | |
| (lock reacquired after wait) | |
| unlock (release lock) | |
| PAUSED->PLAYING | |
| --------------- | |
| precondition: | |
| BH is waiting for commands. | |
| flag GST_THREAD_ACTIVE is set | |
| flow: | |
| get mutex | |
| set command for BH (PLAYING) | |
| signal for new command | |
| wait for ACK (release lock) ! | |
| (lock reacquired after wait for cmd) | |
| change state of children to PLAYING (*) | |
| set flag GST_THREAD_SPINNING | |
| while (flag SPINNING is set) { | |
| signal TH | |
| ! unlock mutex | |
| (lock reacquired after wait) ! | |
| unlock (release lock) ! | |
| ! status = iterate() (*) | |
| lock mutex | |
| signal TH | |
| if (!status) // EOS | |
| unset SPINNING flag | |
| } | |
| signal TH | |
| ! wait for commands (release lock) | |
| PLAYING->PAUSED | |
| --------------- | |
| precondition: | |
| 1. either: | |
| BH is spinning | |
| flag GST_THREAD_ACTIVE is set | |
| flag GST_THREAD_SPINNING is set | |
| 2. or: | |
| BH is waiting for commands. | |
| flag GST_THREAD_ACTIVE is set | |
| flag GST_THREAD_SPINNING is unset | |
| flow: | |
| case 1. | |
| ! while (flag SPINNING is set) { | |
| ! signal TH | |
| ! unlock mutex | |
| get mutex ! | |
| set command for BH (PAUSED) ! | |
| unset SPINNING flag ! status = iterate () | |
| signal for new command ! | |
| wait for ACK (release lock) ! | |
| lock mutex (reacquired after iteration) | |
| if (!status) // EOS | |
| unset SPINNING flag | |
| } | |
| if (status) | |
| change state of children to READY (*) (!EOS) | |
| signal TH | |
| ! wait for commands (release lock) | |
| (lock reacquired after wait) | |
| unlock (release lock) | |
| case 2. | |
| get mutex | |
| set command for BH (PAUSED) | |
| unset SPINNING flag (nop) | |
| signal for new command | |
| wait for ACK (release lock) ! | |
| (lock reacquired after wait for cmd) | |
| change state of children to READY (*) | |
| signal TH | |
| ! wait for commands (release lock) | |
| (lock reacquired after wait) | |
| unlock (release lock) | |
| PAUSED->READY | |
| ------------- | |
| similar to READY->PAUSED | |
| TODO | |
| ---- | |
| - review | |
| - figure all state change scenarios occuring in code marked with (*) | |