   _ __  _ __  ___ 
  | '_ \| '_ \/ __|
  | | | | |_) \__ \
  |_| |_| .__/|___/
        |_|        

  NPS - Non-Preemptive Thread Scheduling Library

  PORTABILITY

  This library was successfully tested on the following platforms (and
  should automatically adjust to other platforms, of course):

    o  i686-pc-freebsd3.1          FreeBSD 3.1           0.9.18  rse
    o  i686-pc-freebsd3.2          FreeBSD 3.2           0.9.8   rse
    o  i686-pc-freebsd2.2.8        FreeBSD 2.2.8         0.9.8   rse
    o  i386-whatever-netbsd1.3.2   NetBSD/i386 1.3.2     0.9.8   rse
    o  i386-whatever-netbsd1.4     NetBSD/i386 1.4       0.9.8   simons
    o  i686-whatever-linux2        RedHat 4.1            0.9.8   rse
    o  i586-whatever-linux2        RedHat 5.2            0.9.17  rse
    o  sun4u-sun-solaris2.5.1      Solaris 2.5.1         0.9.13  rse
    o  sun4m-sun-solaris2.6        Solaris 2.6           0.9.8   rse
    o  i86pc-sun-solaris2.7        Solaris 2.7           0.9.8   rse
    o  9000/735-hp-hpux10.20       HPUX 10.20            0.9.8   rse
    o  alpha-dec-osf4.0            OSF/1 4.0             0.9.8   rse
    o  9100-ibm-aix4.2             AIX 4.2               0.9.8   rse
    o  4C00-ibm-aix4.3             AIX 4.3               0.9.8   rse
    o  IP22-sgi-irix6.2            IRIX 6.2              0.9.8   rse
    o  i386-whatever-unixware2     UnixWare 2.1.3        0.9.8   rse
    o  i386-whatever-unixware7     UnixWare 7.0          0.9.8   rse
    o  i386-siemens-svr4           SINIX-D 5.41          0.9.8   martin
    o  mips-siemens-svr4           ReliantUNIX-N 5.43    0.9.8   martin

  PORTING

  In case you're not able to use NPS on a new and esoteric platform,
  here are a few hints.

  NPS has only one part which perhaps has to be ported to new platforms: the
  machine context initialization, i.e. the function nps_mctx_set() in
  nps_mctx.c.  The exercise is to write a nps_mctx_set() function which
  initializes a `jmp_buf' (see setjmp(3)) with a given function and stack, so
  when the next longjmp(3) is done on this `jmp_buf' the function starts
  executing on the given stack.  
  
  Per default NPS uses a very tricky sigstack/sigaltstack() based approach for
  establishing this `jmp_buf' which is 98% portable to all major Unix
  platforms which support the involved POSIX functions. So the chance is very
  high that this approach also works for forthcoming platforms and no real
  porting is required. 
  
  When this approach should not work (for instance brain-dead Linux has a
  dummy sigstack/sigaltstack(), so we've no chance this way), then you've to
  provide an alternative implementation. This usually is done be fiddling
  around with the ingredients of a `jmp_buf' structure. For this look inside
  your /usr/include/setjmp.h (plus files it includes) and there especially for
  things like _pc or JB_PC (the program counter) and _sp or JB_SP (the stack
  pointer). Then write an alternative nps_mctx_set() function in nps_mctx.c.

  Currently, as mentioned, NPS requires such an alternative only under Linux
  where sigstack/sigaltstack() are dummy functions. Look at the Linux
  nps_mctx_set() variant in nps_mctx.c to get an impression what type of
  `jmp_buf' fiddling you perhaps have to do for esoteric platforms.  Don't be
  confused by the fact that such specialized nps_mctx_set() functions are just
  a few lines long while the standard function is very large. That's all just
  needed for maximum portability.  The goal nevertheless only is to initialize
  a `jmp_buf' with PC and SP. That's all...

