Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03345.jsonl.gz/1274

Dieses Modul erlaubt die Handhabung von Coroutinen. Coroutinen unterscheiden sich dadurch von Prozeduren, dass sie nicht bei jedem Aufruf vom Startpunkt aus durchlaufen werden. Stattdessen kann eine Coroutine jederzeit (explizit) unterbrochen werden, und beim erneuten Eintritt in die Coroutine wird die der Unterbrechungs-Anweisung unmittelbar folgende Anweisung als nächste ausgeführt.
Coroutinen sind die Basis von quasi-parallel ablaufenden Prozessen. Im Gegensatz zu diesen ist für Coroutinen keine Unterstützung des Betriebssystems nötig. Echte Prozesse sind nur mit den Routinen der Schnittstellen-Moduln ExecL oder DosL möglich.
Prozedur NEWPROCESS ruft eine neue Coroutine ins Leben, wobei die Prozedur p die neue Coroutine bildet. Die Variablen wsp und size bezeichnen den zur Verfügung gestellten Arbeitsspeicher, erstere gibt die Adresse, letztere die Grösse des Arbeitsspeichers. Die Variable new charakterisiert die neu kreierte Coroutine. Die Coroutine wird nicht gestartet, sondern nur initialisiert. Danach kann jederzeit durch TRANSFER in die Coroutine gesprungen werden.
Der Arbeitsspeicher muss alle lokalen Variablen der Coroutine und der von ihr aufgerufenen Prozeduren beinhalten. Es können daher keine allgemeingültigen Werte für die optimale Grösse des Arbeitsspeichers angegeben werden.
Da innerhalb einer Coroutine Dos-Aufrufe möglich sind, muss sichergestellt werden, dass genügend Arbeitsspeicher angelegt wird. Für Dos-Aufrufe werden bis zu 1500 Byte benötigt. Falls keine Dos-Aufrufe in der Coroutine sind, können Sie diese Variablen auf kleinere Werte setzen. Die Variable coroutinesMinStack ist die minimale Grösse des Arbeitsspeichers, die bei NEWPROCESS erwartet wird. coroutinesSaveStack reserviert einen Bereich dieser Grösse im Arbeitsspeicher für nicht kontrollierbare Aufrufe (z.B. Dos). Sobald mehr als size - coroutinesSaveStack Byte des Arbeitsspeichers in Gebrauch sind, wird das Programm mit einem Stapelüberlauf abgebrochen.
TRANSFER suspendiert die durch source charakterisierte Coroutine, während mit dest an der Stelle der Suspension fortgefahren wird. Wird source wieder fortgesetzt, wird die unmittelbar auf TRANSFER folgende Anweisung ausgeführt.