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 wtf/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.