JSM Thread Diagram

================================================================================
Start the JSM using JSM/ON
================================================================================
                                         Note: States with stars by the names
                                               are run in C, those without are
                                               run in Java.
        RUN JSM/ON
            |
            v
+-------------------------+
| *CHECK FOR JSM*         |
|                         |
| do: Check for a running |------+
|     JSM                 |      |
+-------------------------+      |
            | [None Running]     | [Already Running]
            v                    v
+-------------------------+    DONE
| *START JVM*             |
|                         |
| do: Starts the Java VM  |
+-------------------------+
            |
            v
+-------------------------+
| *START JSM*             |
|                         |
| do: Setup IPC callbacks |
+-------------------------+
            |
            v
+-------------------------+
| *START NM*              |
|                         |
| do: Run NmClassLoader   |
+-------------------------+
            |
            v
+-------------------------+
| *PROCESS COMMANDS*      |
|                         |
| do: Wait for commands   |<--------------------------------------+
|     to run.             |                                       |
+-------------------------+                                       |
            |   |                  +-------------------------+    |
            |   | [RUN message]    | RUN COMMAND             |    | (old thread)
            |   +----------------->|                         |----+
            |                      | do: Start thread to run |
            |                      |     command and make    |
            |                      |     call-backs          |
            | [SHUTDOWN message]   +-------------------------+
            v                                   | (new Java thread)
+-------------------------+                     v
| *STOP NM*               |        +-------------------------+
|                         |        | THREAD RUN              | [run in FG]
| do: (noop for now)      |        |                         |------------+
+-------------------------+        | do: start command       |            |
            |                      +-------------------------+            |
            v                 [run in BG, Pipe] |                         |
+-------------------------+                     v                         |
| *STOP JSM*              |        +-------------------------+            |
|                         |        | NEW MIDAS THREAD        |            |
| do: Remove IPC callbacks|        |                         | (new thrd) |
+-------------------------+        | do: create a thread to  |----+       |
            |                      |     run command in.     |    |       |
            v                      +-------------------------+    |       |
+-------------------------+                    | (old thread)     |       |
| *STOP JVM*              |                    v                  |       |
|                         |                  DONE                 |       |
| do: Stops the Java VM   |                                       v       v
+-------------------------+                          +-------------------------+
            |                                        | RUN START               |
            v                                        |                         |
          DONE                                       | do: call M$SYNC and send|
                                                     |     ACK to JSM RUN      |
                                                     +-------------------------+
                                                                 |
                                                                 v
                                                     +-------------------------+
                                                     | OPEN                    |
                                                     +-------------------------+
                                                                 |
                                                  +-----+        |
                                   [not finished] |     v        v
                                                  |  +-------------------------+
                                                  +--| PROCESS                 |
                                                     +-------------------------+
                                                                 | [finished]
                                                                 v
                                                     +-------------------------+
                                                     | CLOSE                   |
                                                     +-------------------------+
                                                                 |
                                                                 v
                                                     +-------------------------+
                                                     | RUN EXIT                |
                                                     |                         |
                                                     | do: call M$RETURN       |
                                                     +-------------------------+
                                                                 |
                                                                 v
                                                               DONE


================================================================================
Run a NeXtMidas command using JSM <COMMAND>
================================================================================
          START
            |
            v
+-------------------------+
| *CHECK FOR JSM*         |
|                         | [none running]
| do: Check for a running |----------------+
|     JSM                 |                |
+-------------------------+                |
            | [already running]            |
            |                              v
            |                 +-------------------------+
            |                 | *??????*                |
            |                 |                         |
            |                 | do: ???                 |
            |                 |                         |
            |                 +-------------------------+
            |                            |  |
            |               (old thread) |  | (new thread)
            v                            |  |
+-------------------------+              |  |
| *JSM RUN*               |<-------------+  +--------> START JVM
|                         |
| do: Send RUN to PROCESS |
|     COMMANDS via IPC,   |
|     wait for ACK        |
+-------------------------+
            | [got ACK]
            v
          DONE


================================================================================
Turn off the JSM using JSM/OFF
================================================================================
          START
            |
            v
+-------------------------+
| *CHECK FOR JSM*         |
|                         | [none running]
| do: Check for a running |-------------+
|     JSM                 |             |
+-------------------------+             |
            | [already running]         |
            v                           v      
+-------------------------+           DONE
| *STOP JSM*              |
|                         |
| do: Send SHUTDOWN to    |
|     PROCESS COMMANDS via|
|     IPC, wait for ACK   |
+-------------------------+
            | [got ACK]
            v
          DONE