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
).