F.G.H. 3/19/85 LispCourse #14: Multiple Processes and the Process Status Window LispCourse #14: Multiple Processes and the Process Status Window Processes and Multiple Processes Consider how you start up a DEdit: You type "(DF FOO)" in the Lisp Exec window. This opens a DEdit window separate from the Exec window. You can then carry out your editing actions in this DEdit window. But note: as long as the DEdit window is active, the Exec window is inactive. If you try to type into the Exec window, the input goes into the DEdit input buffer. Only after you exit the DEdit, does a value (i.e., the name of the edited object) get returned in the Exec window. After the value is returned, the Exec window becomes active again and the DEdit window (if its still on the screen) becomes inactive. Conclusion: the Exec and DEdit use seprate windows but can not run simultaneously. They must "take turns". Contrast this behavior with that of TEdit: You type "(TEDIT 'FOO)" in the Lisp Exec window. This opens a TEdit window separate from the Exec window. You can then carry out your editing actions in this TEdit window. But note: TEdit reads in the file FOO (which make take some time if the file server is slow) and then immediately returns a value (usually a "nonsense" value!). The Exec window remains active. After the value is returned, you can switch back and forth between the Exec and TEdit windows, simultaneously doing edits in the TEdit window while starting another TEdit, COPYFILE, doing a DEdit, etc. in the Exec window. Conclusion: the Exec and the TEdit use separate windows and can be run simultaneously. In technical terms, TEdit runs in a separate process from the Exec while DEdit runs in the same process as the Exec. A process in computer jargon is a sequence of activities or tasks that must be carried out one after another. Interlisp-D supports multiple processes -- that is you can be carrying out several sequences of activities simultaneously. Within each of these processes or activity sequences, the activities are carried out in a strict sequential order. Across processes, several such activity sequences can be going on simultaneously. For complicated reasons, DEdit has been designed to run in the same activity sequence (i.e., process) as the Exec. When DEdit starts, the Exec goes into suspension until DEdit is finished. Diagramatically: (NIL ((.05 16.0 NIL) (TEXT (16.0 . 40.0) ("{Process}#6,61400") 1.0 (LEFT BASELINE) ( TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((16.0 37.0 134.0 16.0)) NIL)) ((0.0 200.0 NIL) (WIRE ( (16.0 . 32.0) (408.0 . 32.0) (416.0 . 32.0)) 4 (NIL (LINE 30.0 12.0)) NIL)) ((.05 16.0 NIL) (TEXT (0.0 . 8.0) ("...") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((0.0 5.0 12.0 16.0)) NIL)) ((.05 16.0 NIL) (TEXT (40.0 . 8.0) ("Exec") 1.0 (LEFT BASELINE) ( TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((40.0 5.0 35.0 16.0)) NIL)) ((0.0 8.0 NIL) (WIRE (( 120.0 . 32.0) (120.0 . 16.0)) 4 NIL NIL)) ((.05 16.0 NIL) (TEXT (184.0 . 8.0) ("DEdit") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((184.0 5.0 42.0 16.0)) NIL)) ((0.0 8.0 NIL) (WIRE ((296.0 . 16.0) (296.0 . 32.0)) 4 NIL NIL)) ((.05 16.0 NIL) (TEXT (336.0 . 8.0) ("Exec") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((336.0 5.0 35.0 16.0)) NIL)) ((.05 16.0 NIL) (TEXT (400.0 . 8.0) ("...") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((400.0 5.0 12.0 16.0)) NIL))) (0 0 421.0 53.0) 1.0 8.0 TEdit has been designed to run in a separate activity sequence (i.e., process) than the Exec. When TEdit starts, it starts up a new process. The Exec process then proceeds simultaneously with the Exec process. Diagramatically: (NIL ((.05 16.0 NIL) (TEXT (16.0 . 112.0) ("{Process}#6,61400") 1.0 (LEFT BASELINE) ( TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((16.0 109.0 134.0 16.0)) NIL)) ((0.0 200.0 NIL) (WIRE ((16.0 . 104.0) (408.0 . 104.0) (416.0 . 104.0)) 4 (NIL (LINE 30.0 12.0)) NIL)) ((.05 16.0 NIL) (TEXT (0.0 . 80.0) ("...") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) (( 0.0 77.0 12.0 16.0)) NIL)) ((.05 16.0 NIL) (TEXT (40.0 . 80.0) ("Exec") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((40.0 77.0 35.0 16.0)) NIL)) ((0.0 8.0 NIL) (WIRE ( (120.0 . 104.0) (120.0 . 88.0)) 4 NIL NIL)) ((.05 16.0 NIL) (TEXT (128.0 . 80.0) ("TEdit") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((128.0 77.0 40.0 16.0)) NIL)) (( 0.0 20.0 NIL) (WIRE ((144.0 . 72.0) (144.0 . 48.0) (144.0 . 32.0) (160.0 . 32.0)) 1 NIL NIL) ) ((0.0 8.0 NIL) (WIRE ((176.0 . 88.0) (176.0 . 104.0)) 4 NIL NIL)) ((.05 16.0 NIL) (TEXT ( 200.0 . 80.0) ("Exec") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((200.0 77.0 35.0 16.0)) NIL)) ((.05 16.0 NIL) (TEXT (160.0 . 40.0) ("{Process}#6,61457") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((160.0 37.0 134.0 16.0)) NIL)) ((0.0 116.0 NIL) (WIRE ((160.0 . 32.0) (392.0 . 32.0)) 4 (NIL NIL) NIL)) ((.05 16.0 NIL) (TEXT (256.0 . 8.0) ("TEdit") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((256.0 5.0 40.0 16.0)) NIL)) ((0.0 16.0 NIL) (WIRE ((392.0 . 48.0) (392.0 . 16.0)) 4 NIL NIL)) ((.05 16.0 NIL ) (TEXT (400.0 . 80.0) ("...") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) (( 400.0 77.0 12.0 16.0)) NIL))) (0 0 421.0 125.0) 1.0 8.0 Or if you start up two TEdits: (NIL ((.05 16.0 NIL) (TEXT (16.0 . 192.0) ("{Process}#6,61400") 1.0 (LEFT BASELINE) ( TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((16.0 189.0 134.0 16.0)) NIL)) ((0.0 200.0 NIL) (WIRE ((16.0 . 184.0) (408.0 . 184.0) (416.0 . 184.0)) 4 (NIL (LINE 30.0 12.0)) NIL)) ((.05 16.0 NIL) (TEXT (0.0 . 160.0) ("...") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ( (0.0 157.0 12.0 16.0)) NIL)) ((.05 16.0 NIL) (TEXT (40.0 . 160.0) ("Exec") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((40.0 157.0 35.0 16.0)) NIL)) ((0.0 8.0 NIL) (WIRE ((120.0 . 184.0) (120.0 . 168.0)) 4 NIL NIL)) ((.05 16.0 NIL) (TEXT (128.0 . 160.0) ("TEdit") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((128.0 157.0 40.0 16.0)) NIL)) ((0.0 60.0 NIL) (WIRE ((144.0 . 152.0) (144.0 . 48.0) (144.0 . 32.0) (160.0 . 32.0)) 1 NIL NIL)) ((0.0 8.0 NIL) (WIRE ((176.0 . 168.0) (176.0 . 184.0)) 4 NIL NIL)) ((.05 16.0 NIL) (TEXT (184.0 . 160.0) ("Exec") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((184.0 157.0 35.0 16.0)) NIL)) ((0.0 8.0 NIL) (WIRE ((232.0 . 184.0) (232.0 . 168.0)) 4 NIL NIL)) ((0.0 8.0 NIL) (WIRE ((288.0 . 168.0) (288.0 . 184.0)) 4 NIL NIL)) ((.05 16.0 NIL) (TEXT (240.0 . 160.0) ("TEdit") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) (( 240.0 157.0 40.0 16.0)) NIL)) ((.05 16.0 NIL) (TEXT (344.0 . 160.0) ("Exec") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((344.0 157.0 35.0 16.0)) NIL)) ((.05 16.0 NIL) (TEXT (400.0 . 160.0) ("...") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((400.0 157.0 12.0 16.0)) NIL)) ((0.0 20.0 NIL) (WIRE ((256.0 . 152.0) (256.0 . 128.0) ( 256.0 . 112.0) (272.0 . 112.0)) 1 NIL NIL)) ((.05 16.0 NIL) (TEXT (272.0 . 120.0) ( "{Process}#6,61457") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((272.0 117.0 134.0 16.0)) NIL)) ((0.0 84.0 NIL) (WIRE ((272.0 . 112.0) (440.0 . 112.0)) 4 (NIL (LINE 30.0 12.0)) NIL)) ((.05 16.0 NIL) (TEXT (320.0 . 88.0) ("TEdit") 1.0 (LEFT BASELINE) ( TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((320.0 85.0 40.0 16.0)) NIL)) ((.05 16.0 NIL) (TEXT ( 360.0 . 88.0) ("#2") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((360.0 85.0 20.0 16.0)) NIL)) ((0.0 16.0 NIL) (WIRE ((392.0 . 48.0) (392.0 . 16.0)) 4 NIL NIL)) ((.05 16.0 NIL) (TEXT (160.0 . 40.0) ("{Process}#6,61457") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((160.0 37.0 134.0 16.0)) NIL)) ((0.0 116.0 NIL) (WIRE ((160.0 . 32.0) ( 392.0 . 32.0)) 4 (NIL NIL) NIL)) ((.05 16.0 NIL) (TEXT (256.0 . 8.0) ("TEdit") 1.0 (LEFT BASELINE) (TIMESROMAN 12 (BOLD REGULAR REGULAR)) ((256.0 5.0 40.0 16.0)) NIL))) (0 0 445.0 205.0) 1.0 8.0 The process of starting a new process from an old one is (sometimes) called forking a process. Processes Scheduling: Time-sharing and all that Time-sharing Interlisp-D supports multiple processes in the sense that it (sometimes) appears that you can do multiple activities at once. But, your D-machine can only do ONE thing at a time. What actually happens is that Interlisp runs a little bit of one process, then a little bit of another process, then a little bit of a third process, and so on until the first process gets its turn again. It all works because most of the time in any one process is spent waiting: waiting for the user to type the next character, waiting for the file server to respond, waiting for the disk to position to the right page, etc. While the first process is waiting, the rest of the processes can run. While the rest of the processes are waiting, the first process can run. This nifty little trick is called time-sharing. The Scheduler There is a part of Interlisp called the scheduler that determines which process gets its turn to run next. The scheduler works as follows: It runs through each process in the system giving each process control (i.e., permission to run) in turn. When a process gets control, it runs until it gives up that control. When a process gives up control, the control is passed to the next process in line. This is called a cooperative scheduler because each process has to take the effort to give up control when it is waiting for something or when it feels like it has hogged-up too much time. The act of giving up control is called blocking. There are systems with preemptive schedulers that force processes to give up control at regular intervals, so that every process gets a little bit each and every second. Proceses need not worry about blocking. One feature of a cooperative scheduler is that some processes don't play by the rules: they hog as much time as they like without blocking. When this happens, other processes don't get their turns to run. For example, try starting up a TEdit. Then go back to the Exec window and start a LISTFILES on a fairly large Lisp file. Go back a starting editing in TEdit. At some point TEdit will just stop working for about 2 to 3 minutes. This is because LISTFILES goes into a part where it doesn't block for along period of time - it gets control and just hangs on to it until its work is finished, not allowing the TEdit and the other processes to have their turn to run. E.F.S. -- An Experiment: Try the following: Start a TEdit. Back in the Exec window, type "(FOR I FROM 1 do (PROMPTPRINT I))" Try to use TEdit. To kill the FOR: point in the Exec window, then type Ctrl-E. Now try the following: (Note: (BLOCK) causes a process to block!!) Start a TEdit. Back in the Exec window, type "(FOR I FROM 1 do (PROMPTPRINT I) (BLOCK))" Try to use TEdit. To kill the FOR: point in the Exec window, then type Ctrl-E. Cautionary Note: control hogging processes are just one reason for delays in Interlisp. Slow file servers are another. Don't automatically assume that if a process is slow, there is another process hogging the run time! Job Control: Starting, Killing, Restarting, Suspending, & Waking Processes You can do a variety of things to help you manage the processes running in your environment. The most important of these are the following: Starting a process (& Process Names) Most processes are started by programs forking a process to carry out a task. Examples: 1. The function TEDIT opens a TEdit window and starts a TEdit process in that window. 2. The function call (LAFITE 'ON) starts a process that runs in the Lafite Status window and checks your mail every now and then. 3. The function CROCK starts a process that updates a clock on the screen once a minute. You can also start a process by yourself from the Exec. The function ADD.PROCESS forks a new process. ADD.PROCESS takes as its first argument the form to be evaluated in the new process. Example: 10_ ( ADD.PROCESS '(COPYFILE 'A 'B)) {PROCESS}#3,65600 11_ Normally, COPYFILE runs as part of the Exec process, i.e., it doesn't automatically fork a process to do its work. Using ADD.PROCESS will start a new process and do a COPYFILE within that process. The COPYFILE will just run until its done. While its running, you can progress with whatever you want in the Exec, including starting another COPYFILE. Process Names: Every process has a name. The name is usually the CAR of the form in the call to ADD.PROCESS. Thus the process created in the example above would have the name COPYFILE. If there is already a process with that name, a number is tacked onto the end of the name. For example, COPYFILE#2. You can also give the process a name using (ADD.PROCESS Form 'NAME ProcessName). For example, (ADD.PROCESS '(COPYFILE 'A 'B) 'NAME 'AtoB) would start a process named "AtoB". Killing a process Most processes just evaluate a single function call as in the COPYFILE example above. These processes normally just run until the evaluation is completed. Then they just disappear. Sometimes a process takes to long, gets hung up, or goes into a break. In this case, you may want to kill the process, i.e., stop the evaluation in progress and force the process to disappear. Example: You start a LISTFILES to print a file. This starts a process to send the files to the printer. But the printer is down. The process will just sit there printing in the PromptWindow Quake not responding. This can drive you crazy. So you kill the process started by LISTFILES and redo the LISTFILES when you know the printer is up again. Killing is usually done using the Process Status window (described below). But can also be done by calling DEL.PROCESS from the Exec with the process name as an argument. E.g., (DEL.PROCESS 'COPYFILE) Restarting a process Some processes can be restarted from the beginning at any time before they finish. Restarting a process is just like killing it and then redoing the ADD.PROCESS that started the process to begin with. Example: You start a HARDCOPY in your TEdit window that never seems to finish because the file servers are slow and TEdit can't find the right fonts or some such nonsense. You just want to kill the HARDCOPY command and get on with your editing. Solution: Restart the TEdit process. Note that yopu could kill the TEdit process. But then you'd have to go through the trouble of restarting TEdit in order to get back to editing. Moreover, if you hadn't Put your edits, restarting TEdit may loose your edits. Therefore, restarting is much safer. Restarting is usually done using the Process Status window (described below). But can also be done by calling RESTART.PROCESS from the Exec with the process name as an argument. E.g., (RESTART.PROCESS 'TEdit#4) Suspending a process Suspending a process stops a running process, but doesn't make it disppear. It stays around and inactive until it is either awoken (i.e., unsuspended) or killed. Suspending a process is usually done by programs. But it can be useful in other ways. Example: You try to print something out with a LISTFILES. But the printer is down and the LISTFILES keeps printing Quake not responding in the Prompt window. You can stop this annoying printout by suspending the LISTFILES process until you know the printer is back up. Suspending is usually done using the Process Status window (described below). But can also be done by calling SUSPEND.PROCESS from the Exec with the process name as an argument. E.g., (SUSPEND.PROCESS '\FILELISTING). Waking a process A suspended process can be started at the exact point at which it was suspended by waking it. Note that waking a process is a little like restarting a process. BUT a suspended process must be woken, it cannot be restarted. Restarting a suspended process, restarts the process from the beginning but does not unsuspend it. Therefore, doing a restart followed by a wake is basically the same as doing a wake followed by a restart. The wake unsuspends, the restart makes things start from the beginning again. Example: The printer is now fixed and you want your LISTFILES to pick up where it left off. You just wake the process you suspended earlier. Waking a process requires that you return a value from the suspension. For processes suspended by the user, tis value is usually NIL. Waking is usually done using the Process Status window (described below). But can also be done by calling WAKE.PROCESS from the Exec with the process name as an argument. E.g., (WAKE.PROCESS '\FILELISTING). Processes and Breaks Every process has its own, separate stack. When an error occurs and a break is entered, the break occurs within the process causing the error. The Break Exec that is started is run in that process and the stack that you can examine using the Break Exec is the stack of that process. Thus you can have as many Break Execs running as there are processes to break. Example: Your TEdit breaks due to some wierd error. This causes a break in the TEdit process, but will not effect any other running process. For example, if you have a COPYFILE going at the same time. The COPYFILE will progress as usual since the break has no effect on its process. If the COPYFILE then has an error, it will enter its own, independent Break window. You can force a process to enter a break at any time from the Process Status window (described below). You cannot do this (easily) from the Exec. You can also just observe the stack of a running process from the Process Status window. You cannot do this (easily) from the Exec. The Standard Processes Most of the time there will be 5 to 10 processes running in your system. Most of these processes are special system processes that handle things like the Ethernet, the mouse, the Lisp exec, file servers and so on. Below is a list of the processes currently running on my system: ˛˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ŕ@>xpऄ>@ D!¤ @ D!ô @Dpâ‡Ď‘ @@@@@|ř@Ž@€‘@€ŃǏÁ@ń0B@B@B@0BJ@řĐAŠ@@@@@|ř@Ž@€‘@€ŃǏŃ@ń0B@B@Bˆ@0BJ@řĐAŠ@@@@@ůđ €@DDDDDeDdDDDDDD@!Ł@1óq•@! „@DDDDDeFdÄDDDDD@!`„€@1ńą“@@DDDDDDDDDDDDDD@@@ˆâ#€@Ů$H@Ů$H@Š#@Š ˆ@Š$H@Š$H@ˆáπ@@@@@|ůƒˆ|q@ąA‰@ąA‰@ńQAđ@R!"@Sá >‰@R! "‰@Ȑů#Š"q@@@@@8ˆLJ>8p@‘"D$H‘ Dˆ@‘"D $H‘ Dˆ@"@ŕ'ˆ<0`@"@Ĺ @’"Dˆ‘ Dˆ@‘"DˆBH‘ Dˆ@8ˆBG>8p@@@@@"D!H|@"DaH@@"(gč@@>(˘ˆx@"˘ˆ"@@"ŻČ>@@"Ľ"@@"řâ%Ÿ"@@@@@@Dá‡Ç>x@"l‘A‘ D@l‘QA‘ D@TńQAD@@@@@"|p@"@ˆ@@ˆ@x€@@€@@ˆ@"@ˆ@"|p@@@@@Žůň‡>Důŕ@ ‘"(!„ d@ ‘"(!„ d@ Œ (!âDů@@@@@ ńÂ>@păçȟ<@ ‰$E @!„ "@‰$E @!„ "@‰$<@ Ŕ‡Šž<@ńĹȄ @ „ (@O„ @!„ $@H„ @!„ "@€âˆ„>|pŕ‡ČŸ"@@@@@AńÄOžxđáÇÇ@@@†ČD‰$‘@ @†ČD‰$‘@ @…ODń† @@…HxĄ@@…H@‘$‘@@…H@‰$‘@AÄO‘@ˆáÇÇ@@@@@xq'€@Bˆ’"D‰$@@Bˆ”"D‰$@@ˆ x‰¤@@$H.P‰¤@@'Ȓ"H‰d@@$H‘"D‰d@@ÄGDpâ'€@@@@˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ŕ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţ The processes that I was directly responsible for were the three TEdit processes, the CROCK.PROCESS that is running my clock, and the LAFITEMAILWATCH process that is checking my mail every now and again. The rest are all system processes carrying out some sort of system monitoring task. In general, I don't worry much about these system processes. The TTY Process There may be many processes running that require input from a keyboard. However, there is only one keyboard. In order to determine where the type-in from that keyboard goes, there is a notion called the TTY process. The TTY process is a special designation given to only one process at a time. The process with this designation is the one that receives the keyboard input. The rest of the processes requiring keyboard input have to wait until they become the TTY process before getting any type-in. For example, when you have multiple TEdits running, all but the one you are currently typing into are just sitting there waiting to become the TTY process. If the process that is the TTY process has a window (as is almost always the case), then that window contains a blinking caret indicating where the typed input will appear. When the process looses the TTY process designation, then the caret may remain, but it no longer blinks. Thus, the blinking caret almost always designates the window whose process is the TTY process. If a process has a window, you can usually make that process be the TTY process by clicking a left or middle mouse button in its window. Basically, you point into the window you want to type into, then you type into that window. You can also move the TTY process around using the Process Status window as described below. Finally, many programs move the TTY process around. For example, when you start a new TEdit, it grabs the TTY process for itself. When a TEdit quits, it gives the TTY process to the Lisp Exec. The Process Status Window The Process Status window provides an easy-to-use mouse/window-based interface to process management. To open a PSW, select the PSW command from the background menu OR use the function call (PROCESS.STATUS.WINDOW) in the exec. Either way, you'll be asked to place the window on the screen. The window will look like the following: äďˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€"""""""""""""""""""""""""""" """""""""""""""""""""""""""" ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€"""""""""""""""""""""""""""" """""""""""""""""""""""""""" ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€ˆ‰˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ˆ€"#˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˘ "#€˘ ˆ‰€ˆ€ˆ‰€˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ŕˆ€"#€@˘ "#€>xpऄ>@˘ ˆ‰€ D!¤ @ˆ€ˆ‰€ D!ô @ˆ€"#€Dpâ‡Ď‘ @˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€@˘ "#€ůđ €@˘ ˆ‰€! @ˆ€ˆ‰€!Ł@ˆ€"#€!â`„@˘ "#€! „@˘ ˆ‰€! „@ˆ€ˆ‰€!`„€@ˆ€"#€!ń ƒ@˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€@˘ "#€ˆâ#€@˘ ˆ‰€Ů$H@ˆ€ˆ‰€Ů$H@ˆ€"#€Š#@˘ "#€Š ˆ@˘ ˆ‰€Š$H@ˆ€ˆ‰€Š$H@ˆ€"#€ˆáπ@˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€@˘ "#€|ř@Ž@˘ ˆ‰€€‘@ˆ€ˆ‰€€ŃǏŃ@ˆ€"#€ń0B@˘ "#€B@˘ ˆ‰€Bˆ@ˆ€ˆ‰€0BJ@ˆ€"#€řĐAŠ@˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€@˘ "#€|ůƒˆ|q@˘ ˆ‰€ąA‰@ˆ€ˆ‰€ąA‰@ˆ€"#€ńQAđ@˘ "#€R!"@˘ ˆ‰€Sá >‰@ˆ€ˆ‰€R! "‰@ˆ€"#€Ȑů#Š"q@˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€@˘ "#€8ˆLJ>8p@˘ ˆ‰€‘"D$H‘ Dˆ@ˆ€ˆ‰€‘"D $H‘ Dˆ@ˆ€"#€"@ŕ'ˆ<0`@˘ "#€"@Ĺ @˘ ˆ‰€’"Dˆ‘ Dˆ@ˆ€ˆ‰€‘"DˆBH‘ Dˆ@ˆ€"#€8ˆBG>8p@˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€@˘ "#€"D!H|@˘ ˆ‰€"DaH@@ˆ€ˆ‰€"(gč@@ˆ€"#€>(˘ˆx@˘ "#€"˘ˆ"@@˘ ˆ‰€"ŻČ>@@ˆ€ˆ‰€"Ľ"@@ˆ€"#€"řâ%Ÿ"@@˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€@˘ "#€Dá‡Ç>x@˘ ˆ‰€"l‘A‘ D@ˆ€ˆ‰€l‘QA‘ D@ˆ€"#€TńQAD@˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€@˘ "#€"|p@˘ ˆ‰€"@ˆ@ˆ€ˆ‰€@ˆ@ˆ€"#€x€@˘ "#€@€@˘ ˆ‰€@ˆ@ˆ€ˆ‰€"@ˆ@ˆ€"#€"|p@˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€@˘ "#€Žůň‡>Důŕ@˘ ˆ‰€ ‘"(!„ d@ˆ€ˆ‰€ ‘"(!„ d@ˆ€"#€ Œ (!âDů@˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€@˘ "#€ ńÂ>@păçȟ<@˘ ˆ‰€ ‰$E @!„ "@ˆ€ˆ‰€‰$E @!„ "@ˆ€"#€‰$<@ Ŕ‡Šž<@˘ "#€ńĹȄ @ „ (@˘ ˆ‰€O„ @!„ $@ˆ€ˆ‰€H„ @!„ "@ˆ€"#€€âˆ„>|pŕ‡ČŸ"@˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€@˘ "#€AńÄOžxđáÇÇ@˘ ˆ‰€@@†ČD‰$‘@ˆ€ˆ‰€ @†ČD‰$‘@ˆ€"#€ @…ODń† @˘ "#€@…HxĄ@˘ ˆ‰€@…H@‘$‘@ˆ€ˆ‰€@…H@‰$‘@ˆ€"#€AÄO‘@ˆáÇÇ@˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€@˘ "#€xq'€@˘ ˆ‰€Bˆ’"D‰$@@ˆ€ˆ‰€Bˆ”"D‰$@@ˆ€"#€ˆ x‰¤@@˘ "#€$H.P‰¤@@˘ ˆ‰€'Ȓ"H‰d@@ˆ€ˆ‰€$H‘"D‰d@@ˆ€"#€ÄGDpâ'€@˘ "#€@˘ ˆ‰€@ˆ€ˆ‰€@ˆ€"#€˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ŕ˘ "#€˘ ˆ‰€ˆ€ˆ‰€ˆ€"#€˘ "#Ÿ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ů˘ ˆ‰ ˆ€ˆ‰ ˆ€"#ăř‰<H ˘ "#@‰B$H ˘ ˆ‰@‰$ H ˆ€ˆ‰ŕ@ Qü@H ˆ€"#@ Q H ˘ "#@ QH ˘ ˆ‰@!BH ˆ€ˆ‰ŕ@!<OĎŔ ˆ€"# ˘ "# ˘ ˆ‰ ˆ€ˆ‰ ˆ€"#üAÇŔřţ>?„é˘ "#‚A$ €AA ˘ ˆ‰‚"$@€@ A ˆ€ˆ‰ü"Ä€ü< A ˆ€"#‚$řř€ ˘ "#‚$€€A ˘ ˆ‰‚ˆ$ @€A A ˆ€ˆ‰üOÇŔţ> A ˆ€"# ˘ "# ˘ ˆ‰ ˆ€ˆ‰ ˆ€"#ăú@ Ÿ‡€#Aţ ˘ "#B P0@#A€ ˘ ˆ‰Aŕ( #Ą € ˆ€ˆ‰ŕAP$Ÿ  Ą@ü ˆ€"#@ @$ Ą € ˘ "#@ " Ąń€ ˘ ˆ‰@@!@B € ˆ€ˆ‰ŕ@@ €B ţ ˆ€"# ˘ "# ˘ ˆ‰ ˆ€ˆ‰ ˆ€"#ńý@řü€ń|| Ÿ ˘ "#!@‚@ ‚B@0‰˘ ˆ‰ ˆ@‚@ €B@(Iˆ€ˆ‰đ ˆ@ř‚~ áxB~$Iˆ€"# P@ü@|@$I˘ "# P@‚@ @@"I˘ ˆ‰ ‚@ € ‚@@!‰ˆ€ˆ‰đ @ř‚ @đř|@ Ÿ ˆ€"#@ ˘ "# ˘ ˆ‰Ÿ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ůˆ€ˆ‰€ˆ€"#€˘ "#˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˘ ˆ‰˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€"""""""""""""""""""""""""""" """""""""""""""""""""""""""" ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€"""""""""""""""""""""""""""" """""""""""""""""""""""""""" ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ€"""""""""""""""""""""""""""" The upper box in this window contains a list of the names of all the processes currently in the system, both running and suspended. You can select any one of these processes by clicking over the process name. This will shade this process name. ×ńDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙G˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙DGD˙˙˙˙˙˙˙˙˙˙˙˙˙˙€G€DG|đáÁH|€D@ˆB!H@€@ˆB'č@€GxđA‚ˆx€DG@ @Bˆ"@€D@B/Č>@€@ˆB%"@€G|ˆáĹŸ"@€DG€D€€G€DGóńQ€DB@€DDDDDFGG^DDDDD€GCÄÁ€DGSQ€DBA€DDDDDFDĹMDDDDD€GCăA€DG€D€DDDDDDDDDDDDDD€G€DGÄG€D˛$H€˛$H€GR$F€DGR$A€DR$H€R$H€GÇ€DG€D€€G€DGůđ €€D! "€!Ł˘€G!â`„ €DG! „ €D! „?€!`„” €G!ń ƒ>€DG€D€€G€DG>8ůň!"ř⠀D !b‚"(! € !b‚*(! €G <!⢂*(!ŕ€DG !¤B*D! €D !§Â|! € !¤BD! €G‘ 8!ň$GD ⠀DG€D€€G€DG<8q|pŕ€D"D‰ H‘"@‰€"D‰@H‘"@‰€Gř€D"D‰& (€€"DQ&ĎĐ (€€G"|Q%E<(đ€DGD€€DG€D€€G€DG8‰Â!Ž"|đ€DDŮ""‚"@ˆ€Ů"˘‚"@ˆ€G8Šâ˘‚>xđ€DGŠ¤B"@ €DŠGÂ"@€DŠDB"@ˆ€G8‰áDB"|ˆ€DG€D€€G€DG>Dřŕ€D D€ (€G<ń€DG €D (€ D€G>Dřŕ€DG€D€€G€DG8!óä>|‰óŔ€D"DPB@É €"DPB@É €G@PCÄ xŠăŔ€DG\ˆB@Š€€D"DřB@™@€“"DˆB@™ €G‘8ˆCçÇ|‰ň €DG€D€€G€DGAâ'‡>|€áÇϑ>x€DA$HŠ@€B! D€!$HŠ@€B! D€G!$H x€AD€DG€D€€G€DGƒăˆŸ<ńáώ€D€ "‰$H"€@ "‰$H"€G@ ž<‰â$ €DG  (ńB$€D  $"$H"€ "$H"€GƒˆŸ"ώ€DG€D€€G€DG"8đâ$O€D…$D‰&H€€…(D‰&H€€G…8@ń%H€€DGH$\Ą%H€€DO‘$D‘$Ȁ€H‘"D‰$Ȁ€GˆŽ"8ˆáÄO€DG€D€€G˙˙˙˙˙˙˙˙˙˙˙˙˙˙€DGDGDG?˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óD  G Çđ#x0DG  €#„H D  €# H@ Ŕ€Łů€G  €˘  @DG  €˘   D  €B„ Ŕ€Bx ŸŸ€G DG D  G řţ‚!€ńü|?ÓDG ‚"H@ ‚ ‚D D$H € € ‚ řD(ˆ! řx ‚G (4H#đń"?DG ("H! > ‚D !H@€ ‚A ‚ ř Ÿ€ ü|A ‚G DG D  G Çô€A?F ‚üDG  „ a €F ‚!D  ‚!ŔQ @F!BA Ŕ‚" I> @)ABřG  @€I @)B#ADG  @E @)Câ!D  €€C €„ Ŕ€€A „ üG DG D  G ăú€ńřţ!âřřţA>DG B€ €" „€a!D A€ €$ „€Q “ ŕA€ńü(Âđ„üI “G @ € ř€"4"ř€I “DG @ € €>"€€E “D @@ €A! €€C! ŕ@@€ńţA €áđř€ţA>G €DG D?˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙óGDG˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙D˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD The lower box is a menu of commands that you can apply to the selected process. The commands are: (starting from the right column) KILL œ kills the selected process RESTART œ restarts the selected process WAKE œ wakes the selected process if its suspended. You will be given a menu of values that can be returned. Choosing NIL from this menu will generally work. SUSPEND œ suspends the selected process WHO? œ moves the selection to the process that has the TTY process. This is very handy for telling multiple processes running the same program apart. For example, if there are 4 TEdits running, there will be processes named TEdit, TEdit#2, TEdit#3, and TEdit#4. To find out which TEdit you want to operate on you can bug inside that TEdit's window. This will pass the TTY process to that TEdit. The choose the WHO? command in the PSW. This will select the TEdit corresponding to the window you clicked in. KBD_ œ gives the TTY process to the selected process. Example: If TEdit has the TTY process, then selecting the EXEC process and using the KBD_ command will move the TTY Process (i.e., the blinking cursor) to the Exec window. INFO œ returns any information the selected process wants to give. I have never seen a process that wanted to give any information, but ... BREAK œ forces the selected process into a break, thus opening a break window, starting a break exec, etc. This is handy to examine the state of a computation that has run amok: Break the process and then muck around the stack using the Break Exec. BT (BTV, ...) œ prints a backtrace of the stack of the selected process in an attached window just above (below) the PSW. BT prints standard backtrace with just the names of the functions called. BTV and the rest print backtraces with some more information about each frame. ÚLDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDD@˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ń˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ńD`d@D`d@`˙˙˙˙˙˙˙˙˙˙˙˙˙˙đq`€qD`˘"""">~*""""""0d@D`€@d@`ˆˆˆˆˆˆČčëȈˆˆˆq`€x˜!qD`˘""""*bŞ#"""""0d@D`€@ˆ!d@`ˆˆˆˆˆˆČ˜Š¨ˆˆˆˆq`€|h ŔqD`˘"""""""""""""0d@D`€d@`ˆˆˆˆˆˆˆˆˆˆˆˆˆˆq`€qD`€"8ˆăŕd@D`€6D‰d@`€6D‰q`€*DˆĂŔqD`€*Dˆ"d@D`€*D‰d@`€*D‰q`€"8păŕqD`€d@D`€d@`€q`€qD`€>Ł€d@D`€ €¤@d@`€ 4qăô@q`€4b‡ŔqD`€d@D`€d@`€q`€qD`‡Ç>D âBDd@D`D lPBE"Dd@`D lPBE"Dq`G‚Dˆă∄DqD`€d@D`€d@`€q`€qD`€LJ"ńáώd@D`€$H‘$‰$H"d@`€$H‘(‰$H"q`€ˆ8‰â$ qD`€$ńB$d@D`€$ˆ‘$"$H"d@`€$H‘"$H"q`€ÄG"ώqD`€d@D`€d@`€q`€qD`€ˆ‘ DˆRÂd@D`€H‘ DŘRd@`€HŠ DŮúq`€OŠ D¨˘…qD`€ˆ„ D¨˘d@D`€„ DŤňd@`€„ DŠBq`€„>8‰CçȐqD`€d@D`€d@`€q`€qD`€8D!ńÄOžd@D`€›$DPB$Hd@`€›$TPB$Hq`€|€áÇϑ>xd@D`€ƒ$HŠ@€B! Dd@`€C$HŠ@€B! Dq`€BŁ x€ADqD`€d@D`€d@`€q`€qD`ˆČ'ÂqdqDdd@Dg˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţd@`q`qD˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ä@D˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙őUUUUUUä@|˙˙˙˙˙˙˙˙˙÷˙˙˙˙˙úŞŞŞŞŞŞŃ}ű˙˙˙˙˙˙˙˙˙÷ý˙˙˙˙úŞŞŞŞŞŞŃD}ý˙˙˙˙˙˙˙˙˙÷ý˙˙˙˙őUUUUUUÄ@D}ýł‡áńđđ˙CđřwŘŮĂáńőUUUUUUÄ@}ýŤ{Ţîďo=ďwˇ˝Ő˝ŢîúŞŞŞŞŞŞŃ}űžýžßoď˙~ßoˇ}Ď}žßzŞŞŞŞŞŞŃD|žýżŔpđ˙~üoöýßńżŔuUUUUUUÄ@D}˙žýżß˙~ăoő}ߍżßőUUUUUUÄ@}˙žýżßďo~ßoó˝ß}żßúŞŞŞŞŞŞŃ}˙ż{Ţďoo=ŢwˇÝßyŢďzŞŞŞŞŞŞŃD}˙ż‡áđđđ˙Cá8wě߄áđőUUUUUUÄ@D˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙őUUUUUUÄ@˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŞŞŞŞŞŞŃ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŞŞŞŞŞŞŃD˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ä@D`Ä@`Ń`ŃDgČšŒÄ@Dd‰-’RÄ@d‰’ŃdˆĘ‘ŒŃDdˆ*BÄ@Dd‰(’RÄ@gČšŒŃ`ŃD`Ä@D`Ä@d?î;ŕc#K€ƒŔŃd €”ˇľj@„Ľ ŃDb €„żőz@„Ľ Ä@Db É€„ŤUz@„ĽŔÄ@a €„Ť_Ú@„ĽŃa ˆ”ŁÚH„ĽŃD`‰î8ˆc#ˈóÄ@D`€Ä@`Ń`ŃDd?î;ěÄ@Dd ’Ä@b ‚Ńb É„ŃDa ˆÄ@Da Ä@`‰î8žŃ`€ŃD`Ä@D`Ä@d=CĚä@Ńd!B–ŔŃDb!ľB—ŔÄ@Db9ľC’ĺ@Ä@a ŻÂĽ@Ńa č”@ŃD`źHú ”@Ä@D`€Ä@`Ń`ŃDgšĆqžřÄ@Dd%)JP Ä@d%)J Ńg9Éqœ ŃDd)IPP Ä@Dd%)JP Ä@gĽ&Iž Ń`ŃD`Ä@D`Ä@d"Ixăć1€Ńd6Ş@”Ľ J@ŃDb>Ź@”ĄBŔÄ@Db*ŹpäĄĆ3@Ä@a+ú@¤Ą @Ńa#A”Ľ J@ŃD`Łů“ć1€Ä@D`€Ä@`Ń`ŃDgŔÄ@DaÄ@aŃaŃDaÄ@DaÄ@aŃ`ŃD`Ä@D`Ä@`Ń`ŃD`Ä@D`Ä@`Ń`ŃD`Ä@D`Ä@`Ń`ŃD`Ä@D`Ä@`Ń`ŃD`Ä@D`Ä@˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ń˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŃDDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDD@ This is a handy way to find out if a process is progressing or if its stuck at some point: click BT many times in succession. If the stack is constantly changing, then things are progressing. If the stack is unchanging with AWAIT.EVENT or some such function at the top, then the process is probably stuck waiting for a file server to respond or some other external event to occur. Whenever a process starts or finishes, the PSW gets shaded over. This indicates that the information is no longer current. ÖŕDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙FDFD˙˙˙˙˙˙˙˙˙˙˙˙˙˙ DDDDDDDDDDDDDEFçŔ‚DF"""""+33333ˇ3ł333333""""&D„Ž< DDDDDÇÍĆTDDDDEF„‚DF"""""+33333ˇ;ą333333""""&D„ ‚ DDDDDÇĆĆLDDDDEFDF"""""+33333333333333""""&DF#ˆŽ>DF"""""*""""!Fjł""""#""""&DdH‘ ¤HŒ<F¤H‚ DF"""""*"""" †jł""""#""""&D¤H‘ #‡>FDF"""""*"""""""""""""#""""&DFóŕA 8DF"""""*""""`"b*(f"""#""""&DBG?DCÄÁFBADF"""""*""""`&c*\"""#""""&DBÁ (@CăA(|FDF"""""*"""""""""""""#""""&DF|qóäB D!ńÄADF"""""*26b`$ç&fr`c""""&D@ BĹ TPB$Ax CĹE TPBÁF"@ BH„ TˆBADF"""""*2b`'mŚ Ú`c""""&D"@ BH„ (ˆB$A"@pCäHŽ>(ˆAÄAFDF"""""*"""""""""""""#""""&DFxpâ 8řáŔDF"""""*"fŤ0b*łfŁ0#""""&D"D‰€‘"D  x‰€ž"@đÁ€F P‰@"@€ @DF"""""*"jŤ0b*0fŁ0#""""&D"D‰!"D Dpâ!8řáŔFDF"""""*"""""""""""""#""""&DFx‰H… |!đDF"""""*""fŤ0&o§bs""#""""&DDˆ˘MŸ @QDř˘JŠ xQŕFxˆBJŠ @‰DF"""""*""bŞ`&hbŰ""#""""&D@ˆBJ” @‰@ˆC㈔>|‰FDF"""""*"""""""""""""#""""&DF q„BDůŕDF"""""*""Ťfg&fŁ2"#""""&D ˛EE"DqSĹE |ńŕF R%H„ D@DF"""""*""*+p­ŚfŁ"#""""&D‰R"ˆ„"Dqˆ„DůFDF"""""*"""""""""""""#""""&DF|‰ńŔDF"""""*"""""bŤ """"#""""&D@Q x!âF@!DF"""""*"""""bs """"#""""&D@‰ |‰ńŔFDF"""""*"""""""""""""#""""&DF"8pCçČ|ůçDF"""""**fŞ‚Ś*&2Ł°&c""""&D2Dˆ „"’A*0€ ‡ˆńSǁF*š„RDF"""""* fŤŇŚ*&2Ł&Ł""""&D&D‰„"2A"8q‡ĎŽůäAFDF"""""*"""""""""""""#""""&DFƒÄO|ůϟ"|ńDF"""""* jł62Ł"Ś`2bŤ""""&DB$H‘„B2@‰B$Hńƒ*xńF#ÄO"€‚*@ĄDF"""""*&j32Ł"Ś`2bł""""&DH"„B&@‰ˆ"ůńÂ"|‰FDF"""""*"""""""""""""#""""&DFÇ>xăÇ8DF"""""*## 9f#0j˛f#""""&D D$H"DD!#‡8FDF"""""*"""""""""""""#""""&DFDqáÄHžDF"""""*""+(jŤ0nł""#""""&D "P‰$L‘ pâ$J‘F‘ HšB$J‘DF"""""*""*˝jŤkł""#""""&D‘"D‰$I‘DqȞFDF"""""*"""""""""""""#""""&D˙˙˙˙˙˙˙˙˙˙˙˙˙˙FDF""""""""""""""""""""""""&DF˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ćDFb"""""""""""""""""""""""D@'@ŕF$đ`! 'F@AF$A &DFb""2c"""""d0&˛"""&Ł""D@)Gň  '@A)D@ 'F@A)D@A &DFb""2c"""""2Ś3*""""&""D@„đ@??'@@'F@&DFb"""""""""""""""""""""""D@'@ńýB?ăřřţ~?§F@!D €A&DFb" *Ş""""j˛c""&0#"2 c&D@đ ˆP?Bđđ(A'@ Ph GŕâD~'F@ PD B|A&DFb" *""""`˛Ł""&0#&2 c&D@đ A?řř‚A'@'F@&DFb"""""""""""""""""""""""D@'@č!‚~ŒA#ř'F@A%@Â@!ŒAB&DFb"2c&a˘"""&€bb˘"""Ž`Ś ""D@E@’|@€R‚…đ'@A’@@€R„F‚'F@A€Š@@€R‡ÄB&DFb"2c#"""""&¤b""""*""D@‚@!$ř'@'F@&DFb"""""""""""""""""""""""D@'@ÇôăńüBÄńńü‚|'F@ „ D$ ÂB&DFb"* """&0+" j"*&0#+"€cD@Ŕ‚!â ř(P„á ř’A'@ AńDhDń’A'F@ A |D$ ŠA&DFb"*˘˘"""&0+" `"*0+#"¤`D@Ŕ€â ü‚AĂáńü‚|'@'F@&DF]ÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝÝĆDG˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţDG˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD To update the information, just click the left or middle mouse buttons anywhere in the PSW. This will redisplay the PSW with the current information. Multiple Exec Processes In default mode, Interlisp has only one Exec process. There are, however, a number of Lisp Users packages that allow for multiple Exec windows and multiple Exec processes to run simultaneously. One such package is called EXEC. Load {eris}Exec.DCOM. This will add a "EXEC" choice to the background menu. Choosing EXEC from the background menu will prompt you for a region and then open a new Exec window in that region running an independent Exec process. You can use this new Exec simyultaneously with and in exactly the same manner as the original Exec process. For example, you can run a long COPYFILE in the original Exec window. While its running, you can carry out your normal tasks (e.g., starting TEdits, doing DIRs, etc.) using the second Exec. You can open as many Exec windows and start as many Exec processes as you like. To terminate a given Exec, evaluate the function call (EXEC.QUIT) in its Exec window. Note: There is one way in which the multiple Execs are not independent: they share a common history list. Each event in every Exec updates the event number in all running Execs. From any Exec window you can redo or undo events originally carried out in any other Exec window. This shared history list can sometimes be a great help. But it can also be problematic if you forget the shared nature of the list. In particular, nevent numbers printed in the Exec windows are not always up-to-date because they may change constantly due to events in other Exec windows. You very often tend to undo or redo the wrong event number because you rely on incorrect information printed in the Exec window and don't check the history list for the correct event number. The Mouse Process and (SPAWN.MOUSE) The process that sits in the background and watches your mouse movements and mouse button clicks is called the MOUSE process. When you click inside a menu or a window, the mouse process is responsible for getting a decision about what to do from the menu or window, and then evaluating the correct functions necessary to do it. Thus much work in Interlisp gets done within the mouse process as button presses lead to the evaluation of various functions. For example, when you choose TEDIT from the background menu, the MOUSE process evaluates the function call (TEDIT) just as if you had typed it into an Exec window. In general, you shouldn't have to worry to much about the mouse process unless you are programming. Sometimes, however, something goes wrong and the mouse process gets stuck. For example, a break can occur in a function being evaluated in the mouse process. Or a function can go into an infinite loop when being evaluated in the mouse process. When this happens, you can't use your mouse for anything. You can often, however, still type in to an Exec or a Break Exec. When this happens, the function call (SPAWN.MOUSE) comes in very handy. SPAWN.MOUSE will start up a new mouse process, replacing the old. The old function keeps going and finishes whatever it was doing when SPAWN.MOUSE was called, except that it is renamed OLDMOUSE. The new mouse process takes over control of the mouse and hence all of the mouse functions are restored. Example: You choose an item from a Lafite Browser menu. This immediately causes a break. However, in the Break window you discover that the mouse doesn't work at all. In fact, no where on the screen does the mouse have any effect. If the flashing cursor is in the Break window or in a Exec window, then you could type (SPAWN.MOUSE). This would free up the mouse by starting a new MOUSE process. The break in the Lafite menu command would remain unaffected, although its process would be renamed from MOUSE to OLDMOUSE. References Processes are documented in Section 18.20 of the IRM. Subsections 18.20.1, 18.20.2, & 18.20.5 are generally relevant for non-programming users. Subsection 18.20.6 covers the TTY process. Subsection 18.20.7 covers the MOUSE process and SPAWN.MOUSE. Subsection 18.20.8 covers the Process Status window.(LIST ((PAGE NIL NIL (0 0 612 792) ((HEADING NIL (HEADINGTYPE YYY) (19050 26670 2540 1270) NIL) (TEXT NIL NIL (2540 2540 16510 22860) NIL))) (PAGE NIL NIL (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 SIZE 12 FAMILY TIMESROMAN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM)) (16510 26670 2540 1270) NIL) (HEADING NIL (HEADINGTYPE XXX) (2540 26670 2540 1270) NIL) (TEXT NIL NIL (2540 2540 16510 22860) NIL))) (PAGE NIL NIL (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD RIGHT) CHARLOOKS (SUPERSCRIPT 0 SIZE 12 FAMILY TIMESROMAN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF SLOPE REGULAR WEIGHT MEDIUM)) (16510 26670 2540 1270) NIL) (HEADING NIL (HEADINGTYPE XXX) (2540 26670 2540 1270) NIL) (TEXT NIL NIL (2540 2540 16510 22860) NIL)))))H PAGEHEADINGYYY TIMESROMAN ˆ PAGEHEADINGXXXB TIMESROMAN NILNILB TIMESROMANNILNIL! TIMESROMAN$$NILNIL# TIMESROMAN HHNILNILŞ TIMESROMAN HHNILNIL¤ TIMESROMAN HHNILNILs TIMESROMAN HHNILNIL† TIMESROMAN HHNILNILl TIMESROMAN $$ NILNIL+ TIMESROMAN HHNILNILŽ TIMESROMAN HHNILNIL¤ TIMESROMAN HHNILNIL˙ TIMESROMAN HHNILNILW TIMESROMAN $$ NILNILu TIMESROMAN $$NILNIL TIMESROMAN  TIMESROMAN  TIMESROMAN d TIMESROMAN $$NILNIL TIMESROMAN  TIMESROMAN T TIMESROMAN HHNILNILs TIMESROMAN HHNILNILS TIMESROMAN $$ NILNILž TIMESROMAN HHNILNIL TIMESROMAN HHNILNILŞ SKIO.GETFN.2 TIMESROMAN  TIMESROMAN $$ NILNILÔ TIMESROMAN HHNILNIL TIMESROMAN HHNILNIL SKIO.GETFN.2 TIMESROMAN  TIMESROMAN HHNILNIL TIMESROMAN HHNILNIL  SKIO.GETFN.2 TIMESROMAN  TIMESROMAN $$ NILNILK TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN NILNIL1 TIMESROMAN$$ NILNIL TIMESROMAN HHNILNIL~ TIMESROMAN HHNILNIL5 TIMESROMAN HHNILNILĎ TIMESROMAN HHNILNILB TIMESROMAN  TIMESROMAN • TIMESROMAN HHNILNIL TIMESROMAN HHNILNIL" TIMESROMAN TIMESROMAN  TIMESROMAN $$NILNIL TIMESROMAN HHNILNIL( TIMESROMAN TIMESROMAN : TIMESROMAN HHNILNIL TIMESROMAN llNILNIL TIMESROMAN HHNILNIL TIMESROMAN  TIMESROMAN ż TIMESROMAN TIMESROMAN  TIMESROMAN llNILNIL TIMESROMAN  TIMESROMAN § TIMESROMAN HH NILNILĎ TIMESROMAN HH NILNILŇ TIMESROMAN HH NILNIL TIMESROMAN llNILNIL TIMESROMAN NILNIL TIMESROMAN NILNILB TIMESROMAN NILNIL TIMESROMAN NILNIL= TIMESROMAN ll NILNILD TIMESROMAN NILNIL TIMESROMAN NILNILJ TIMESROMAN NILNIL TIMESROMAN NILNIL= TIMESROMAN HH NILNILß TIMESROMAN NILNILP TIMESROMAN$$ NILNIL TIMESROMAN $$ NILNIL% TIMESROMAN HHNILNILN TIMESROMAN llNILNIL TIMESROMAN NILNILW TIMESROMAN NILNILƒ TIMESROMAN NILNILZ TIMESROMAN HH NILNILż TIMESROMAN llNILNIL TIMESROMAN NILNIL% TIMESROMAN NILNIL TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN  NILNILˇ TIMESROMAN  TIMESROMAN ¨ TIMESROMAN HH NILNIL TIMESROMAN ¤ TIMESROMAN TIMESROMAN i TIMESROMAN TIMESROMAN HH NILNIL8 TIMESROMAN  TIMESROMAN  TIMESROMAN TIMESROMAN  TIMESROMAN + TIMESROMAN % TIMESROMAN $$NILNIL TIMESROMAN  TIMESROMAN HHNILNILˇ TIMESROMAN HHNILNILf TIMESROMAN  TIMESROMAN W TIMESROMAN HHNILNIL TIMESROMAN llNILNIL¸ TIMESROMAN  TIMESROMAN ‰ TIMESROMAN HH NILNILł TIMESROMAN  TIMESROMAN  TIMESROMAN $$NILNIL TIMESROMAN  TIMESROMAN HHNILNILĘ TIMESROMAN HHNILNIL TIMESROMAN llNILNIL TIMESROMAN llNILNIL TIMESROMAN HH NILNILş TIMESROMAN  TIMESROMAN  TIMESROMAN $$NILNIL TIMESROMAN  TIMESROMAN HHNILNILŁ TIMESROMAN HHNILNILW TIMESROMAN HHNILNIL TIMESROMAN llNILNILk TIMESROMAN  TIMESROMAN  TIMESROMAN  TIMESROMAN # TIMESROMAN  TIMESROMAN K TIMESROMAN HH NILNILş TIMESROMAN  TIMESROMAN  TIMESROMAN $$NILNIL TIMESROMAN  TIMESROMAN HHNILNILS TIMESROMAN  TIMESROMAN  TIMESROMAN HHNILNIL TIMESROMAN _ TIMESROMAN  TIMESROMAN  TIMESROMAN TIMESROMAN ! TIMESROMAN HHNILNIL TIMESROMAN llNILNIL… TIMESROMAN HH NILNIL‡ TIMESROMAN HH NILNILł TIMESROMAN  TIMESROMAN  TIMESROMAN NILNIL TIMESROMAN$$ NILNIL+ TIMESROMAN $$NILNIL> TIMESROMAN  TIMESROMAN   TIMESROMAN $$NILNILO TIMESROMAN $$NILNIL TIMESROMAN HHNILNILj TIMESROMAN $$NILNIL“ TIMESROMAN $$NILNIL… TIMESROMAN NILNIL TIMESROMAN$$NILNIL× TIMESROMAN $$NILNILA TIMESROMAN $$NILNIL * BMOBJ.GETFN2 TIMESROMAN  TIMESROMAN $$NILNILÎ TIMESROMAN $$NILNIL’ TIMESROMAN NILNIL TIMESROMAN$$NILNILÍ TIMESROMAN TIMESROMAN  TIMESROMAN $$NILNIL TIMESROMAN $$NILNILœ TIMESROMAN $$NILNILw TIMESROMAN $$NILNILč TIMESROMAN $$NILNIL] TIMESROMAN $$NILNILĂ TIMESROMAN NILNIL TIMESROMAN$$NILNILf TIMESROMAN $$NILNIL˝ TIMESROMAN $$NILNIL) TIMESROMAN $$NILNIL  BMOBJ.GETFN2 TIMESROMAN  TIMESROMAN$$NILNIL„ TIMESROMAN HHNILNIL TIMESROMAN  TIMESROMAN c TIMESROMAN HHNILNILf BMOBJ.GETFN2 TIMESROMAN  TIMESROMAN $$NILNILO TIMESROMAN  TIMESROMAN$$NILNIL3 TIMESROMAN HHNILNIL TIMESROMAN  TIMESROMAN HHNILNIL TIMESROMAN ! TIMESROMAN HHNILNIL TIMESROMAN œ TIMESROMAN HHNILNIL TIMESROMAN ! TIMESROMAN HHNILNIL TIMESROMAN @ TIMESROMAN llNILNILť TIMESROMAN HHNILNIL TIMESROMAN 2 TIMESROMAN llNILNILŹ TIMESROMAN HHNILNIL TIMESROMAN ‰ TIMESROMAN HHNILNIL TIMESROMAN f TIMESROMAN llNILNIL TIMESROMAN HHNILNIL TIMESROMAN  TIMESROMAN HHNILNIL$Z BMOBJ.GETFN2 TIMESROMAN  TIMESROMAN llNILNILƒ TIMESROMAN $$NILNIL} TIMESROMAN $$NILNILŠ BMOBJ.GETFN2 TIMESROMAN  TIMESROMAN $$NILNIL— TIMESROMAN NILNIL TIMESROMAN$$ NILNILĂ TIMESROMAN $$ NILNIL! TIMESROMAN $$NILNILZ TIMESROMAN $$NILNIL TIMESROMAN $$NILNILż TIMESROMAN $$NILNILP TIMESROMAN $$NILNIL6 TIMESROMAN TIMESROMAN  TIMESROMAN $$NILNIL TIMESROMAN  TIMESROMAN $$NILNILă TIMESROMAN NILNIL$ TIMESROMAN$$ NILNILo TIMESROMAN TIMESROMAN  TIMESROMAN $$NILNILI TIMESROMAN $$NILNILk TIMESROMAN  TIMESROMAN 2 TIMESROMAN $$NILNILd TIMESROMAN $$NILNILö TIMESROMAN $$NILNIL} TIMESROMAN $$NILNIL‹ TIMESROMAN $$NILNIL TIMESROMAN $$NILNILi TIMESROMAN $$NILNIL TIMESROMAN HHNILNILă TIMESROMAN HHNILNILW TIMESROMAN TIMESROMAN ž TIMESROMAN NILNIL TIMESROMAN$$NILNIL6 TIMESROMAN HHNILNILZ TIMESROMAN HHNILNIL+ TIMESROMAN HHNILNIL? TIMESROMAN HHNILNIL4 TIMESROMAN ęNŔz¸