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

 NPS - Non-Preemptive Thread Scheduling Library

 Source Code Changes
 ===================

 Changes between 0.9.17 and 0.9.18 (18-Jun-1999 to 20-Jun-1999)
  
  *) Greatly extended the manual page nps.pod
  *) Added inclusion hack to pthread.h.in
  *) Added per thread cleanup functions nps_cleanup_{push,pop}() modeled
     directly after the POSIX pthread_cleanup_{push,pop}() functions
  *) Fixed a memory leak related to nps_key_xxx().
  *) Added internal nps_pqueue_contains() function
  *) Added public API function nps_cancel(), nps_cancel_state() and
     nps_cancel_point() for thread cancellation support modeled after the
     POSIX thread cancellation facility.
  *) Removed pthread.* stuff. It will be re-integrated later for NPS 1.1.x
  *) Added cancellation flags to nps_attr().
  *) Added cancellation demo support to test_sig.c

 Changes between 0.9.16 and 0.9.17 (09-Jun-1999 to 18-Jun-1999)

  *) Removed pthread_p.h
  *) Upgraded to shtool 1.3.0-dev
  *) Added stack overflow detection: a SIGSEGV is created when a
     guardian memory address at the bottom of the stack was
     overridden. This SIGSEGV can be even catched by the
     application.

 Changes between 0.9.15 and 0.9.16 (04-Jun-1999 to 09-Jun-1999)

  *) Some Autoconf related cleanups.
  *) Added configure --enable-batch for FreeBSD port
  *) Removed TODO file
  *) Moved sigdelete stuff to new nps_util.c source
  *) Added nps_sigwait_ev()
  *) Updated nps.pod for recent changes
  *) Fixed Linux libc v5 nps_mctx_set() variant

 Changes between 0.9.14 and 0.9.15 (01-Jun-1999 to 04-Jun-1999)

  *) Upgraded to shtool 1.2.9
  *) Avoid race conditions in emulated sigsetjmp() switching
  *) Added test_sig.c
  *) Fixed getsockopt() call: errlen wasn't initialized
  *) Allow nps_event_walk() also to use NPS_UNTIL_OCCURRED
     to walk to the next/prev. occurred event in a ring
  *) Completely overhauled the signal processing in the scheduler
  *) Added nps_sigwait() with POSIX semantics
  *) Fixed nps_join(): It returns -1 when only one thread is left
  *) Autoconf now no longer adds -g for gcc unless --enable-debug

 Changes between 0.9.13 and 0.9.14 (01-Jun-1999 to 01-Jun-1999)

  *) Simplified the event construction by removing unnecessary NPS_UNTIL_XX
     flags and renaming the remaining ones to NPS_UNTIL_YY_XXX.
  *) Renamed NPS_EVENT_IRQ to NPS_EVENT_SIG and implemented it the first time
     via sigpending()/sigismember().
  *) Documented the event facility in the manual page 
  *) Switched TCB's name attribute from "char *" to "char[40]" and copy in the
     value when spawning. This allows applications to generate the name
     temporarily only.
  *) Cleaned up source code at lots of edges...

 Changes between 0.9.12 and 0.9.13 (30-May-1999 to 01-Jun-1999)
  
  *) Cleaned up Makefile.in even more
  *) Add stackaddr argument to nps_attr() to allow the application
     to specificy a particular stack
  *) Added pthread* files which will contain the POSIX.1c threading
     ("pthread") API wrapper for NPS. This is still work in progress and not
     enabled per default (one has to use --enable-pthread).
  *) Added SunSoft's pthread_June95.ps document ("PThreads Summary")
     as pthreads.ps
  *) Update nps.pod to reflect recent changes.
  *) Optimized nps_time_cmp()
  *) Added support for per-thread signal masks
  *) Made nps_mctx_set() more robust: It now uses sigsuspend for
     waiting, correctly blocks signals and restores SIGUSR1 stuff
  *) Fixed license messages in sources files
  *) Removed const from nps_connect and nps_connect_ev to avoid problems
  *) Make sure Autoconf doesn't add -lnsl twice
  *) Cleaned up nps_mctx.c even more

 Changes between 0.9.11 and 0.9.12 (28-May-1999 to 30-May-1999)

  *) Some fixes to test_httpd.c: init of addrlen, REQ_MAX handling
  *) Allow nps_join(NULL) to join any available terminated thread
  *) Fixed incorrect nps_event_concat() usages: terminated NULL was missing
  *) Added nps_connect, nps_connect_ev and nps_accept_ev functions
  *) Removed unnecessary b_extra stuff from nps_read/nps_write
  *) Removed "intern" on nps_time(), it's a public API function
  *) Added nps_timeout() constructor function
  *) Fixed event handling for all nps_xxx_ev() functions
  *) Use nps_readline_ev() in test_mp to show how nps_xxx_ev() works
  *) Converted nps_nap() and nps_join() to use NPS_MODE_STATIC
  *) Fixed event initialization in event rings
  *) Kicked out the whole "occurred event ring" stuff because it's not really
     necessary (one can walk through a single ring and check for occurred
     events easily) and this way two nasty bugs can be fixed and the event
     manager simplified a lot. nps_wait() not has only one argument
     and this is a read-only one, i.e. only the occured flag is set
     in the events in this ring, but the ring is no longer changed.

 Changes between 0.9.10 and 0.9.11 (28-May-1999 to 28-May-1999)

  *) Fix warnings in test_httpd.c
  *) Upgraded to final shtool 1.2.8 
  *) Added NPS_KEY_INIT 
  *) Added NPS_MODE_STATIC for statically allocating
     a per-thread event. This is now used by the various high-level functions
     to avoid unnecessary alloc/free sequences.

 Changes between 0.9.9 and 0.9.10 (25-May-1999 to 28-May-1999)

  *) Cleaned up Makefile.in
  *) Upgraded to GNU libtool 1.3.2
  *) Upgraded to new shtool 1.2.8 which includes scpp
  *) Merged all nps_foo.h's into nps_foo.c's with the help of shtool scpp
  *) Updated dependencies after nps_p.h overhauling
  *) Added TODO file

 Changes between 0.9.8 and 0.9.9 (24-May-1999 to 25-May-1999)

  *) Finally converted library generation to use GNU libtool
  *) Add hints to BIND 8 and adns to manual page
  *) Fixed memory leaks in test_httpd and test_mp
  *) Fixed typos in manual page
  *) Fix -lsocket -lnsl tests for Siemens platforms
  *) Fix chmod in Autoconf stuff
  *) Removed unneccessary nps_ring_linked()

 Changes between 0.9.7 and 0.9.8 (23-May-1999 to 24-May-1999)

  *) Fixed bug in priority queue element counting (q_num)
  *) nps_spawn() now inherits the attributes from the parent thread
  *) Merged nps_stat() and nps_load() into a generic extensible nps_ctrl()
  *) Added new nps_fork() function
  *) Added depend target to Makefile.in and generated dependencies
  *) Moved joinable argument from nps_attr() to the flags argument
  *) Added NPS_CTRL_GETPRIO and NPS_CTRL_GETNAME.
  *) Typo was everywhere: preemtive => preemptive 
  *) Typo was everywhere: occured => occurred 
  *) Finished manual page
  *) Removed useless NPS_UNTIL_RUNNING
  *) Replaced errno support with a better variant
  *) Lots of small fixes and portability cleanups

 Changes between 0.9.6 and 0.9.7 (22-May-1999 to 23-May-1999)

  *) Added PORTING document.
  *) Added errno support (nps_errno.[ch]).
  *) Added exponential average load calculations for scheduler.  The current
     load value can be retrieved by the application through nps_load().

 Changes between 0.9.5 and 0.9.6 (21-May-1999 to 22-May-1999)

  *) Added more documentation.
  *) Autoconf now determines the direction of stack grow and nps_mctx_set()
     uses this information for sigstack() now.
  *) Fixed acconfig.h
  *) Increased stacksizes (was too small for Solaris and friends)
  *) Switched from BSD-style license to LGPL license
  *) Fixed a nasty bug in scheduler:
     when a thread was moved from the wait to the ready queue, it's state
     wasn't changed to nps_state_ready. This way the next time it was handled
     it was incorrectly filed to the waiting queue (which caused core dumps
     because the ev_waiting/ev_occurred pointers didn't exist).  This way now
     the stuff works great also under Solaris!

 Changes between 0.9.4 and 0.9.5 (21-May-1999 to 21-May-1999)

  *) Renamed nps_{get,set}specific() to nps_key_{get,set}data().
  *) Renamed remaining nps_message_xxx() to nps_msgport_xxx()
  *) Added nps_{readline,read,write}_ev() functions which are similar to
     nps_{readline,read,write}() but have an additional event argument which
     can be used for timeouts and other parallel events.

 Changes between 0.9.3 and 0.9.4 (14-May-1999 to 21-May-1999)

  *) Added ring datastructures (nps_ring.[ch]).
  *) Add an AmigaOS-style message port facility (nps_msg.[ch]).
  *) Added a message port related test program (test_mp.c).
  *) Fix scheduler event management bug: when no I/O events existed
     plus a next timer but other events (e.g. message ports) already occurred,
     the scheduler blocked instead of handling the already occurred events
     first.
  *) Fix bug in event creating: the event occurrence flag has to be cleared in
     nps_wait() to avoid spinning events which were already occurred.

 Changes between 0.9.2 and 0.9.3 (14-May-1999 to 14-May-1999)

  *) Added nps_once() for later (pthreads!)
  *) Splitted nps.c into nps.c and nps_high.c
  *) Added nps_data.[ch] with pthread style data storage stuff
  *) Moved readline stuff from test_httpd to nps_high.c as nps_readline()
  *) Removed debugging fprintf from test_httpd to speed it up
  *) Fixed listen() call: now uses REQ_MAX for backlog and tests for -1
  *) Fix a polling-related timer bug in the event manager

 Changes between 0.9.1 and 0.9.2 (13-May-1999 to 14-May-1999)

  *) renamed nps_asynchronize() to nps_nonblocking()
  *) removed implicit nps_nonblocking() calls
  *) speeded up nps_accept by optimizing event alloc/free
  *) cleaned up nps_waitpid
  *) Changed semantics of nps_wait(var, NULL): it now means
     that the events in var are not removed (although their
     chanining might be changed)
  *) Renamed internal nps_usleep() to nps_time_usleep()
  *) Replaced nps_sleep() with nps_nap() and added
     two replacement functions: nps_sleep() for a variant
     of sleep(3) and nps_usleep() for a variant of usleep(3).
  *) Optimized scheduler a little bit by inlining nps_time_{set,add,sub}
  *) Added nps_pqueue_{head,walk} functions and used it in eventmanager
  *) Rewrote nps_sched_eventmanager() without a surrounding loop
  *) Implemented a readline() function to speedup test_httpd

 Changes between 0.9.0 and 0.9.1 (12-May-1999 to 13-May-1999)

  *) Imported into CVS repository

 Changes between GENESIS and 0.9.0 (Feb-1999 to 12-May-1999)

  *) Created initial version on FreeBSD
  *) Ported to Linux

