| 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 (*) |
| |