PIM coroutine support#
This directory contains a PIM SYSTEM containing the
PROCESS primitives built on top of GNU Pthreads.
The justification for this approach is that it provides a
SYSTEM compatible with Programming in Modula-2 [234] and the
Logitech 3.0 compiler. It also allows higher level executives to be
ported onto GM2 with little effort. The disadvantage with this
approach is that IOTRANSFER is not
preemptive. IOTRANSFER will only context switch when a call to
LISTEN is made or a call to SYSTEM.TurnInterrupts is
made.
In practice this limitation can be tolerated as long as processes
perform IO at some point (or wait for a timer interrupt) or call
SYSTEM.TurnInterrupts. But nevertheless a LOOP
END will starve all other processes. However the great
advantage is that GNU Modula-2 can offer users the ability to use
IOTRANSFER, TRANSFER, NEWPROCESS in user space,
on a multi-user operating system and across a range of platforms.
The GNU Modula-2 SYSTEM works by utilizing the user context
switching mechanism provided by GNU Pthreads. NEWPROCESS
creates a new context, TRANSFER switches
contexts. IOTRANSFER is more complex. There is a support module
SysVec which provides pseudo interrupt vectors. These can be
created from input/output file descriptors or timer events
timeval. This vector is then passed to IOTRANSFER which
keeps track of which file descriptors and timevals are active. When a
call to TurnInterrupts or LISTEN is made the sub system
calls pth_select and tests for any ready file descriptor or
timeout. A ready file descriptor or timeout will ultimately cause the
backwards TRANSFER inside IOTRANSFER to take effect.
See the gm2/examples/executive directory for an executive and
timerhandler module which provide higher level process creation,
synchronisation and interrupt handling routines. These libraries have
been tested with the examples shown in gm2/examples/executive
and gm2/gm2-libs-coroutines.
Users of these libraries and the libraries in
gm2/examples/executive must link their application against the
GNU Pthread library (typically by using -lpth).