diff options
| -rw-r--r-- | ANNOUNCE | 15 | ||||
| -rw-r--r-- | BUGS | 11 | ||||
| -rw-r--r-- | CONTRIBUTORS | 238 | ||||
| -rw-r--r-- | ChangeLog | 121 | ||||
| -rw-r--r-- | NEWS | 59 | ||||
| -rw-r--r-- | pthread_setcancelstate.c | 2 | ||||
| -rw-r--r-- | tests/ChangeLog | 12 | ||||
| -rw-r--r-- | tests/mutex5.c | 18 | 
8 files changed, 264 insertions, 212 deletions
| @@ -1,16 +1,11 @@ -		 PTHREADS-WIN32 SNAPSHOT 2005-03-08
 -		 ----------------------------------
 +	     PTHREADS-WIN32 RELEASE 2.0.0 (2005-03-16)
 +	     -----------------------------------------
  	 Web Site: http://sources.redhat.com/pthreads-win32/
  	FTP Site: ftp://sources.redhat.com/pub/pthreads-win32
  	 Maintainer: Ross Johnson <rpj@callisto.canberra.edu.au>
 -[Please note: snapshots from 2004-11-03 are using a new mutex implementation
 -and should be regarded as beta code. You may not want to use it in production
 -yet but please try it if you can. No mutex related problems have been reported -since snapshot 2005-01-25.]
 - -We are pleased to announce the availability of a new snapshot of
 +We are pleased to announce the availability of a new release of
  Pthreads-win32, an Open Source Software implementation of the
  Threads component of the POSIX 1003.1 2001 Standard for Microsoft's
  Win32 environment. Some functions from other sections of POSIX
 @@ -54,8 +49,8 @@ As much as possible, the ChangeLog file acknowledges contributions to the  code base in more detail.
 -Changes since the last snapshot
 --------------------------------
 +Changes since the last release
 +------------------------------
  These are now documented in the NEWS file.
  See the ChangeLog file also.
 @@ -25,16 +25,17 @@ Known bugs  2. Cancellation problems in optimised code
     - Milan Gardian
 +   This is suspected to be a compiler bug in VC6.0, and also seen in
 +   VC7.0 and VS .NET 2003. The GNU C++ compiler does not have a problem
 +   with this test, and it has been reported that the Intel C++ 8.1 compiler
 +   and Visual C++ 2005 Express Edition Beta2 are also ok with this test.
 +     Workaround [rpj - 2 Feb 2002]
     -----------------------------
     [Please note: this workaround did not solve a similar problem in
     snapshot-2004-11-03 or later, even though similar symptoms were seen.
     tests\semaphore4.c fails in that snapshot for the VCE version of the
 -   DLL. It is suspected to be a compiler bug in VC6.0, and also seen in
 -   VC7.0 and VS .NET 2003. The GNU C++ compiler does not have a problem
 -   with this test, and it has been reported (2005-03-05/08) that the Intel
 -   C++ 8.1 compiler and Visual C++ 2005 Express Edition Beta2 are also -   ok with this test.]
 +   DLL.]     The problem disappears when /Ob0 is used, i.e. /O2 /Ob0 works OK,
     but if you want to use inlining optimisation you can be much more
 diff --git a/CONTRIBUTORS b/CONTRIBUTORS index c23ce98..63bb70c 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,119 +1,123 @@ -Contributors (in approximate order of appearance) +Contributors (in approximate order of appearance)
 -[See also the ChangeLog file where individuals are -attributed in log entries. Likewise in the FAQ file.] +[See also the ChangeLog file where individuals are
 +attributed in log entries. Likewise in the FAQ file.]
 -Ben Elliston		bje at cygnus dot com -					Initiated the project; -					setup the project infrastructure (CVS, web page, etc.); -					early prototype routines. -Ross Johnson		rpj at callisto dot canberra dot edu dot au -					early prototype routines; -					ongoing project coordination/maintenance; -					implementation of spin locks and barriers; -					bug fixes; -					documentation; -					testsuite. -Robert Colquhoun	rjc at trump dot net dot au -					Early bug fixes. -John E. Bossom		John dot Bossom at cognos dot com -					Contributed substantial original working implementation; -					bug fixes; -					ongoing guidance and standards interpretation. -Anders Norlander	anorland at hem2 dot passagen dot se -					Early enhancements and runtime checking for supported -					Win32 routines. -Tor Lillqvist		tml at iki dot fi -					General enhancements; -					early bug fixes to condition variables. -Scott Lightner		scott at curriculum dot com -					Bug fix. -Kevin Ruland		Kevin dot Ruland at anheuser-busch dot com -					Various bug fixes. -Mike Russo		miker at eai dot com -					Bug fix. -Mark E. Armstrong	avail at pacbell dot net -					Bug fixes. -Lorin Hochstein 	lmh at xiphos dot ca -					general bug fixes; bug fixes to condition variables. -Peter Slacik		Peter dot Slacik at tatramed dot sk -					Bug fixes. -Mumit Khan		khan at xraylith dot wisc dot edu -					Fixes to work with Mingw32. -Milan Gardian		mg at tatramed dot sk -					Bug fixes and reports/analyses of obscure problems. -Aurelio Medina		aureliom at crt dot com -					First implementation of read-write locks. -Graham Dumpleton	Graham dot Dumpleton at ra dot pad dot otc dot telstra dot com dot au -					Bug fix in condition variables. -Tristan Savatier	tristan at mpegtv dot com -					WinCE port. -Erik Hensema		erik at hensema dot xs4all dot nl -					Bug fixes. -Rich Peters		rpeters at micro-magic dot com -Todd Owen		towen at lucidcalm dot dropbear dot id dot au -					Bug fixes to dll loading. -Jason Nye		jnye at nbnet dot nb dot ca -					Implementation of async cancelation. -Fred Forester		fforest at eticomm dot net -Kevin D. Clark		kclark at cabletron dot com -David Baggett		dmb at itasoftware dot com -					Bug fixes. -Paul Redondo		paul at matchvision dot com -Scott McCaskill 	scott at 3dfx dot com -					Bug fixes. -Jef Gearhart		jgearhart at tpssys dot com -					Bug fix. -Arthur Kantor		akantor at bexusa dot com -					Mutex enhancements. -Steven Reddie		smr at essemer dot com dot au -					Bug fix. -Alexander Terekhov	TEREKHOV at de dot ibm dot com -					Re-implemented and improved read-write locks; -					(with Louis Thomas) re-implemented and improved -					condition variables; -					enhancements to semaphores; -					enhancements to mutexes; -					new mutex implementation in 'futex' style; -					system clock change handling re CV timeouts; -					bug fixes. -Thomas Pfaff		tpfaff at gmx dot net -					Changes to make C version usable with C++ applications; -					re-implemented mutex routines to avoid Win32 mutexes -					and TryEnterCriticalSection; -					procedure to fix Mingw32 thread-safety issues. -Franco Bez		franco dot bez at gmx dot de -					procedure to fix Mingw32 thread-safety issues. -Louis Thomas		lthomas at arbitrade dot com -					(with Alexander Terekhov) re-implemented and improved -					condition variables. -David Korn		dgk at research dot att dot com -					Ported to UWIN. -Phil Frisbie, Jr.	phil at hawksoft dot com -					Bug fix. -Ralf Brese		Ralf dot Brese at pdb4 dot siemens dot de -					Bug fix. -prionx at juno dot com 	prionx at juno dot com -					Bug fixes. -Max Woodbury		mtew at cds dot duke dot edu -					POSIX versioning conditionals; -					reduced namespace pollution; -					idea to separate routines to reduce statically -					linked image sizes. -Rob Fanner		rfanner at stonethree dot com -					Bug fix. -Michael Johnson 	michaelj at maine dot rr dot com -					Bug fix. -Nicolas Barry		boozai at yahoo dot com -					Bug fixes. -Piet van Bruggen	pietvb at newbridges dot nl -					Bug fix. -Makoto Kato		raven at oldskool dot jp -					AMD64 port. -Panagiotis E. Hadjidoukas	peh at hpclab dot ceid dot upatras dot gr -					Contributed the QueueUserAPCEx package which -					makes preemptive async cancelation possible. -Will Bryant		will dot bryant at ecosm dot com -					Borland compiler patch and makefile. -Anuj Goyal		anuj dot goyal at gmail dot com -					Port to Digital Mars compiler. +Ben Elliston		bje at cygnus dot com
 +					Initiated the project;
 +					setup the project infrastructure (CVS, web page, etc.);
 +					early prototype routines.
 +Ross Johnson		rpj at callisto dot canberra dot edu dot au
 +					early prototype routines;
 +					ongoing project coordination/maintenance;
 +					implementation of spin locks and barriers;
 +					various enhancements;
 +					bug fixes;
 +					documentation;
 +					testsuite.
 +Robert Colquhoun	rjc at trump dot net dot au
 +					Early bug fixes.
 +John E. Bossom		John dot Bossom at cognos dot com
 +					Contributed substantial original working implementation;
 +					bug fixes;
 +					ongoing guidance and standards interpretation.
 +Anders Norlander	anorland at hem2 dot passagen dot se
 +					Early enhancements and runtime checking for supported
 +					Win32 routines.
 +Tor Lillqvist		tml at iki dot fi
 +					General enhancements;
 +					early bug fixes to condition variables.
 +Scott Lightner		scott at curriculum dot com
 +					Bug fix.
 +Kevin Ruland		Kevin dot Ruland at anheuser-busch dot com
 +					Various bug fixes.
 +Mike Russo		miker at eai dot com
 +					Bug fix.
 +Mark E. Armstrong	avail at pacbell dot net
 +					Bug fixes.
 +Lorin Hochstein 	lmh at xiphos dot ca
 +					general bug fixes; bug fixes to condition variables.
 +Peter Slacik		Peter dot Slacik at tatramed dot sk
 +					Bug fixes.
 +Mumit Khan		khan at xraylith dot wisc dot edu
 +					Fixes to work with Mingw32.
 +Milan Gardian		mg at tatramed dot sk
 +					Bug fixes and reports/analyses of obscure problems.
 +Aurelio Medina		aureliom at crt dot com
 +					First implementation of read-write locks.
 +Graham Dumpleton	Graham dot Dumpleton at ra dot pad dot otc dot telstra dot com dot au
 +					Bug fix in condition variables.
 +Tristan Savatier	tristan at mpegtv dot com
 +					WinCE port.
 +Erik Hensema		erik at hensema dot xs4all dot nl
 +					Bug fixes.
 +Rich Peters		rpeters at micro-magic dot com
 +Todd Owen		towen at lucidcalm dot dropbear dot id dot au
 +					Bug fixes to dll loading.
 +Jason Nye		jnye at nbnet dot nb dot ca
 +					Implementation of async cancelation.
 +Fred Forester		fforest at eticomm dot net
 +Kevin D. Clark		kclark at cabletron dot com
 +David Baggett		dmb at itasoftware dot com
 +					Bug fixes.
 +Paul Redondo		paul at matchvision dot com
 +Scott McCaskill 	scott at 3dfx dot com
 +					Bug fixes.
 +Jef Gearhart		jgearhart at tpssys dot com
 +					Bug fix.
 +Arthur Kantor		akantor at bexusa dot com
 +					Mutex enhancements.
 +Steven Reddie		smr at essemer dot com dot au
 +					Bug fix.
 +Alexander Terekhov	TEREKHOV at de dot ibm dot com
 +					Re-implemented and improved read-write locks;
 +					(with Louis Thomas) re-implemented and improved
 +					condition variables;
 +					enhancements to semaphores;
 +					enhancements to mutexes;
 +					new mutex implementation in 'futex' style;
 +					system clock change handling re CV timeouts;
 +					bug fixes.
 +Thomas Pfaff		tpfaff at gmx dot net
 +					Changes to make C version usable with C++ applications;
 +					re-implemented mutex routines to avoid Win32 mutexes
 +					and TryEnterCriticalSection;
 +					procedure to fix Mingw32 thread-safety issues.
 +Franco Bez		franco dot bez at gmx dot de
 +					procedure to fix Mingw32 thread-safety issues.
 +Louis Thomas		lthomas at arbitrade dot com
 +					(with Alexander Terekhov) re-implemented and improved
 +					condition variables.
 +David Korn		dgk at research dot att dot com
 +					Ported to UWIN.
 +Phil Frisbie, Jr.	phil at hawksoft dot com
 +					Bug fix.
 +Ralf Brese		Ralf dot Brese at pdb4 dot siemens dot de
 +					Bug fix.
 +prionx at juno dot com 	prionx at juno dot com
 +					Bug fixes.
 +Max Woodbury		mtew at cds dot duke dot edu
 +					POSIX versioning conditionals;
 +					reduced namespace pollution;
 +					idea to separate routines to reduce statically
 +					linked image sizes.
 +Rob Fanner		rfanner at stonethree dot com
 +					Bug fix.
 +Michael Johnson 	michaelj at maine dot rr dot com
 +					Bug fix.
 +Nicolas Barry		boozai at yahoo dot com
 +					Bug fixes.
 +Piet van Bruggen	pietvb at newbridges dot nl
 +					Bug fix.
 +Makoto Kato		raven at oldskool dot jp
 +					AMD64 port.
 +Panagiotis E. Hadjidoukas	peh at hpclab dot ceid dot upatras dot gr
 +					Contributed the QueueUserAPCEx package which
 +					makes preemptive async cancelation possible.
 +Will Bryant		will dot bryant at ecosm dot com
 +					Borland compiler patch and makefile.
 +Anuj Goyal		anuj dot goyal at gmail dot com
 +					Port to Digital Mars compiler.
 +Gottlob Frege		gottlobfrege at  gmail dot com
 +					re-implemented pthread_once (version 2) +					(pthread_once cancellation added by rpj). @@ -1,75 +1,80 @@ -2005-03-14  Ross Johnson  <ross at callisto.canberra.edu.au> +2005-03-16  Ross Johnson  <ross at callisto.canberra.edu.au>^M -	* pthread_once.c (pthread_once): Downgrade interlocked operations to simple -	memory operations where these are protected by the critical section; edit -	comments. +        * pthread_setcancelstate.c: Don't check for an async cancel event +        if the library is using alertable async cancel.. -2005-03-13  Ross Johnson  <rpj at callisto.canberra.edu.au> +2005-03-14  Ross Johnson  <ross at callisto.canberra.edu.au>
 -	* pthread_once.c (pthread_once): Completely redesigned; a change was -	required to the ABI (pthread_once_t_), and resulting in a version -	compatibility index increment. +	* pthread_once.c (pthread_once): Downgrade interlocked operations to simple
 +	memory operations where these are protected by the critical section; edit
 +	comments.
 + +2005-03-13  Ross Johnson  <rpj at callisto.canberra.edu.au>
 + +	* pthread_once.c (pthread_once): Completely redesigned; a change was
 +	required to the ABI (pthread_once_t_), and resulting in a version
 +	compatibility index increment.
 -	NOTES: -	The design (based on pseudo code contributed by Gottlob Frege) avoids -	creating a kernel object if there is no contention. See URL for details:- -	http://sources.redhat.com/ml/pthreads-win32/2005/msg00029.html -	This uses late initialisation similar to the technique already used for -	pthreads-win32 mutexes and semaphores (from Alexander Terekhov). +	NOTES:
 +	The design (based on pseudo code contributed by Gottlob Frege) avoids
 +	creating a kernel object if there is no contention. See URL for details:-
 +	http://sources.redhat.com/ml/pthreads-win32/2005/msg00029.html
 +	This uses late initialisation similar to the technique already used for
 +	pthreads-win32 mutexes and semaphores (from Alexander Terekhov).
 -	The subsequent cancelation cleanup additions (by rpj) could not be implemented -	without sacrificing some of the efficiency in Gottlob's design. In particular, -	although each once_control uses it's own event to block on, a global CS is -	required to manage it - since the event must be either re-usable or -	re-creatable under cancelation. This is not needed in the non-cancelable -	design because it is able to mark the event as closed (forever). +	The subsequent cancelation cleanup additions (by rpj) could not be implemented
 +	without sacrificing some of the efficiency in Gottlob's design. In particular,
 +	although each once_control uses it's own event to block on, a global CS is
 +	required to manage it - since the event must be either re-usable or
 +	re-creatable under cancelation. This is not needed in the non-cancelable
 +	design because it is able to mark the event as closed (forever).
 -	When uncontested, a CS operation is equivalent to an Interlocked operation -	in speed. So, in the final design with cancelability, an uncontested -	once_control operation involves a minimum of five interlocked operations -	(including the LeaveCS operation). -	 -	ALTERNATIVES: -	An alternative design from Alexander Terekhov proposed using a named mutex, -	as sketched below:- +	When uncontested, a CS operation is equivalent to an Interlocked operation
 +	in speed. So, in the final design with cancelability, an uncontested
 +	once_control operation involves a minimum of five interlocked operations
 +	(including the LeaveCS operation).
 +	
 +	ALTERNATIVES:
 +	An alternative design from Alexander Terekhov proposed using a named mutex,
 +	as sketched below:-
 -	  if (!once_control) { // May be in TLS -	    named_mutex::guard guard(&once_control2); -	      if (!once_control2) { -	         <init> -	         once_control2 = true; -	      } -	    once_control = true; -	  } -	 -	A more detailed description of this can be found here:- -	http://groups.yahoo.com/group/boost/message/15442 +	  if (!once_control) { // May be in TLS
 +	    named_mutex::guard guard(&once_control2);
 +	      if (!once_control2) {
 +	         <init>
 +	         once_control2 = true;
 +	      }
 +	    once_control = true;
 +	  }
 +	
 +	A more detailed description of this can be found here:-
 +	http://groups.yahoo.com/group/boost/message/15442
 -	[Although the definition of a suitable PTHREAD_ONCE_INIT precludes use of the -	TLS located flag, this is not critical.] -	 -	There are three primary concerns though:- -	1) The [named] mutex is 'created' even in the uncontended case. -	2) A system wide unique name must be generated. -	3) Win32 mutexes are VERY slow even in the uncontended 	case. An uncontested -	Win32 mutex lock operation can be 50 (or more) times slower than an -	uncontested EnterCS operation. +	[Although the definition of a suitable PTHREAD_ONCE_INIT precludes use of the
 +	TLS located flag, this is not critical.]
 +	
 +	There are three primary concerns though:-
 +	1) The [named] mutex is 'created' even in the uncontended case.
 +	2) A system wide unique name must be generated.
 +	3) Win32 mutexes are VERY slow even in the uncontended 	case. An uncontested
 +	Win32 mutex lock operation can be 50 (or more) times slower than an
 +	uncontested EnterCS operation.
 -	Ultimately, the named mutex trick is making use of the global locks maintained -	by the kernel. +	Ultimately, the named mutex trick is making use of the global locks maintained
 +	by the kernel.
 -	* pthread.h (pthread_once_t_): One flag and an event HANDLE added. -	(PTHREAD_ONCE_INIT): Additional values included. +	* pthread.h (pthread_once_t_): One flag and an event HANDLE added.
 +	(PTHREAD_ONCE_INIT): Additional values included.
  2005-03-08  Ross Johnson  <rpj at callisto.canberra.edu.au>
 -	* pthread_once.c (pthread_once): Redesigned to elliminate potential -	starvation problem. -	- reported by Gottlob Frege  <gottlobfrege at gmail.com> +	* pthread_once.c (pthread_once): Redesigned to elliminate potential
 +	starvation problem.
 +	- reported by Gottlob Frege  <gottlobfrege at gmail.com>
 -	* ptw32_threadDestroy.c (ptw32_threadDestroy): Implicit threads were -	not closing their Win32 thread duplicate handle. -	- reported by Dmitrii Semii <bogolt at gmail.com> +	* ptw32_threadDestroy.c (ptw32_threadDestroy): Implicit threads were
 +	not closing their Win32 thread duplicate handle.
 +	- reported by Dmitrii Semii <bogolt at gmail.com>
  2005-01-25  Ralf Kubis  <RKubis at mc.com>
 @@ -1,25 +1,62 @@ +RELEASE 2.0.0^M +-------------^M +(2005-03-16) +^M +General +------- + +This release represents an ABI change and the DLL version naming has +incremented from 1 to 2, e.g. pthreadVC2.dll. + +Version 1.4.0 back-ports the new functionality included in this +release. Please distribute DLLs built from that version with updates +to applications built on pthreads-win32 version 1.x.x. + +The package naming has changed, replacing the snapshot date with  +the version number + descriptive information. E.g. this +release is "pthreads-w32-2-0-0-release". + +Bugs fixed +---------- + +* pthread_setcancelstate() no longer checks for a pending +async cancel event if the library is using alertable async +cancel. See the README file (Prerequisites section) for info +on adding alertable async cancelation. + +New features +------------^M + +* pthread_once() now supports init_routine cancellability. + +New tests +--------- + +* Agressively test pthread_once() init_routine cancellability. + +  SNAPSHOT 2005-03-08
  -------------------
 -Version 1.3.0 +Version 1.3.0
  Bug reports (fixed)
  -------------------
 -* Implicitly created threads leave Win32 handles behind after exiting. -- Dmitrii Semii +* Implicitly created threads leave Win32 handles behind after exiting.
 +- Dmitrii Semii
 -* pthread_once() starvation problem. -- Gottlob Frege +* pthread_once() starvation problem.
 +- Gottlob Frege
 -New tests ---------- +New tests
 +---------
 -* More intense testing of pthread_once(). +* More intense testing of pthread_once().
  SNAPSHOT 2005-01-25
  -------------------
 -Version 1.2.0 +Version 1.2.0
  Bug fixes
  ---------
 @@ -33,7 +70,7 @@ to not be woken when the mutex was released.  SNAPSHOT 2005-01-03
  -------------------
 -Version 1.1.0 +Version 1.1.0
  Bug fixes
  ---------
 @@ -46,7 +83,7 @@ snapshot-2004-11-03).  SNAPSHOT 2004-11-22
  -------------------
 -Version 1.0.0 +Version 1.0.0
  This snapshot primarily fixes the condvar bug introduced in
  snapshot-2004-11-03. DLL versioning has also been included to allow
 diff --git a/pthread_setcancelstate.c b/pthread_setcancelstate.c index 002cfe5..12fdda4 100644 --- a/pthread_setcancelstate.c +++ b/pthread_setcancelstate.c @@ -103,8 +103,10 @@ pthread_setcancelstate (int state, int *oldstate)    /*     * Check if there is a pending asynchronous cancel +   * only if we don't have alertable async cancel.     */    if (state == PTHREAD_CANCEL_ENABLE +      && (ptw32_features & PTW32_ALERTABLE_ASYNC_CANCEL) == 0        && sp->cancelType == PTHREAD_CANCEL_ASYNCHRONOUS        && WaitForSingleObject (sp->cancelEvent, 0) == WAIT_OBJECT_0)      { diff --git a/tests/ChangeLog b/tests/ChangeLog index 321adc3..7b03968 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,10 +1,14 @@ -2005-03-12  Ross Johnson  <rpj@callisto.canberra.edu.au> +2005-03-16  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -	* once3.c: New test. +	* mutex5.c: Prevent optimiser from removing asserts. -2005-03-08  Ross Johnson  <rpj@callisto.canberra.edu.au> +2005-03-12  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -        * once2.c: New test. +	* once3.c: New test.
 + +2005-03-08  Ross Johnson  <rpj@callisto.canberra.edu.au>
 + +        * once2.c: New test.
  2004-11-19  Ross Johnson  <rpj@callisto.canberra.edu.au>
 diff --git a/tests/mutex5.c b/tests/mutex5.c index a597892..a71f9d8 100644 --- a/tests/mutex5.c +++ b/tests/mutex5.c @@ -41,19 +41,23 @@  static pthread_mutexattr_t mxAttr; +/* Prevent optimiser from removing dead or obvious asserts. */ +int _optimiseFoil; +#define FOIL(x) (_optimiseFoil = x) +  int  main()  {    int mxType = -1; -  assert(PTHREAD_MUTEX_DEFAULT == PTHREAD_MUTEX_NORMAL); -  assert(PTHREAD_MUTEX_DEFAULT != PTHREAD_MUTEX_ERRORCHECK); -  assert(PTHREAD_MUTEX_DEFAULT != PTHREAD_MUTEX_RECURSIVE); -  assert(PTHREAD_MUTEX_RECURSIVE != PTHREAD_MUTEX_ERRORCHECK); +  assert(FOIL(PTHREAD_MUTEX_DEFAULT) == PTHREAD_MUTEX_NORMAL); +  assert(FOIL(PTHREAD_MUTEX_DEFAULT) != PTHREAD_MUTEX_ERRORCHECK); +  assert(FOIL(PTHREAD_MUTEX_DEFAULT) != PTHREAD_MUTEX_RECURSIVE); +  assert(FOIL(PTHREAD_MUTEX_RECURSIVE) != PTHREAD_MUTEX_ERRORCHECK); -  assert(PTHREAD_MUTEX_NORMAL == PTHREAD_MUTEX_FAST_NP); -  assert(PTHREAD_MUTEX_RECURSIVE == PTHREAD_MUTEX_RECURSIVE_NP); -  assert(PTHREAD_MUTEX_ERRORCHECK == PTHREAD_MUTEX_ERRORCHECK_NP); +  assert(FOIL(PTHREAD_MUTEX_NORMAL) == PTHREAD_MUTEX_FAST_NP); +  assert(FOIL(PTHREAD_MUTEX_RECURSIVE) == PTHREAD_MUTEX_RECURSIVE_NP); +  assert(FOIL(PTHREAD_MUTEX_ERRORCHECK) == PTHREAD_MUTEX_ERRORCHECK_NP);    assert(pthread_mutexattr_init(&mxAttr) == 0);    assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); | 
