| (* Library module defined by the International Standard |
| Information technology - programming languages |
| BS ISO/IEC 10514-1:1996E Part 1: Modula-2, Base Language. |
| |
| Copyright ISO/IEC (International Organization for Standardization |
| and International Electrotechnical Commission) 1996-2021. |
| |
| It may be freely copied for the purpose of implementation (see page |
| 707 of the Information technology - Programming languages Part 1: |
| Modula-2, Base Language. BS ISO/IEC 10514-1:1996). *) |
| |
| DEFINITION MODULE Processes; |
| |
| (* This module allows concurrent algorithms to be expressed using |
| processes. A process is a unit of a program that has the |
| potential to run in parallel with other processes. |
| *) |
| |
| IMPORT SYSTEM; |
| |
| TYPE |
| ProcessId; (* Used to identify processes *) |
| Parameter = SYSTEM.ADDRESS; (* Used to pass data between processes *) |
| Body = PROC; (* Used as the type of a process body *) |
| Urgency = INTEGER; (* Used by the internal scheduler *) |
| Sources = CARDINAL; (* Used to identify event sources *) |
| ProcessesExceptions = (* Exceptions raised by this module *) |
| (passiveProgram, processError); |
| |
| (* The following procedures create processes and switch control between |
| them. *) |
| |
| PROCEDURE Create (procBody: Body; extraSpace: CARDINAL; procUrg: Urgency; |
| procParams: Parameter; VAR procId: ProcessId); |
| (* Creates a new process with procBody as its body, and with urgency |
| and parameters given by procUrg and procParams. At least as |
| much workspace (in units of SYSTEM.LOC) as is specified by |
| extraSpace is allocated to the process. |
| An identity for the new process is returned in procId. |
| The process is created in the passive state; it will not run |
| until activated. |
| *) |
| |
| PROCEDURE Start (procBody: Body; extraSpace: CARDINAL; procUrg: Urgency; |
| procParams: Parameter; VAR procId: ProcessId); |
| (* Creates a new process, with parameters as for Create. |
| The process is created in the ready state; it is eligible to |
| run immediately. |
| *) |
| |
| PROCEDURE StopMe (); |
| (* Terminates the calling process. |
| The process must not be associated with a source of events. |
| *) |
| |
| PROCEDURE SuspendMe (); |
| (* Causes the calling process to enter the passive state. The |
| procedure only returns when the calling process is again |
| activated by another process. |
| *) |
| |
| PROCEDURE Activate (procId: ProcessId); |
| (* Causes the process identified by procId to enter the ready |
| state, and thus to become eligible to run again. |
| *) |
| |
| PROCEDURE SuspendMeAndActivate (procId: ProcessId); |
| (* Executes an atomic sequence of SuspendMe() and |
| Activate(procId). *) |
| |
| PROCEDURE Switch (procId: ProcessId; VAR info: Parameter); |
| (* Causes the calling process to enter the passive state; the |
| process identified by procId becomes the currently executing |
| process. info is used to pass parameter information from the |
| calling to the activated process. On return, info will |
| contain information from the process that chooses to switch |
| back to this one (or will be NIL if Activate or |
| SuspendMeAndActivate are used instead of Switch). |
| *) |
| |
| PROCEDURE Wait (); |
| (* Causes the calling process to enter the waiting state. |
| The procedure will return when the calling process is |
| activated by another process, or when one of its associated |
| eventSources has generated an event. |
| *) |
| |
| (* The following procedures allow the association of processes |
| with sources of external events. |
| *) |
| |
| PROCEDURE Attach (eventSource: Sources); |
| (* Associates the specified eventSource with the calling |
| process. *) |
| |
| PROCEDURE Detach (eventSource: Sources); |
| (* Dissociates the specified eventSource from the program. *) |
| |
| PROCEDURE IsAttached (eventSource: Sources): BOOLEAN; |
| (* Returns TRUE if and only if the specified eventSource is |
| currently associated with one of the processes of the |
| program. |
| *) |
| |
| PROCEDURE Handler (eventSource: Sources): ProcessId; |
| (* Returns the identity of the process, if any, that is |
| associated with the specified eventSource. |
| *) |
| |
| (* The following procedures allow processes to obtain their |
| identity, parameters, and urgency. |
| *) |
| |
| PROCEDURE Me (): ProcessId; |
| (* Returns the identity of the calling process (as assigned |
| when the process was first created). |
| *) |
| |
| PROCEDURE MyParam (): Parameter; |
| (* Returns the value specified as procParams when the calling |
| process was created. *) |
| |
| PROCEDURE UrgencyOf (procId: ProcessId): Urgency; |
| (* Returns the urgency established when the process identified |
| by procId was first created. |
| *) |
| |
| (* The following procedure provides facilities for exception |
| handlers. *) |
| |
| PROCEDURE ProcessesException (): ProcessesExceptions; |
| (* If the current coroutine is in the exceptional execution state |
| because of the raising of a language exception, returns the |
| corresponding enumeration value, and otherwise raises an |
| exception. |
| *) |
| |
| PROCEDURE IsProcessesException (): BOOLEAN; |
| (* Returns TRUE if the current coroutine is in the exceptional |
| execution state because of the raising of an exception in |
| a routine from this module; otherwise returns FALSE. |
| *) |
| |
| (* |
| Reschedule - rotates the ready queue and transfers to the process |
| with the highest run priority. |
| *) |
| |
| PROCEDURE Reschedule ; |
| |
| |
| (* |
| displayProcesses - |
| *) |
| |
| PROCEDURE displayProcesses (message: ARRAY OF CHAR) ; |
| |
| |
| END Processes. |