This is a copy of CONTRIBUTORS file for the Pthreads-win32 library, downloaded
from http://sourceware.org/cgi-bin/cvsweb.cgi/~checkout~/pthreads/CONTRIBUTORS?rev=1.32&cvsroot=pthreads-win32

Included here to compliment the Pthreads-win32 license header in ThreadingWin.cpp file.
WebKit is using derived sources of ThreadCondition code from Pthreads-win32.

-------------------------------------------------------------------------------

Contributors (in approximate order of appearance)

[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;
					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;
					suggested a robust implementation of pthread_once
					similar to that implemented by V.Kliathcko;
					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).
Vladimir Kliatchko	vladimir at kliatchko dot com
					reimplemented pthread_once with the same form
					as described by A.Terekhov (later version 2);
					implementation of MCS (Mellor-Crummey/Scott) locks.