diff options
| author | rpj <rpj> | 2005-04-25 14:42:37 +0000 | 
|---|---|---|
| committer | rpj <rpj> | 2005-04-25 14:42:37 +0000 | 
| commit | 3ef98898333255b8000e9ab4801652c42fd5aacc (patch) | |
| tree | 58fbe722c2011a392ffb47ad56b97fe44e2fe59c /tests | |
| parent | 75a3015fd7412637a02b1b016b367f5deadfde94 (diff) | |
''
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/Bmakefile | 690 | ||||
| -rw-r--r-- | tests/ChangeLog | 1746 | ||||
| -rw-r--r-- | tests/GNUmakefile | 698 | ||||
| -rw-r--r-- | tests/Makefile | 738 | ||||
| -rw-r--r-- | tests/README.benchtests | 194 | ||||
| -rw-r--r-- | tests/Wmakefile | 682 | ||||
| -rw-r--r-- | tests/benchtest1.c | 498 | ||||
| -rw-r--r-- | tests/benchtest5.c | 318 | ||||
| -rw-r--r-- | tests/condvar3.c | 296 | ||||
| -rw-r--r-- | tests/condvar3_1.c | 402 | ||||
| -rw-r--r-- | tests/condvar3_2.c | 386 | ||||
| -rw-r--r-- | tests/condvar3_3.c | 264 | ||||
| -rw-r--r-- | tests/condvar4.c | 338 | ||||
| -rw-r--r-- | tests/condvar5.c | 336 | ||||
| -rw-r--r-- | tests/condvar6.c | 484 | ||||
| -rw-r--r-- | tests/condvar7.c | 514 | ||||
| -rw-r--r-- | tests/condvar8.c | 516 | ||||
| -rw-r--r-- | tests/condvar9.c | 534 | ||||
| -rw-r--r-- | tests/once4.c | 382 | ||||
| -rw-r--r-- | tests/semaphore1.c | 318 | 
20 files changed, 5167 insertions, 5167 deletions
| diff --git a/tests/Bmakefile b/tests/Bmakefile index 6263866..6ab5a34 100644 --- a/tests/Bmakefile +++ b/tests/Bmakefile @@ -1,345 +1,345 @@ -# Makefile for the pthreads test suite.
 -# If all of the .pass files can be created, the test suite has passed.
 -#
 -# --------------------------------------------------------------------------
 -#
 -#      Pthreads-win32 - POSIX Threads Library for Win32
 -#      Copyright(C) 1998 John E. Bossom
 -#      Copyright(C) 1999,2005 Pthreads-win32 contributors
 -# 
 -#      Contact Email: rpj@callisto.canberra.edu.au
 -# 
 -#      The current list of contributors is contained
 -#      in the file CONTRIBUTORS included with the source
 -#      code distribution. The list can also be seen at the
 -#      following World Wide Web location:
 -#      http://sources.redhat.com/pthreads-win32/contributors.html
 -# 
 -#      This library is free software; you can redistribute it and/or
 -#      modify it under the terms of the GNU Lesser General Public
 -#      License as published by the Free Software Foundation; either
 -#      version 2 of the License, or (at your option) any later version.
 -# 
 -#      This library is distributed in the hope that it will be useful,
 -#      but WITHOUT ANY WARRANTY; without even the implied warranty of
 -#      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 -#      Lesser General Public License for more details.
 -# 
 -#      You should have received a copy of the GNU Lesser General Public
 -#      License along with this library in the file COPYING.LIB;
 -#      if not, write to the Free Software Foundation, Inc.,
 -#      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 -#
 -
 -DLL_VER	= 2
 -
 -CP	= copy
 -RM	= erase
 -CAT	= type
 -MKDIR	= mkdir
 -TOUCH	= echo Passed >
 -ECHO	= @echo
 -
 -QAPC	= ..\QueueUserAPCEx\User\quserex.dll
 -
 -CPHDR	= pthread.h semaphore.h sched.h
 -
 -OPTIM	= -O2
 -
 -XXLIBS	= ws2_32.lib
 -
 -# C++ Exceptions
 -BCEFLAGS	= -P -DPtW32NoCatchWarn -D__CLEANUP_CXX
 -BCELIB	= pthreadBCE$(DLL_VER).lib
 -BCEDLL	= pthreadBCE$(DLL_VER).dll
 -# C cleanup code
 -BCFLAGS	= -D__CLEANUP_C
 -BCLIB	= pthreadBC$(DLL_VER).lib
 -BCDLL	= pthreadBC$(DLL_VER).dll
 -# C++ Exceptions in application - using VC version of pthreads dll
 -BCXFLAGS	= -D__CLEANUP_C
 -
 -# Defaults
 -CPLIB	= $(BCLIB)
 -CPDLL	= $(BCDLL)
 -
 -CFLAGS= -q $(OPTIM) -w -tWC -tWM -w-aus -w-asc -w-par
 -LFLAGS= 
 -INCLUDES=-I.
 -BUILD_DIR=..
 -
 -COPYFILES	= $(CPHDR) $(CPLIB) $(CPDLL) $(QAPC)
 -
 -EHFLAGS	=
 -
 -# If a test case returns a non-zero exit code to the shell, make will
 -# stop.
 -
 -PASSES=   loadfree.pass \
 -	  errno1.pass  \
 -	  self1.pass  mutex5.pass  \
 -	  mutex1.pass  mutex1n.pass  mutex1e.pass  mutex1r.pass  \
 -	  semaphore1.pass  semaphore2.pass  semaphore3.pass  \
 -	  mutex2.pass  mutex3.pass  \
 -	  mutex2r.pass  mutex2e.pass  mutex3r.pass  mutex3e.pass  \
 -	  condvar1.pass  condvar1_1.pass  condvar1_2.pass  condvar2.pass  condvar2_1.pass  \
 -	  exit1.pass  create1.pass  create2.pass  reuse1.pass  reuse2.pass  equal1.pass  \
 -	  kill1.pass  valid1.pass  valid2.pass  \
 -	  exit2.pass  exit3.pass  exit4  exit5  \
 -	  join0.pass  join1.pass  join2.pass join3.pass  \
 -	  mutex4.pass  mutex6.pass  mutex6n.pass  mutex6e.pass  mutex6r.pass  \
 -	  mutex6s.pass  mutex6es.pass  mutex6rs.pass  \
 -	  mutex7.pass  mutex7n.pass  mutex7e.pass  mutex7r.pass  \
 -	  mutex8.pass  mutex8n.pass  mutex8e.pass  mutex8r.pass  \
 -	  count1.pass  once1.pass  once2.pass  once3.pass  once4.pass  tsd1.pass  \
 -	  self2.pass  \
 -	  cancel1.pass  cancel2.pass  \
 -	  semaphore4.pass  semaphore4t.pass  \
 -	  delay1.pass  delay2.pass  eyal1.pass  \
 -	  condvar3.pass  condvar3_1.pass  condvar3_2.pass  condvar3_3.pass  \
 -	  condvar4.pass  condvar5.pass  condvar6.pass  \
 -	  condvar7.pass  condvar8.pass  condvar9.pass  \
 -	  rwlock1.pass  rwlock2.pass  rwlock3.pass  rwlock4.pass  \
 -	  rwlock5.pass  rwlock6.pass  rwlock7.pass  rwlock8.pass  \
 -	  rwlock2_t.pass  rwlock3_t.pass  rwlock4_t.pass  rwlock5_t.pass  rwlock6_t.pass  rwlock6_t2.pass  \
 -	  context1.pass  \
 -	  cancel3.pass  cancel4.pass  cancel5.pass  cancel6a.pass  cancel6d.pass  \
 -	  cancel7  cancel8  \
 -	  cleanup0.pass  cleanup1.pass  cleanup2.pass  cleanup3.pass  \
 -	  priority1.pass priority2.pass inherit1.pass  \
 -	  spin1.pass  spin2.pass  spin3.pass  spin4.pass  \
 -	  barrier1.pass  barrier2.pass  barrier3.pass  barrier4.pass  barrier5.pass  \
 -	  exception1.pass  exception2.pass  exception3.pass  \
 -	  cancel9 create3
 -
 -BENCHRESULTS = \
 -	  benchtest1.bench benchtest2.bench benchtest3.bench benchtest4.bench benchtest5.bench
 -
 -help:
 -	@ $(ECHO) Run one of the following command lines:
 -	@ $(ECHO) make clean BC    (to test using BC dll with VC (no EH) applications)
 -	@ $(ECHO) make clean BCX   (to test using BC dll with VC++ (EH) applications)
 -	@ $(ECHO) make clean BCE   (to test using the BCE dll with VC++ EH applications)
 -	@ $(ECHO) make clean BC-bench    (to benchtest using BC dll with C bench app)
 -	@ $(ECHO) make clean BCX-bench   (to benchtest using BC dll with C++ bench app)
 -	@ $(ECHO) make clean BCE-bench   (to benchtest using BCE dll with C++ bench app)
 -
 -all:
 -	@ make clean BC
 -	@ make clean BCX
 -	@ make clean BCE
 -	@ make clean BC-bench
 -
 -# This allows an individual test application to be made using the default lib.
 -# e.g. make clean test cancel3.exe
 -test: $(CPLIB) $(CPDLL) $(CPHDR) $(QAPC)
 -
 -tests: $(CPLIB) $(CPDLL) $(CPHDR) $(QAPC) sizes.pass $(PASSES)
 -	@ $(ECHO) ALL TESTS PASSED! Congratulations!
 -
 -benchtests: $(CPLIB) $(CPDLL) $(CPHDR) $(BENCHRESULTS)
 -	@ $(ECHO) ALL BENCH TESTS DONE.
 -
 -sizes.pass: sizes.exe
 -	@ $(ECHO) ... Running $(TEST) test: $*.exe
 -	@ .\$*.exe > SIZES.$(TEST)
 -	@ $(CAT) SIZES.$(TEST)
 -	@ $(ECHO) ...... Passed
 -	@ $(TOUCH) $*.pass
 -
 -BCE:
 -	@ make -f Bmakefile TEST="$@" CPLIB="$(BCELIB)" CPDLL="$(BCEDLL)" EHFLAGS="$(BCEFLAGS)" tests
 -
 -BC:
 -	@ make -f Bmakefile TEST="$@" CPLIB="$(BCLIB)" CPDLL="$(BCDLL)" EHFLAGS="$(BCFLAGS)" tests
 -
 -BCX:
 -	@ make -f Bmakefile TEST="$@" CPLIB="$(BCLIB)" CPDLL="$(BCDLL)" EHFLAGS="$(BCXFLAGS)" tests
 -
 -BCE-bench:
 -	@ make -f Bmakefile TEST="$@" CPLIB="$(BCELIB)" CPDLL="$(BCEDLL)" EHFLAGS="$(BCEFLAGS)" XXLIBS="benchlib.o" benchtests
 -
 -BC-bench:
 -	@ make -f Bmakefile TEST="$@" CPLIB="$(BCLIB)" CPDLL="$(BCDLL)" EHFLAGS="$(BCFLAGS)" XXLIBS="benchlib.o" benchtests
 -
 -BCX-bench:
 -	@ make -f Bmakefile TEST="$@" CPLIB="$(BCLIB)" CPDLL="$(BCDLL)" EHFLAGS="$(BCXFLAGS)" XXLIBS="benchlib.o" benchtests
 -
 -.exe.pass:
 -	@ $(ECHO) ... Running $(TEST) test: $<
 -	@ .\$<
 -	@ $(ECHO) ...... Passed
 -	@ $(TOUCH) $@
 -
 -.exe.bench:
 -	@ $(ECHO) ... Running $(TEST) benchtest: $<
 -	@ .\$<
 -	@ $(ECHO) ...... Done
 -	@ $(TOUCH) $@
 -
 -.c.exe:
 -	@ $(ECHO) $(CC) $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< -e$@ $(LFLAGS) $(CPLIB) $(XXLIBS)
 -	@ $(CC) $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< -e$@ $(LFLAGS) $(CPLIB) $(XXLIBS)
 -
 -.c.o:
 -	@ $(ECHO) $(CC) $(EHFLAGS) -c $(CFLAGS) $(INCLUDES) $< -o$@
 -	@ $(CC) $(EHFLAGS) $(CFLAGS) -c $(INCLUDES) $< -o$@
 -
 -
 -.c.i:
 -	@ $(CC) /P $(EHFLAGS) $(CFLAGS) $(INCLUDES) $<
 -
 -$(COPYFILES):
 -	@ $(ECHO) Copying $@
 -	@ $(CP) $(BUILD_DIR)\$@ .
 -
 -pthread.dll: $(CPDLL)
 -	@ $(CP) $(CPDLL) pthread.dll
 -	@ $(CP) $(CPLIB) pthread.lib
 -
 -clean:
 -	- $(RM) *.dll
 -	- $(RM) *.lib
 -	- $(RM) pthread.h
 -	- $(RM) semaphore.h
 -	- $(RM) sched.h
 -	- $(RM) *.e
 -	- $(RM) *.i
 -	- $(RM) *.obj
 -	- $(RM) *.tds
 -	- $(RM) *.pdb
 -	- $(RM) *.o
 -	- $(RM) *.asm
 -	- $(RM) *.exe
 -	- $(RM) *.pass
 -	- $(RM) *.bench
 -	- $(RM) *.log
 -
 -benchtest1.bench:
 -benchtest2.bench:
 -benchtest3.bench:
 -benchtest4.bench:
 -benchtest5.bench:
 -barrier1.pass:
 -barrier2.pass: barrier1.pass
 -barrier3.pass: barrier2.pass
 -barrier4.pass: barrier3.pass
 -barrier5.pass: barrier4.pass
 -cancel1.pass: create1.pass
 -cancel2.pass: cancel1.pass
 -cancel3.pass: context1.pass
 -cancel4.pass: cancel3.pass
 -cancel5.pass: cancel3.pass
 -cancel6a.pass: cancel3.pass
 -cancel6d.pass: cancel3.pass
 -cancel7.pass: kill1.pass
 -cancel8.pass: cancel7.pass
 -cleanup0.pass: cancel5.pass
 -cleanup1.pass: cleanup0.pass
 -cleanup2.pass: cleanup1.pass
 -cleanup3.pass: cleanup2.pass
 -condvar1.pass:
 -condvar1_1.pass: condvar1.pass
 -condvar1_2.pass: join2.pass
 -condvar2.pass: condvar1.pass
 -condvar2_1.pass: condvar2.pass join2.pass
 -condvar3.pass: create1.pass condvar2.pass
 -condvar3_1.pass: condvar3.pass join2.pass
 -condvar3_2.pass: condvar3_1.pass
 -condvar3_3.pass: condvar3_2.pass
 -condvar4.pass: create1.pass
 -condvar5.pass: condvar4.pass
 -condvar6.pass: condvar5.pass
 -condvar7.pass: condvar6.pass cleanup1.pass
 -condvar8.pass: condvar7.pass
 -condvar9.pass: condvar8.pass
 -context1.pass: cancel2.pass
 -count1.pass: join1.pass
 -create1.pass: mutex2.pass
 -create2.pass: create1.pass
 -create3.pass:
 -delay1.pass:
 -delay2.pass: delay1.pass
 -equal1.pass: create1.pass
 -errno1.pass: mutex3.pass
 -exception1.pass: cancel4.pass
 -exception2.pass: exception1.pass
 -exception3.pass: exception2.pass
 -exit1.pass:
 -exit2.pass: create1.pass
 -exit3.pass: create1.pass
 -exit4.pass:
 -exit5.pass: kill1.pass
 -eyal1.pass: tsd1.pass
 -inherit1.pass: join1.pass priority1.pass
 -join0.pass: create1.pass
 -join1.pass: create1.pass
 -join2.pass: create1.pass
 -join3.pass: join2.pass
 -kill1.pass: 
 -loadfree.pass: pthread.dll
 -mutex1.pass: self1.pass
 -mutex1n.pass: mutex1.pass
 -mutex1e.pass: mutex1.pass
 -mutex1r.pass: mutex1.pass
 -mutex2.pass: mutex1.pass
 -mutex2r.pass: mutex2.pass
 -mutex2e.pass: mutex2.pass
 -mutex3.pass: create1.pass
 -mutex3r.pass: mutex3.pass
 -mutex3e.pass: mutex3.pass
 -mutex4.pass: mutex3.pass
 -mutex5.pass:
 -mutex6.pass: mutex4.pass
 -mutex6n.pass: mutex4.pass
 -mutex6e.pass: mutex4.pass
 -mutex6r.pass: mutex4.pass
 -mutex6s.pass: mutex6.pass
 -mutex6rs.pass: mutex6r.pass
 -mutex6es.pass: mutex6e.pass
 -mutex7.pass: mutex6.pass
 -mutex7n.pass: mutex6n.pass
 -mutex7e.pass: mutex6e.pass
 -mutex7r.pass: mutex6r.pass
 -mutex8.pass: mutex7.pass
 -mutex8n.pass: mutex7n.pass
 -mutex8e.pass: mutex7e.pass
 -mutex8r.pass: mutex7r.pass
 -once1.pass: create1.pass
 -once2.pass: once1.pass
 -once3.pass: once2.pass
 -once4.pass: once3.pass
 -priority1.pass: join1.pass
 -priority2.pass: priority1.pass barrier3.pass
 -reuse1.pass: create2.pass
 -reuse2.pass: reuse1.pass
 -rwlock1.pass: condvar6.pass
 -rwlock2.pass: rwlock1.pass
 -rwlock3.pass: rwlock2.pass
 -rwlock4.pass: rwlock3.pass
 -rwlock5.pass: rwlock4.pass
 -rwlock6.pass: rwlock5.pass
 -rwlock7.pass: rwlock6.pass
 -rwlock8.pass: rwlock7.pass
 -rwlock2_t.pass: rwlock2.pass
 -rwlock3_t.pass: rwlock2_t.pass
 -rwlock4_t.pass: rwlock3_t.pass
 -rwlock5_t.pass: rwlock4_t.pass
 -rwlock6_t.pass: rwlock5_t.pass
 -rwlock6_t2.pass: rwlock6_t.pass
 -self1.pass:
 -self2.pass: create1.pass
 -semaphore1.pass:
 -semaphore2.pass:
 -semaphore3.pass: semaphore2.pass
 -semaphore4.pass: semaphore3.pass cancel1.pass
 -semaphore4t.pass: semaphore4.pass
 -sizes.pass:
 -spin1.pass:
 -spin2.pass: spin1.pass
 -spin3.pass: spin2.pass
 -spin4.pass: spin3.pass
 -tsd1.pass: join1.pass
 -valid1.pass: join1.pass
 -valid2.pass: valid1.pass
 -cancel9.pass: cancel8.pass
 +# Makefile for the pthreads test suite. +# If all of the .pass files can be created, the test suite has passed. +# +# -------------------------------------------------------------------------- +# +#      Pthreads-win32 - POSIX Threads Library for Win32 +#      Copyright(C) 1998 John E. Bossom +#      Copyright(C) 1999,2005 Pthreads-win32 contributors +#  +#      Contact Email: rpj@callisto.canberra.edu.au +#  +#      The current list of contributors is contained +#      in the file CONTRIBUTORS included with the source +#      code distribution. The list can also be seen at the +#      following World Wide Web location: +#      http://sources.redhat.com/pthreads-win32/contributors.html +#  +#      This library is free software; you can redistribute it and/or +#      modify it under the terms of the GNU Lesser General Public +#      License as published by the Free Software Foundation; either +#      version 2 of the License, or (at your option) any later version. +#  +#      This library is distributed in the hope that it will be useful, +#      but WITHOUT ANY WARRANTY; without even the implied warranty of +#      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +#      Lesser General Public License for more details. +#  +#      You should have received a copy of the GNU Lesser General Public +#      License along with this library in the file COPYING.LIB; +#      if not, write to the Free Software Foundation, Inc., +#      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +# + +DLL_VER	= 2 + +CP	= copy +RM	= erase +CAT	= type +MKDIR	= mkdir +TOUCH	= echo Passed > +ECHO	= @echo + +QAPC	= ..\QueueUserAPCEx\User\quserex.dll + +CPHDR	= pthread.h semaphore.h sched.h + +OPTIM	= -O2 + +XXLIBS	= ws2_32.lib + +# C++ Exceptions +BCEFLAGS	= -P -DPtW32NoCatchWarn -D__CLEANUP_CXX +BCELIB	= pthreadBCE$(DLL_VER).lib +BCEDLL	= pthreadBCE$(DLL_VER).dll +# C cleanup code +BCFLAGS	= -D__CLEANUP_C +BCLIB	= pthreadBC$(DLL_VER).lib +BCDLL	= pthreadBC$(DLL_VER).dll +# C++ Exceptions in application - using VC version of pthreads dll +BCXFLAGS	= -D__CLEANUP_C + +# Defaults +CPLIB	= $(BCLIB) +CPDLL	= $(BCDLL) + +CFLAGS= -q $(OPTIM) -w -tWC -tWM -w-aus -w-asc -w-par +LFLAGS=  +INCLUDES=-I. +BUILD_DIR=.. + +COPYFILES	= $(CPHDR) $(CPLIB) $(CPDLL) $(QAPC) + +EHFLAGS	= + +# If a test case returns a non-zero exit code to the shell, make will +# stop. + +PASSES=   loadfree.pass \ +	  errno1.pass  \ +	  self1.pass  mutex5.pass  \ +	  mutex1.pass  mutex1n.pass  mutex1e.pass  mutex1r.pass  \ +	  semaphore1.pass  semaphore2.pass  semaphore3.pass  \ +	  mutex2.pass  mutex3.pass  \ +	  mutex2r.pass  mutex2e.pass  mutex3r.pass  mutex3e.pass  \ +	  condvar1.pass  condvar1_1.pass  condvar1_2.pass  condvar2.pass  condvar2_1.pass  \ +	  exit1.pass  create1.pass  create2.pass  reuse1.pass  reuse2.pass  equal1.pass  \ +	  kill1.pass  valid1.pass  valid2.pass  \ +	  exit2.pass  exit3.pass  exit4  exit5  \ +	  join0.pass  join1.pass  join2.pass join3.pass  \ +	  mutex4.pass  mutex6.pass  mutex6n.pass  mutex6e.pass  mutex6r.pass  \ +	  mutex6s.pass  mutex6es.pass  mutex6rs.pass  \ +	  mutex7.pass  mutex7n.pass  mutex7e.pass  mutex7r.pass  \ +	  mutex8.pass  mutex8n.pass  mutex8e.pass  mutex8r.pass  \ +	  count1.pass  once1.pass  once2.pass  once3.pass  once4.pass  tsd1.pass  \ +	  self2.pass  \ +	  cancel1.pass  cancel2.pass  \ +	  semaphore4.pass  semaphore4t.pass  \ +	  delay1.pass  delay2.pass  eyal1.pass  \ +	  condvar3.pass  condvar3_1.pass  condvar3_2.pass  condvar3_3.pass  \ +	  condvar4.pass  condvar5.pass  condvar6.pass  \ +	  condvar7.pass  condvar8.pass  condvar9.pass  \ +	  rwlock1.pass  rwlock2.pass  rwlock3.pass  rwlock4.pass  \ +	  rwlock5.pass  rwlock6.pass  rwlock7.pass  rwlock8.pass  \ +	  rwlock2_t.pass  rwlock3_t.pass  rwlock4_t.pass  rwlock5_t.pass  rwlock6_t.pass  rwlock6_t2.pass  \ +	  context1.pass  \ +	  cancel3.pass  cancel4.pass  cancel5.pass  cancel6a.pass  cancel6d.pass  \ +	  cancel7  cancel8  \ +	  cleanup0.pass  cleanup1.pass  cleanup2.pass  cleanup3.pass  \ +	  priority1.pass priority2.pass inherit1.pass  \ +	  spin1.pass  spin2.pass  spin3.pass  spin4.pass  \ +	  barrier1.pass  barrier2.pass  barrier3.pass  barrier4.pass  barrier5.pass  \ +	  exception1.pass  exception2.pass  exception3.pass  \ +	  cancel9 create3 + +BENCHRESULTS = \ +	  benchtest1.bench benchtest2.bench benchtest3.bench benchtest4.bench benchtest5.bench + +help: +	@ $(ECHO) Run one of the following command lines: +	@ $(ECHO) make clean BC    (to test using BC dll with VC (no EH) applications) +	@ $(ECHO) make clean BCX   (to test using BC dll with VC++ (EH) applications) +	@ $(ECHO) make clean BCE   (to test using the BCE dll with VC++ EH applications) +	@ $(ECHO) make clean BC-bench    (to benchtest using BC dll with C bench app) +	@ $(ECHO) make clean BCX-bench   (to benchtest using BC dll with C++ bench app) +	@ $(ECHO) make clean BCE-bench   (to benchtest using BCE dll with C++ bench app) + +all: +	@ make clean BC +	@ make clean BCX +	@ make clean BCE +	@ make clean BC-bench + +# This allows an individual test application to be made using the default lib. +# e.g. make clean test cancel3.exe +test: $(CPLIB) $(CPDLL) $(CPHDR) $(QAPC) + +tests: $(CPLIB) $(CPDLL) $(CPHDR) $(QAPC) sizes.pass $(PASSES) +	@ $(ECHO) ALL TESTS PASSED! Congratulations! + +benchtests: $(CPLIB) $(CPDLL) $(CPHDR) $(BENCHRESULTS) +	@ $(ECHO) ALL BENCH TESTS DONE. + +sizes.pass: sizes.exe +	@ $(ECHO) ... Running $(TEST) test: $*.exe +	@ .\$*.exe > SIZES.$(TEST) +	@ $(CAT) SIZES.$(TEST) +	@ $(ECHO) ...... Passed +	@ $(TOUCH) $*.pass + +BCE: +	@ make -f Bmakefile TEST="$@" CPLIB="$(BCELIB)" CPDLL="$(BCEDLL)" EHFLAGS="$(BCEFLAGS)" tests + +BC: +	@ make -f Bmakefile TEST="$@" CPLIB="$(BCLIB)" CPDLL="$(BCDLL)" EHFLAGS="$(BCFLAGS)" tests + +BCX: +	@ make -f Bmakefile TEST="$@" CPLIB="$(BCLIB)" CPDLL="$(BCDLL)" EHFLAGS="$(BCXFLAGS)" tests + +BCE-bench: +	@ make -f Bmakefile TEST="$@" CPLIB="$(BCELIB)" CPDLL="$(BCEDLL)" EHFLAGS="$(BCEFLAGS)" XXLIBS="benchlib.o" benchtests + +BC-bench: +	@ make -f Bmakefile TEST="$@" CPLIB="$(BCLIB)" CPDLL="$(BCDLL)" EHFLAGS="$(BCFLAGS)" XXLIBS="benchlib.o" benchtests + +BCX-bench: +	@ make -f Bmakefile TEST="$@" CPLIB="$(BCLIB)" CPDLL="$(BCDLL)" EHFLAGS="$(BCXFLAGS)" XXLIBS="benchlib.o" benchtests + +.exe.pass: +	@ $(ECHO) ... Running $(TEST) test: $< +	@ .\$< +	@ $(ECHO) ...... Passed +	@ $(TOUCH) $@ + +.exe.bench: +	@ $(ECHO) ... Running $(TEST) benchtest: $< +	@ .\$< +	@ $(ECHO) ...... Done +	@ $(TOUCH) $@ + +.c.exe: +	@ $(ECHO) $(CC) $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< -e$@ $(LFLAGS) $(CPLIB) $(XXLIBS) +	@ $(CC) $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< -e$@ $(LFLAGS) $(CPLIB) $(XXLIBS) + +.c.o: +	@ $(ECHO) $(CC) $(EHFLAGS) -c $(CFLAGS) $(INCLUDES) $< -o$@ +	@ $(CC) $(EHFLAGS) $(CFLAGS) -c $(INCLUDES) $< -o$@ + + +.c.i: +	@ $(CC) /P $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< + +$(COPYFILES): +	@ $(ECHO) Copying $@ +	@ $(CP) $(BUILD_DIR)\$@ . + +pthread.dll: $(CPDLL) +	@ $(CP) $(CPDLL) pthread.dll +	@ $(CP) $(CPLIB) pthread.lib + +clean: +	- $(RM) *.dll +	- $(RM) *.lib +	- $(RM) pthread.h +	- $(RM) semaphore.h +	- $(RM) sched.h +	- $(RM) *.e +	- $(RM) *.i +	- $(RM) *.obj +	- $(RM) *.tds +	- $(RM) *.pdb +	- $(RM) *.o +	- $(RM) *.asm +	- $(RM) *.exe +	- $(RM) *.pass +	- $(RM) *.bench +	- $(RM) *.log + +benchtest1.bench: +benchtest2.bench: +benchtest3.bench: +benchtest4.bench: +benchtest5.bench: +barrier1.pass: +barrier2.pass: barrier1.pass +barrier3.pass: barrier2.pass +barrier4.pass: barrier3.pass +barrier5.pass: barrier4.pass +cancel1.pass: create1.pass +cancel2.pass: cancel1.pass +cancel3.pass: context1.pass +cancel4.pass: cancel3.pass +cancel5.pass: cancel3.pass +cancel6a.pass: cancel3.pass +cancel6d.pass: cancel3.pass +cancel7.pass: kill1.pass +cancel8.pass: cancel7.pass +cleanup0.pass: cancel5.pass +cleanup1.pass: cleanup0.pass +cleanup2.pass: cleanup1.pass +cleanup3.pass: cleanup2.pass +condvar1.pass: +condvar1_1.pass: condvar1.pass +condvar1_2.pass: join2.pass +condvar2.pass: condvar1.pass +condvar2_1.pass: condvar2.pass join2.pass +condvar3.pass: create1.pass condvar2.pass +condvar3_1.pass: condvar3.pass join2.pass +condvar3_2.pass: condvar3_1.pass +condvar3_3.pass: condvar3_2.pass +condvar4.pass: create1.pass +condvar5.pass: condvar4.pass +condvar6.pass: condvar5.pass +condvar7.pass: condvar6.pass cleanup1.pass +condvar8.pass: condvar7.pass +condvar9.pass: condvar8.pass +context1.pass: cancel2.pass +count1.pass: join1.pass +create1.pass: mutex2.pass +create2.pass: create1.pass +create3.pass: +delay1.pass: +delay2.pass: delay1.pass +equal1.pass: create1.pass +errno1.pass: mutex3.pass +exception1.pass: cancel4.pass +exception2.pass: exception1.pass +exception3.pass: exception2.pass +exit1.pass: +exit2.pass: create1.pass +exit3.pass: create1.pass +exit4.pass: +exit5.pass: kill1.pass +eyal1.pass: tsd1.pass +inherit1.pass: join1.pass priority1.pass +join0.pass: create1.pass +join1.pass: create1.pass +join2.pass: create1.pass +join3.pass: join2.pass +kill1.pass:  +loadfree.pass: pthread.dll +mutex1.pass: self1.pass +mutex1n.pass: mutex1.pass +mutex1e.pass: mutex1.pass +mutex1r.pass: mutex1.pass +mutex2.pass: mutex1.pass +mutex2r.pass: mutex2.pass +mutex2e.pass: mutex2.pass +mutex3.pass: create1.pass +mutex3r.pass: mutex3.pass +mutex3e.pass: mutex3.pass +mutex4.pass: mutex3.pass +mutex5.pass: +mutex6.pass: mutex4.pass +mutex6n.pass: mutex4.pass +mutex6e.pass: mutex4.pass +mutex6r.pass: mutex4.pass +mutex6s.pass: mutex6.pass +mutex6rs.pass: mutex6r.pass +mutex6es.pass: mutex6e.pass +mutex7.pass: mutex6.pass +mutex7n.pass: mutex6n.pass +mutex7e.pass: mutex6e.pass +mutex7r.pass: mutex6r.pass +mutex8.pass: mutex7.pass +mutex8n.pass: mutex7n.pass +mutex8e.pass: mutex7e.pass +mutex8r.pass: mutex7r.pass +once1.pass: create1.pass +once2.pass: once1.pass +once3.pass: once2.pass +once4.pass: once3.pass +priority1.pass: join1.pass +priority2.pass: priority1.pass barrier3.pass +reuse1.pass: create2.pass +reuse2.pass: reuse1.pass +rwlock1.pass: condvar6.pass +rwlock2.pass: rwlock1.pass +rwlock3.pass: rwlock2.pass +rwlock4.pass: rwlock3.pass +rwlock5.pass: rwlock4.pass +rwlock6.pass: rwlock5.pass +rwlock7.pass: rwlock6.pass +rwlock8.pass: rwlock7.pass +rwlock2_t.pass: rwlock2.pass +rwlock3_t.pass: rwlock2_t.pass +rwlock4_t.pass: rwlock3_t.pass +rwlock5_t.pass: rwlock4_t.pass +rwlock6_t.pass: rwlock5_t.pass +rwlock6_t2.pass: rwlock6_t.pass +self1.pass: +self2.pass: create1.pass +semaphore1.pass: +semaphore2.pass: +semaphore3.pass: semaphore2.pass +semaphore4.pass: semaphore3.pass cancel1.pass +semaphore4t.pass: semaphore4.pass +sizes.pass: +spin1.pass: +spin2.pass: spin1.pass +spin3.pass: spin2.pass +spin4.pass: spin3.pass +tsd1.pass: join1.pass +valid1.pass: join1.pass +valid2.pass: valid1.pass +cancel9.pass: cancel8.pass diff --git a/tests/ChangeLog b/tests/ChangeLog index d02bce0..3cd189f 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,873 +1,873 @@ -2005-04-18  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* condvar3.c: Remove locks from around signalling calls - should not
 -	be required for normal operation and only serve to mask deficiencies;
 -	ensure that CV destruction is not premature after removing guards.
 -	* condvar3_1.c: Likewise.
 -	* condvar3_2.c: Likewise.
 -	* condvar3_3.c: Likewise.
 -	* condvar4.c: Likewise.
 -	* condvar5.c: Likewise.
 -	* condvar6.c: Likewise.
 -	* condvar7.c: Likewise.
 -	* condvar8.c: Likewise.
 -	* condvar9.c: Likewise.
 -
 -2005-04-11  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -        * once4.c: New test; tries to test priority adjustments
 -        in pthread_once(); set priority class to realtime so that
 -        any failures can be seen.
 -
 -2005-04-06  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* cleanup0.c: Fix unguarded global variable accesses.
 -	* cleanup1.c: Likewise.
 -	* cleanup2.c: Likewise.
 -	* cleanup3.c: Likewise.
 -	* once2.c: Likewise.
 -	* once3.c: Likewise.
 -
 -2005-04-01  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* GNUmakefile: Add target to test linking static link library.
 -	* Makefile: Likewise.
 -	* self1.c: Run process attach/detach routines when static linked.
 -
 -2005-03-16  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* mutex5.c: Prevent optimiser from removing asserts.
 -
 -2005-03-12  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* 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>
 -
 -	* Bmakefile: New makefile for Borland.
 -	* Makefile (DLL_VER): Added.
 -	* GNUmakefile (DLL_VER): Added.
 -	* Wmakefile (DLL_VER): Added.
 -
 -2004-10-29  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* semaphore4.c: New test.
 -	* semaphore4t.c: New test.
 -	* Debug.dsp (et al): Created MSVC Workspace project to aid debugging.
 -	* All: Many tests have been modified to work with the new pthread
 -	ID type; some other corrections were made after some library
 -	functions were semantically strengthened. For example,
 -	pthread_cond_destroy() no longer destroys a busy CV, which
 -	required minor redesigns of some tests, including some where
 -	the mutex associated with the CV was not locked during
 -	signaling and broadcasting.
 -
 -2004-10-23  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* condvar3.c: Fixed mutex operations that were incorrectly
 -	placed in relation to their condition variable operations.
 -	The error became evident after sem_destroy() was rewritten
 -	and conditions for destroing the semaphore were tightened.
 -	As a result, pthread_cond_destroy() was not able to
 -	destroy the cv queueing sempahore.
 -	* condvar3_1.c: Likewise.
 -	* condvar3_2.c: Likewise.
 -	* condvar4.c: Likewise.
 -	* condvar5.c: Likewise.
 -	* condvar6.c: Likewise.
 -	* condvar7.c: Likewise.
 -	* condvar8.c: Likewise.
 -	* condvar9.c: Likewise.
 -
 -2004-10-19  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* semaphore3.c: New test.
 -
 -2004-10-14  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* rwlock7.c (main): Tidy up statistics reporting; randomise
 -	update accesses.
 -	* rwlock8.c: New test.
 -
 -2004-09-08  Alexandre Girao  <alexgirao@gmail.com>
 -
 -	* cancel7.c (main): Win98 wants a valid (non-NULL) location
 -	for the last arg of _beginthreadex().
 -	* cancel8.c (main): Likewise.
 -	* exit4.c (main): Likewise.
 -	* exit5.c (main): Likewise.
 -
 -2004-08-26  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* create3.c: New test.
 -
 -2004-06-21  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* mutex2r.c: New test.
 -	* mutex2e.c: New test.
 -	* mutex3r.c: New test.
 -	* mutex3e.c: New test.
 -	* mutex6s.c: New test.
 -	* mutex6rs.c: New test.
 -	* mutex6es.c: New test.
 -
 -2004-05-21  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* join3.c: New test.
 -
 -2004-05-16  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* condvar2.c (WIN32_WINNT): Define to avoid redefinition warning
 -	from inclusion of implement.h.
 -	* convar2_1.c: Likewise.
 -	* condvar3_1.c: Likewise.
 -	* condvar3_2.c: Likewise.
 -	* context1.c: Likewise.
 -	* sizes.c: Likewise.
 -	* Makefile: Don't define _WIN32_WINNT on compiler command line.
 -	* GNUmakefile: Likewise.
 -	* priority1.c (main): Add column to output for actual win32
 -	priority.
 -
 -2004-05-16  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* cancel9.c: New test.
 -	* cancel3.c: Remove inappropriate conditional compilation;
 -	GNU C version of test suite no longer quietly skips this test.
 -	* cancel5.c: Likewise.
 -	* GNUmakefile: Can now build individual test app using default
 -	C version of library using 'make clean testname.c'.
 -	* Makefile: Likewise for VC using 'nmake clean test testname.c'.
 -
 -2003-10-14  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* Wmakefile: New makefile for Watcom testing.
 -
 -2003-09-18  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* benchtest.h: Move old mutex code into benchlib.c.
 -	* benchlib.c: New statically linked module to ensure that
 -	bench apps don't inline the code and therefore have an unfair
 -	advantage over the pthreads lib routines. Made little or no
 -	difference.
 -	* benchtest1.c: Minor change to avoid compiler warnings.
 -	* benchtest5.c: Likewise.
 -	* benchtest2.c: Fix misinformation in output report.
 -	* README.BENCH: Add comments on results.
 -
 -2003-09-14  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* priority1.c: Reworked to comply with modified priority
 -	management and provide additional output.
 -	* priority2.c: Likewise.
 -	* inherit1.c: Likewise.
 -
 -2003-09-03  Ross Johnson  <rpj@callisto.canberra.edu.au>
 -
 -	* exit4.c: New test.
 -	* exit5.c: New test.
 -	* cancel7.c: New test.
 -	* cancel8.c: New test.
 -
 -2003-08-13  Ross Johnson  <rpj@ise.canberra.edu.au>
 -
 -	* reuse1.c: New test.
 -	* reuse1.c: New test.
 -	* valid1.c: New test.
 -	* valid2.c: New test.
 -	* kill1.c: New test.
 - 	* create2.c: Now included in test regime.
 -
 -2003-07-19  Ross Johnson  <rpj@ise.canberra.edu.au>
 -
 -	* eyal1.c (waste_time): Make threads do more work to ensure that
 -	all threads get to do some work.
 -	* semaphore1.c: Make it clear that certain errors are expected.
 -	* exception2.c (non_MSVC code sections): Change to include
 -	C++ standard include file, i.e. change <new.h> to <exception>.
 -	* exception3.c (non_MSVC code sections): Likewise; qualify std::
 -	namespace entities where necessary.
 -	* GNUmakefile: modified to work in the MsysDTK (newer MinGW)
 -	environment; define CC as gcc or g++ as appropriate because
 -	using gcc -x c++ doesn't link with required c++ libs by default,
 -	but g++ does.
 -
 -2002-12-11  Ross Johnson  <ross@special.ise.canberra.edu.au>
 -
 -	* mutex7e.c: Assert EBUSY return instead of EDEADLK.
 -
 -2002-06-03  Ross Johnson  <rpj@digit.ise.canberra.edu.au>
 -
 -	* semaphore2.c: New test.
 -
 -2002-03-02  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* Makefile (CFLAGS): Changed /MT to /MD to link with
 -	the correct library MSVCRT.LIB. Otherwise errno doesn't
 -	work.
 -
 -2002-02-28  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* exception3.c: Correct recent change.
 -
 -	* semaphore1.c: New test.
 -
 -	* Makefile: Add rule to generate pre-processor output.
 -
 -2002-02-28  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* exception3.c (terminateFunction): For MSVC++, call
 -	exit() rather than pthread_exit(). Add comments to explain
 -	why.
 -	   * Notes from the MSVC++ manual:
 -	   *       1) A term_func() should call exit(), otherwise
 -	   *          abort() will be called on return to the caller.
 -	   *          abort() raises SIGABRT. The default signal handler
 -	   *          for all signals terminates the calling program with
 -	   *          exit code 3.
 -	   *       2) A term_func() must not throw an exception. Therefore
 -	   *          term_func() should not call pthread_exit() if an
 -	   *          an exception-using version of pthreads-win32 library
 -	   *          is being used (i.e. either pthreadVCE or pthreadVSE).
 -
 -
 -2002-02-23  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* rwlock2_t.c: New test.
 -	* rwlock3_t.c: New test.
 -	* rwlock4_t.c: New test.
 -	* rwlock5_t.c: New test.
 -	* rwlock6_t.c: New test.
 -	* rwlock6_t2.c: New test.
 -	* rwlock6.c (main): Swap thread and result variables
 -	to correspond to actual thread functions.
 -	* rwlock1.c: Change test description comment to correspond
 -	to the actual test.
 -
 -	* condvar1_2.c: Loop over the test many times in the hope
 -	of detecting any intermittent deadlocks. This is to
 -	test a fixed problem in pthread_cond_destroy.c.
 -
 -	* spin4.c: Remove unused variable.
 -
 -2002-02-17  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* condvar1_1.c: New test.
 -	* condvar1_2.c: New test.
 -
 -2002-02-07  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* delay1.c: New test.
 -	* delay2.c: New test.
 -	* exit4.c: New test.
 -
 -2002-02-02  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* mutex8: New test.
 -	* mutex8n: New test.
 -	* mutex8e: New test.
 -	* mutex8r: New test.
 -	* cancel6a: New test.
 -	* cancel6d: New test.
 -	* cleanup0.c: Add pragmas for inline optimisation control.
 -	* cleanup1.c: Add pragmas for inline optimisation control.
 -	* cleanup2.c: Add pragmas for inline optimisation control.
 -	* cleanup3.c: Add pragmas for inline optimisation control.
 -	* condvar7.c: Add pragmas for inline optimisation control.
 -	* condvar8.c: Add pragmas for inline optimisation control.
 -	* condvar9.c: Add pragmas for inline optimisation control.
 -
 -2002-01-30  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* cleanup1.c (): Must be declared __cdecl when compiled
 -	as C++ AND testing the standard C library version.
 -
 -2002-01-16  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* spin4.c (main): Fix renamed function call.
 -
 -2002-01-14  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* exception3.c (main): Shorten wait time.
 -
 -2002-01-09  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* mutex7.c: New test.
 -	* mutex7n.c: New test.
 -	* mutex7e.c: New test.
 -	* mutex7r.c: New test.
 -	* mutex6.c: Modified to avoid leaving the locked mutex
 -	around on exit.
 -
 -2001-10-25  Ross Johnson  <rpj@setup1.ise.canberra.edu.au>
 -
 -	* condvar2.c: Remove reference to cv->nWaitersUnblocked.
 -	* condvar2_1.c: Likewise; lower NUMTHREADS from 60 to 30.
 -	* condvar3_1.c: Likewise.
 -	* condvar3_2.c: Likewise.
 -	* count1.c: lower NUMTHREADS from 60 to 30.
 -	* inherit1.c: Determine valid priority values and then
 -	assert values returned by POSIX routines are the same.
 -	* priority1.c: Likewise.
 -	* priority2.c: Likewise.
 -	
 -2001-07-12  Ross Johnson  <rpj@setup1.ise.canberra.edu.au>
 -
 -	* barrier5.c: Assert that precisely one thread receives
 -	PTHREAD_BARRIER_SERIAL_THREAD at each barrier.
 -
 -2001-07-09  Ross Johnson  <rpj@setup1.ise.canberra.edu.au>
 -
 -	* barrier3.c: Fixed.
 -	* barrier4.c: Fixed.
 -	* barrier5.c: New; proves that all threads in the group
 -	reaching the barrier wait and then resume together. Repeats the test
 -	using groups of 1 to 16 threads. Each group of threads must negotiate
 -	a large number of barriers (10000).
 -	* spin4.c: Fixed.
 -	* test.h (error_string): Modified the success (0) value.
 -
 -2001-07-07  Ross Johnson  <rpj@setup1.ise.canberra.edu.au>
 -
 -	* spin3.c: Changed test and fixed.
 -	* spin4.c: Fixed.
 -	* barrier3.c: Fixed.
 -	* barrier4.c: Fixed.
 -
 -2001-07-05  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* spin1.c: New; testing spinlocks.
 -	* spin2.c: New; testing spinlocks.
 -	* spin3.c: New; testing spinlocks.
 -	* spin4.c: New; testing spinlocks.
 -	* barrier1.c: New; testing barriers.
 -	* barrier2.c: New; testing barriers.
 -	* barrier3.c: New; testing barriers.
 -	* barrier4.c: New; testing barriers.
 -	* GNUmakefile: Add new tests.
 -	* Makefile: Add new tests.
 -
 -2001-07-01  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* benchtest3.c: New; timing mutexes.
 -	* benchtest4.c: New; time mutexes.
 -	* condvar3_1.c: Fixed bug - Alexander Terekhov
 -	* condvar3_3.c: New test.
 -
 -2001-06-25  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* priority1.c: New test.
 -	* priority2.c: New test.
 -	* inherit1.c: New test.
 -	* benchtest1.c: New; timing mutexes.
 -	* benchtest2.c: New; timing mutexes.
 -	* mutex4.c: Modified to test all mutex types.
 -
 -2001-06-8  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* mutex5.c: Insert inert change to quell compiler warnings.
 -	* condvar3_2.c: Remove unused variable.
 -	
 -2001-06-3  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* condvar2_1.c: New test.
 -	* condvar3_1.c: New test.
 -	* condvar3_2.c: New test.
 -
 -2001-05-30  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* mutex1n.c: New test.
 -	* mutex1e.c: New test.
 -	* mutex1r.c: New test.
 -	* mutex4.c: Now locks and unlocks a mutex.
 -	* mutex5.c: New test.
 -	* mutex6.c: New test.
 -	* mutex6n.c: New test.
 -	* mutex6e.c: New test.
 -	* mutex6r.c: New test.
 -	* Makefile: Added new tests; reorganised.
 -	* GNUmakefile: Likewise.
 -	* rwlock6.c: Fix to properly prove read-while-write locking
 -	and single writer locking.
 -
 -2001-05-29  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* Makefile: Reorganisation.
 -	* GNUmakefile: Likewise.
 -	- Thomas Pfaff <tpfaff@gmx.net>
 -
 -	* exception1.c: Add stdio.h include to define fprintf and stderr
 -	in non-exception C version of main().
 -	* exception2.c: Likewise.
 -	* exception3.c: Likewise.
 -
 -	* Makefile (rwlock7): Add new test.
 -	* GNUmakefile (rwlock7): Add new test.
 -	* rwlock7.c: New test.
 -	* rwlock6.c: Changed to test that writer has priority.
 -
 -	* eyal1.c (main): Unlock each mutex_start lock before destroying
 -	it.
 -
 -2000-12-29  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* GNUmakefile: Add mutex4 test; ensure libpthreadw32.a is
 -	removed for "clean" target.
 -	* Makefile: Add mutex4 test.
 -
 -	* exception3.c: Remove SEH code; automatically pass the test
 -	under SEH (which is an N/A environment).
 -
 -	* mutex4.c: New test.
 -
 -	* eyal1.c (do_work_unit): Add a dummy "if" to force the
 -	optimiser to retain code; reduce thread work loads.
 -
 -	* condvar8.c (main): Add an additional "assert" for debugging;
 -	increase pthread_cond_signal timeout.
 -
 -2000-12-28  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* eyal1.c: Increase thread work loads.
 -	* exception2.c: New test.
 -	* exception3.c: New test.
 -	* Makefile: Add new tests exception2.c and exception3.c.
 -	* GNUmakefile: Likewise.
 -
 -2000-12-11  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* cleanup3.c: Remove unused variable.
 -	* cleanup2.c: Likewise.
 -	* exception1.c: Throw an exception rather than use
 -	a deliberate zero divide so that catch(...) will
 -	handle it under Mingw32. Mingw32 now builds the
 -	library correctly to pass all tests - see Thomas
 -	Pfaff's detailed instructions re needed changes
 -	to Mingw32 in the Pthreads-Win32 FAQ.
 -
 -2000-09-08  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* cancel5.c: New; tests calling pthread_cancel()
 -	from the main thread without first creating a
 -	POSIX thread struct for the non-POSIX main thread
 -	- this forces pthread_cancel() to create one via
 -	pthread_self().
 -	* Makefile (cancel5): Add new test.
 -	* GNUmakefile (cancel5): Likewise.
 -
 -2000-08-17  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* create2.c: New; Test that pthread_t contains
 -	the W32 HANDLE before it calls the thread routine
 -	proper.
 -
 -2000-08-13  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* condvar3.c: Minor change to eliminate compiler
 -	warning.
 -
 -	* condvar4.c: ditto.
 -
 -	* condvar5.c: ditto.
 -
 -	* condvar6.c: ditto.
 -
 -	* condvar7.c: ditto.
 -
 -	* condvar8.c: ditto.
 -
 -	* condvar9.c: ditto.
 -
 -	* exit1.c: Function needed return statement.
 -
 -	* cleanup1.c: Remove unnecessary printf arg.
 -
 -	* cleanup2.c: Fix cast.
 -
 -	* rwlock6.c: Fix casts.
 -
 -	* exception1.c (PtW32CatchAll): Had the wrong name;
 -	fix casts.
 -
 -	* cancel3.c: Remove unused waitLock variable.
 -
 -	* GNUmakefile: Change library/dll naming; add new tests;
 -	general minor changes.
 -
 -	* Makefile: Change library/dll naming; add targets for
 -	testing each of the two VC++ EH scheme versions;
 -	default target now issues help message; compile warnings
 -	now interpreted as errors to stop the make; add new
 -	tests; restructure to remove prerequisites needed
 -	otherwise.
 -
 -	* README: Updated.
 -
 -
 -2000-08-10  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* eyal1.c (main): Change implicit cast to explicit
 -	cast when passing "print_server" function pointer;
 -	G++ no longer allows implicit func parameter casts.
 -
 -	* cleanup1.c: Remove unused "waitLock".
 -	(main): Fix implicit parameter cast.
 -
 -	* cancel2.c (main): Fix implicit parameter cast.
 -
 -	* cancel4.c (main): Fix implicit parameter cast.
 -
 -	* cancel3.c (main): Fix implicit parameter cast.
 -
 -	* GNUmakefile: Renamed from Makefile; Add missing
 -	cancel1 and cancel2 test targets.
 -
 -	* Makefile: Converted for use with MS nmake.
 -
 -2000-08-06  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* ccl.bat: Add /nologo to remove extraneous output.
 -
 -	* exception1.c (exceptionedThread): Init 'dummy';
 -	put expression into if condition to prevent optimising away;
 -	remove unused variable.
 -
 -	* cancel4.c (mythread): Cast return value to avoid warnings.
 -
 -	* cancel2.c (mythread): Missing #endif.
 -
 -	* condvar9.c (mythread): Cast return value to avoid warnings.
 -
 -	* condvar8.c (mythread): Cast return value to avoid warnings.
 -
 -	* condvar7.c (mythread): Cast return value to avoid warnings.
 -
 -	* cleanup3.c (mythread): Cast return value to avoid warnings.
 -
 -	* cleanup2.c (mythread): Cast return value to avoid warnings.
 -
 -	* cleanup1.c (mythread): Cast return value to avoid warnings.
 -
 -	* condvar5.c (mythread): Cast return value to avoid warnings.
 -
 -	* condvar3.c (mythread): Cast return value to avoid warnings.
 -
 -	* condvar6.c (mythread): Cast return value to avoid warnings.
 -
 -	* condvar4.c (mythread): Cast return value to avoid warnings.
 -
 -2000-08-05  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* cancel2.c: Use PtW32CatchAll macro if defined.
 -
 -	* exception1.c: Use PtW32CatchAll macro if defined.
 -
 -2000-08-02  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* tsd1.c: Fix typecasts of &result [g++ is now very fussy].
 -	
 -	* test.h (assert): Return 0's explicitly to allay
 -	g++ errors.
 -	
 -	* join2.c: Add explicit typecasts.
 -	
 -	* join1.c: Add explicit typecasts.
 -	
 -	* join0.c: Add explicit typecasts.
 -	
 -	* eyal1.c: Add explicit typecasts.
 -	
 -	* count1.c (main): Add type cast to remove g++ parse warning
 -	[gcc-2.95.2 seems to have tightened up on this].
 -
 -	* Makefile (GLANG): Use c++ explicitly.
 -	Remove MSVC sections (was commented out).
 -	Add target to generate cpp output.
 -
 -2000-07-25  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* runtest.bat: modified to work under W98.
 -	
 -	* runall.bat: Add new tests; modified to work under W98.
 -	It was ok under NT.
 -
 -	* Makefile: Add new tests.
 -
 -	* exception1.c: New; Test passing exceptions back to the
 -	application and retaining library internal exceptions.
 -
 -	* join0.c: New; Test a single join.
 -
 -2000-01-06  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* cleanup1.c: New; Test cleanup handler executes (when thread is
 -	canceled).
 -
 -	* cleanup2.c: New; Test cleanup handler executes (when thread is
 -	not canceled).
 -
 -	* cleanup3.c: New; Test cleanup handler does not execute
 -	(when thread is not canceled).
 -
 -2000-01-04  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* cancel4.c: New; Test cancelation does not occur in deferred
 -	cancelation threads with no cancelation points.
 -
 -	* cancel3.c: New; Test asynchronous cancelation.
 -
 -	* context1.c: New; Test context switching method for async
 -	cancelation.
 -
 -1999-11-23  Ross Johnson  <rpj@special.ise.canberra.edu.au>
 -
 -	* test.h: Add header includes; include local header versions rather
 -	than system versions; rearrange the assert macro defines.
 -
 -1999-11-07  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* loadfree.c: New. Test loading and freeing the library (DLL).
 -
 -1999-10-30  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* cancel1.c: New. Test pthread_setcancelstate and
 -	pthread_setcanceltype functions.
 -	* eyal1.c (waste_time): Change calculation to avoid FP exception
 -	on Aplhas
 -	- Rich Peters <rpeters@micro-magic.com>
 -
 -Oct 14 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* condvar7.c: New. Test broadcast after waiting thread is canceled.
 -	* condvar8.c: New. Test multiple broadcasts.
 -	* condvar9.c: New. Test multiple broadcasts with thread
 -	cancelation.
 -	
 -Sep 16 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* rwlock6.c: New test.
 -
 -Sep 15 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* rwlock1.c: New test.
 -	* rwlock2.c: New test.
 -	* rwlock3.c: New test.
 -	* rwlock4.c: New test.
 -	* rwlock5.c: New test.
 -
 -Aug 22 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* runall.bat (join2): Add test.
 -
 -Aug 19 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* join2.c: New test.
 -
 -Wed Aug 12 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* Makefile (LIBS): Add -L.
 -
 -Mon May 31 10:25:01 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* Makefile (GLANG): Add GCC language option.
 -
 -Sat May 29 23:29:04 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* runall.bat (condvar5): Add new test.
 -
 -	* runall.bat (condvar6): Add new test.
 -
 -	* Makefile (condvar5) : Add new test.
 -	
 -	* Makefile (condvar6) : Add new test.
 -	
 -	* condvar5.c: New test for pthread_cond_broadcast().
 -
 -	* condvar6.c: New test for pthread_cond_broadcast().
 -
 -Sun Apr  4 12:04:28 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* tsd1.c (mythread): Change Sleep(0) to sched_yield().
 -	(sched.h): Include.
 -
 -	* condvar3.c (mythread): Remove redundant Sleep().
 -
 -	* runtest.bat: Re-organised to make more informative.
 -
 -Fri Mar 19 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* *.bat: redirect unwanted output to nul:
 -
 -	* runall.bat: new.
 -
 -	* cancel1.c: new. Not part of suite yet.
 -	
 -Mon Mar 15 00:17:55 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* mutex1.c: only test mutex init and destroy; add assertions.
 -
 -	* count1.c: raise number of spawned threads to 60 (appears to
 -	be the limit under Win98).
 -
 -Sun Mar 14 21:31:02 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* test.h (assert): add assertion trace option.
 -	Use:
 -	"#define ASSERT_TRACE 1" to turn it on,
 -	"#define ASSERT_TRACE 0" to turn it off (default).
 -
 -	* condvar3.c (main): add more assertions.
 -
 -	* condvar4.c (main): add more assertions.
 -
 -	* condvar1.c (main): add more assertions.
 -
 -Fri Mar 12 08:34:15 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* condvar4.c (cvthing): switch the order of the INITIALIZERs.
 -
 -	* eyal1.c (main): Fix trylock loop; was not waiting for thread to lock
 -	the "started" mutex.
 -
 -Wed Mar 10 10:41:52 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* tryentercs.c: Apply typo patch from bje.
 -
 -	* tryentercs2.c: Ditto.
 -
 -Sun Mar  7 10:41:52 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* Makefile (condvar3, condvar4): Add tests.
 -
 -	* condvar4.c (General): Reduce to simple test case; prerequisite
 -	is condvar3.c; add description.
 -
 -	* condvar3.c (General): Reduce to simple test case; prerequisite
 -	is condvar2.c; add description.
 -
 -	* condvar2.c (General): Reduce to simple test case; prerequisite
 -	is condvar1.c; add description.
 -
 -	* condvar1.c (General): Reduce to simple test case; add
 -	description.
 -
 -	* Template.c (Comments): Add generic test detail.
 -
 -1999-02-23  Ross Johnson  <rpj@ise.canberra.edu.au>
 -
 -        * Template.c: Revamp.
 -
 -        * condvar1.c: Add.
 -
 -        * condvar2.c: Add.
 -
 -        * Makefile: Add condvar1 condvar2 tests.
 -
 -        * exit1.c, exit2.c, exit3.c: Cosmetic changes.
 -
 -1999-02-23  Ross Johnson  <rpj@ise.canberra.edu.au>
 -
 -	* Makefile: Some refinement.
 -
 -	* *.c: More exhaustive checking through assertions; clean up;
 -	add some more tests.
 -
 -	* Makefile: Now actually runs the tests.
 -
 -	* tests.h: Define our own assert macro. The Mingw32
 -	version pops up a dialog but we want to run non-interactively.
 -
 -	* equal1.c: use assert a little more directly so that it
 -	prints the actual call statement.
 -
 -	* exit1.c: Modify to return 0 on success, 1 on failure.
 -
 -1999-02-22  Ross Johnson  <rpj@ise.canberra.edu.au>
 -
 -	* self2.c: Bring up to date.
 -
 -	* self3.c: Ditto.
 -
 -1999-02-21  Ben Elliston  <bje@cygnus.com>
 -
 -	* README: Update.
 -
 -	* Makefile: New file. Run all tests automatically. Primitive tests
 -	are run first; more complex tests are run last.
 -
 -	* count1.c: New test. Validate the thread count.
 -
 -	* exit2.c: Perform a simpler test.
 -	
 -	* exit3.c: New test. Replaces exit2.c, since exit2.c needs to
 -	perform simpler checking first.
 -
 -	* create1.c: Update to use the new testsuite exiting convention.
 -	
 -	* equal1.c: Likewise.
 -
 -	* mutex1.c: Likewise.
 -
 -	* mutex2.c: Likewise.
 -
 -	* once1.c: Likewise.
 -
 -	* self2.c: Likewise.
 -
 -	* self3.c: Likewise.
 -
 -	* tsd1.c: Likewise.
 -
 -1999-02-20  Ross Johnson  <rpj@ise.canberra.edu.au>
 -
 -	* mutex2.c: Test static mutex initialisation.
 -
 -	* test.h: New. Declares a table mapping error numbers to
 -	error names.
 -
 -1999-01-17  Ross Johnson  <rpj@ise.canberra.edu.au>
 -
 -	* runtest: New script to build and run a test in the tests directory.
 -
 -Wed Dec 30 11:22:44 1998  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* tsd1.c: Re-written. See comments at start of file.
 -	* Template.c: New. Contains skeleton code and comment template
 -	intended to fully document the test.
 -
 -Fri Oct 16 17:59:49 1998  Ross Johnson  <rpj@swan.canberra.edu.au>
 -
 -	* tsd1.c (destroy_key): Add function. Change diagnostics.
 -
 -Thu Oct 15 17:42:37 1998  Ross Johnson  <rpj@swan.canberra.edu.au>
 -
 -	* tsd1.c (mythread): Fix some casts and add some message
 -	output. Fix inverted conditional.
 -
 -Mon Oct 12 02:12:29 1998  Ross Johnson  <rpj@ixobrychus.canberra.edu.au>
 -
 -	* tsd1.c: New. Test TSD using 1 key and 2 threads.
 -
 -1998-09-13  Ben Elliston  <bje@cygnus.com>
 -
 -	* eyal1.c: New file; contributed by Eyal Lebedinsky
 -	<eyal@eyal.emu.id.au>.
 -
 -1998-09-12  Ben Elliston  <bje@cygnus.com>
 -
 -	* exit2.c (func): Return a value.
 -	(main): Call the right thread entry function.
 -
 -1998-07-22  Ben Elliston  <bje@cygnus.com>
 -
 -	* exit2.c (main): Fix size of pthread_t array.
 -
 -1998-07-10  Ben Elliston  <bje@cygnus.com>
 -
 -	* exit2.c: New file; test pthread_exit() harder.
 -
 -	* exit1.c: New file; test pthread_exit().
 +2005-04-18  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* condvar3.c: Remove locks from around signalling calls - should not +	be required for normal operation and only serve to mask deficiencies; +	ensure that CV destruction is not premature after removing guards. +	* condvar3_1.c: Likewise. +	* condvar3_2.c: Likewise. +	* condvar3_3.c: Likewise. +	* condvar4.c: Likewise. +	* condvar5.c: Likewise. +	* condvar6.c: Likewise. +	* condvar7.c: Likewise. +	* condvar8.c: Likewise. +	* condvar9.c: Likewise. + +2005-04-11  Ross Johnson  <rpj@callisto.canberra.edu.au> + +        * once4.c: New test; tries to test priority adjustments +        in pthread_once(); set priority class to realtime so that +        any failures can be seen. + +2005-04-06  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* cleanup0.c: Fix unguarded global variable accesses. +	* cleanup1.c: Likewise. +	* cleanup2.c: Likewise. +	* cleanup3.c: Likewise. +	* once2.c: Likewise. +	* once3.c: Likewise. + +2005-04-01  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* GNUmakefile: Add target to test linking static link library. +	* Makefile: Likewise. +	* self1.c: Run process attach/detach routines when static linked. + +2005-03-16  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* mutex5.c: Prevent optimiser from removing asserts. + +2005-03-12  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* 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> + +	* Bmakefile: New makefile for Borland. +	* Makefile (DLL_VER): Added. +	* GNUmakefile (DLL_VER): Added. +	* Wmakefile (DLL_VER): Added. + +2004-10-29  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* semaphore4.c: New test. +	* semaphore4t.c: New test. +	* Debug.dsp (et al): Created MSVC Workspace project to aid debugging. +	* All: Many tests have been modified to work with the new pthread +	ID type; some other corrections were made after some library +	functions were semantically strengthened. For example, +	pthread_cond_destroy() no longer destroys a busy CV, which +	required minor redesigns of some tests, including some where +	the mutex associated with the CV was not locked during +	signaling and broadcasting. + +2004-10-23  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* condvar3.c: Fixed mutex operations that were incorrectly +	placed in relation to their condition variable operations. +	The error became evident after sem_destroy() was rewritten +	and conditions for destroing the semaphore were tightened. +	As a result, pthread_cond_destroy() was not able to +	destroy the cv queueing sempahore. +	* condvar3_1.c: Likewise. +	* condvar3_2.c: Likewise. +	* condvar4.c: Likewise. +	* condvar5.c: Likewise. +	* condvar6.c: Likewise. +	* condvar7.c: Likewise. +	* condvar8.c: Likewise. +	* condvar9.c: Likewise. + +2004-10-19  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* semaphore3.c: New test. + +2004-10-14  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* rwlock7.c (main): Tidy up statistics reporting; randomise +	update accesses. +	* rwlock8.c: New test. + +2004-09-08  Alexandre Girao  <alexgirao@gmail.com> + +	* cancel7.c (main): Win98 wants a valid (non-NULL) location +	for the last arg of _beginthreadex(). +	* cancel8.c (main): Likewise. +	* exit4.c (main): Likewise. +	* exit5.c (main): Likewise. + +2004-08-26  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* create3.c: New test. + +2004-06-21  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* mutex2r.c: New test. +	* mutex2e.c: New test. +	* mutex3r.c: New test. +	* mutex3e.c: New test. +	* mutex6s.c: New test. +	* mutex6rs.c: New test. +	* mutex6es.c: New test. + +2004-05-21  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* join3.c: New test. + +2004-05-16  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* condvar2.c (WIN32_WINNT): Define to avoid redefinition warning +	from inclusion of implement.h. +	* convar2_1.c: Likewise. +	* condvar3_1.c: Likewise. +	* condvar3_2.c: Likewise. +	* context1.c: Likewise. +	* sizes.c: Likewise. +	* Makefile: Don't define _WIN32_WINNT on compiler command line. +	* GNUmakefile: Likewise. +	* priority1.c (main): Add column to output for actual win32 +	priority. + +2004-05-16  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* cancel9.c: New test. +	* cancel3.c: Remove inappropriate conditional compilation; +	GNU C version of test suite no longer quietly skips this test. +	* cancel5.c: Likewise. +	* GNUmakefile: Can now build individual test app using default +	C version of library using 'make clean testname.c'. +	* Makefile: Likewise for VC using 'nmake clean test testname.c'. + +2003-10-14  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* Wmakefile: New makefile for Watcom testing. + +2003-09-18  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* benchtest.h: Move old mutex code into benchlib.c. +	* benchlib.c: New statically linked module to ensure that +	bench apps don't inline the code and therefore have an unfair +	advantage over the pthreads lib routines. Made little or no +	difference. +	* benchtest1.c: Minor change to avoid compiler warnings. +	* benchtest5.c: Likewise. +	* benchtest2.c: Fix misinformation in output report. +	* README.BENCH: Add comments on results. + +2003-09-14  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* priority1.c: Reworked to comply with modified priority +	management and provide additional output. +	* priority2.c: Likewise. +	* inherit1.c: Likewise. + +2003-09-03  Ross Johnson  <rpj@callisto.canberra.edu.au> + +	* exit4.c: New test. +	* exit5.c: New test. +	* cancel7.c: New test. +	* cancel8.c: New test. + +2003-08-13  Ross Johnson  <rpj@ise.canberra.edu.au> + +	* reuse1.c: New test. +	* reuse1.c: New test. +	* valid1.c: New test. +	* valid2.c: New test. +	* kill1.c: New test. + 	* create2.c: Now included in test regime. + +2003-07-19  Ross Johnson  <rpj@ise.canberra.edu.au> + +	* eyal1.c (waste_time): Make threads do more work to ensure that +	all threads get to do some work. +	* semaphore1.c: Make it clear that certain errors are expected. +	* exception2.c (non_MSVC code sections): Change to include +	C++ standard include file, i.e. change <new.h> to <exception>. +	* exception3.c (non_MSVC code sections): Likewise; qualify std:: +	namespace entities where necessary. +	* GNUmakefile: modified to work in the MsysDTK (newer MinGW) +	environment; define CC as gcc or g++ as appropriate because +	using gcc -x c++ doesn't link with required c++ libs by default, +	but g++ does. + +2002-12-11  Ross Johnson  <ross@special.ise.canberra.edu.au> + +	* mutex7e.c: Assert EBUSY return instead of EDEADLK. + +2002-06-03  Ross Johnson  <rpj@digit.ise.canberra.edu.au> + +	* semaphore2.c: New test. + +2002-03-02  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* Makefile (CFLAGS): Changed /MT to /MD to link with +	the correct library MSVCRT.LIB. Otherwise errno doesn't +	work. + +2002-02-28  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* exception3.c: Correct recent change. + +	* semaphore1.c: New test. + +	* Makefile: Add rule to generate pre-processor output. + +2002-02-28  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* exception3.c (terminateFunction): For MSVC++, call +	exit() rather than pthread_exit(). Add comments to explain +	why. +	   * Notes from the MSVC++ manual: +	   *       1) A term_func() should call exit(), otherwise +	   *          abort() will be called on return to the caller. +	   *          abort() raises SIGABRT. The default signal handler +	   *          for all signals terminates the calling program with +	   *          exit code 3. +	   *       2) A term_func() must not throw an exception. Therefore +	   *          term_func() should not call pthread_exit() if an +	   *          an exception-using version of pthreads-win32 library +	   *          is being used (i.e. either pthreadVCE or pthreadVSE). + + +2002-02-23  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* rwlock2_t.c: New test. +	* rwlock3_t.c: New test. +	* rwlock4_t.c: New test. +	* rwlock5_t.c: New test. +	* rwlock6_t.c: New test. +	* rwlock6_t2.c: New test. +	* rwlock6.c (main): Swap thread and result variables +	to correspond to actual thread functions. +	* rwlock1.c: Change test description comment to correspond +	to the actual test. + +	* condvar1_2.c: Loop over the test many times in the hope +	of detecting any intermittent deadlocks. This is to +	test a fixed problem in pthread_cond_destroy.c. + +	* spin4.c: Remove unused variable. + +2002-02-17  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* condvar1_1.c: New test. +	* condvar1_2.c: New test. + +2002-02-07  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* delay1.c: New test. +	* delay2.c: New test. +	* exit4.c: New test. + +2002-02-02  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* mutex8: New test. +	* mutex8n: New test. +	* mutex8e: New test. +	* mutex8r: New test. +	* cancel6a: New test. +	* cancel6d: New test. +	* cleanup0.c: Add pragmas for inline optimisation control. +	* cleanup1.c: Add pragmas for inline optimisation control. +	* cleanup2.c: Add pragmas for inline optimisation control. +	* cleanup3.c: Add pragmas for inline optimisation control. +	* condvar7.c: Add pragmas for inline optimisation control. +	* condvar8.c: Add pragmas for inline optimisation control. +	* condvar9.c: Add pragmas for inline optimisation control. + +2002-01-30  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* cleanup1.c (): Must be declared __cdecl when compiled +	as C++ AND testing the standard C library version. + +2002-01-16  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* spin4.c (main): Fix renamed function call. + +2002-01-14  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* exception3.c (main): Shorten wait time. + +2002-01-09  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* mutex7.c: New test. +	* mutex7n.c: New test. +	* mutex7e.c: New test. +	* mutex7r.c: New test. +	* mutex6.c: Modified to avoid leaving the locked mutex +	around on exit. + +2001-10-25  Ross Johnson  <rpj@setup1.ise.canberra.edu.au> + +	* condvar2.c: Remove reference to cv->nWaitersUnblocked. +	* condvar2_1.c: Likewise; lower NUMTHREADS from 60 to 30. +	* condvar3_1.c: Likewise. +	* condvar3_2.c: Likewise. +	* count1.c: lower NUMTHREADS from 60 to 30. +	* inherit1.c: Determine valid priority values and then +	assert values returned by POSIX routines are the same. +	* priority1.c: Likewise. +	* priority2.c: Likewise. +	 +2001-07-12  Ross Johnson  <rpj@setup1.ise.canberra.edu.au> + +	* barrier5.c: Assert that precisely one thread receives +	PTHREAD_BARRIER_SERIAL_THREAD at each barrier. + +2001-07-09  Ross Johnson  <rpj@setup1.ise.canberra.edu.au> + +	* barrier3.c: Fixed. +	* barrier4.c: Fixed. +	* barrier5.c: New; proves that all threads in the group +	reaching the barrier wait and then resume together. Repeats the test +	using groups of 1 to 16 threads. Each group of threads must negotiate +	a large number of barriers (10000). +	* spin4.c: Fixed. +	* test.h (error_string): Modified the success (0) value. + +2001-07-07  Ross Johnson  <rpj@setup1.ise.canberra.edu.au> + +	* spin3.c: Changed test and fixed. +	* spin4.c: Fixed. +	* barrier3.c: Fixed. +	* barrier4.c: Fixed. + +2001-07-05  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* spin1.c: New; testing spinlocks. +	* spin2.c: New; testing spinlocks. +	* spin3.c: New; testing spinlocks. +	* spin4.c: New; testing spinlocks. +	* barrier1.c: New; testing barriers. +	* barrier2.c: New; testing barriers. +	* barrier3.c: New; testing barriers. +	* barrier4.c: New; testing barriers. +	* GNUmakefile: Add new tests. +	* Makefile: Add new tests. + +2001-07-01  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* benchtest3.c: New; timing mutexes. +	* benchtest4.c: New; time mutexes. +	* condvar3_1.c: Fixed bug - Alexander Terekhov +	* condvar3_3.c: New test. + +2001-06-25  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* priority1.c: New test. +	* priority2.c: New test. +	* inherit1.c: New test. +	* benchtest1.c: New; timing mutexes. +	* benchtest2.c: New; timing mutexes. +	* mutex4.c: Modified to test all mutex types. + +2001-06-8  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* mutex5.c: Insert inert change to quell compiler warnings. +	* condvar3_2.c: Remove unused variable. +	 +2001-06-3  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* condvar2_1.c: New test. +	* condvar3_1.c: New test. +	* condvar3_2.c: New test. + +2001-05-30  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* mutex1n.c: New test. +	* mutex1e.c: New test. +	* mutex1r.c: New test. +	* mutex4.c: Now locks and unlocks a mutex. +	* mutex5.c: New test. +	* mutex6.c: New test. +	* mutex6n.c: New test. +	* mutex6e.c: New test. +	* mutex6r.c: New test. +	* Makefile: Added new tests; reorganised. +	* GNUmakefile: Likewise. +	* rwlock6.c: Fix to properly prove read-while-write locking +	and single writer locking. + +2001-05-29  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* Makefile: Reorganisation. +	* GNUmakefile: Likewise. +	- Thomas Pfaff <tpfaff@gmx.net> + +	* exception1.c: Add stdio.h include to define fprintf and stderr +	in non-exception C version of main(). +	* exception2.c: Likewise. +	* exception3.c: Likewise. + +	* Makefile (rwlock7): Add new test. +	* GNUmakefile (rwlock7): Add new test. +	* rwlock7.c: New test. +	* rwlock6.c: Changed to test that writer has priority. + +	* eyal1.c (main): Unlock each mutex_start lock before destroying +	it. + +2000-12-29  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* GNUmakefile: Add mutex4 test; ensure libpthreadw32.a is +	removed for "clean" target. +	* Makefile: Add mutex4 test. + +	* exception3.c: Remove SEH code; automatically pass the test +	under SEH (which is an N/A environment). + +	* mutex4.c: New test. + +	* eyal1.c (do_work_unit): Add a dummy "if" to force the +	optimiser to retain code; reduce thread work loads. + +	* condvar8.c (main): Add an additional "assert" for debugging; +	increase pthread_cond_signal timeout. + +2000-12-28  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* eyal1.c: Increase thread work loads. +	* exception2.c: New test. +	* exception3.c: New test. +	* Makefile: Add new tests exception2.c and exception3.c. +	* GNUmakefile: Likewise. + +2000-12-11  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* cleanup3.c: Remove unused variable. +	* cleanup2.c: Likewise. +	* exception1.c: Throw an exception rather than use +	a deliberate zero divide so that catch(...) will +	handle it under Mingw32. Mingw32 now builds the +	library correctly to pass all tests - see Thomas +	Pfaff's detailed instructions re needed changes +	to Mingw32 in the Pthreads-Win32 FAQ. + +2000-09-08  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* cancel5.c: New; tests calling pthread_cancel() +	from the main thread without first creating a +	POSIX thread struct for the non-POSIX main thread +	- this forces pthread_cancel() to create one via +	pthread_self(). +	* Makefile (cancel5): Add new test. +	* GNUmakefile (cancel5): Likewise. + +2000-08-17  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* create2.c: New; Test that pthread_t contains +	the W32 HANDLE before it calls the thread routine +	proper. + +2000-08-13  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* condvar3.c: Minor change to eliminate compiler +	warning. + +	* condvar4.c: ditto. + +	* condvar5.c: ditto. + +	* condvar6.c: ditto. + +	* condvar7.c: ditto. + +	* condvar8.c: ditto. + +	* condvar9.c: ditto. + +	* exit1.c: Function needed return statement. + +	* cleanup1.c: Remove unnecessary printf arg. + +	* cleanup2.c: Fix cast. + +	* rwlock6.c: Fix casts. + +	* exception1.c (PtW32CatchAll): Had the wrong name; +	fix casts. + +	* cancel3.c: Remove unused waitLock variable. + +	* GNUmakefile: Change library/dll naming; add new tests; +	general minor changes. + +	* Makefile: Change library/dll naming; add targets for +	testing each of the two VC++ EH scheme versions; +	default target now issues help message; compile warnings +	now interpreted as errors to stop the make; add new +	tests; restructure to remove prerequisites needed +	otherwise. + +	* README: Updated. + + +2000-08-10  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* eyal1.c (main): Change implicit cast to explicit +	cast when passing "print_server" function pointer; +	G++ no longer allows implicit func parameter casts. + +	* cleanup1.c: Remove unused "waitLock". +	(main): Fix implicit parameter cast. + +	* cancel2.c (main): Fix implicit parameter cast. + +	* cancel4.c (main): Fix implicit parameter cast. + +	* cancel3.c (main): Fix implicit parameter cast. + +	* GNUmakefile: Renamed from Makefile; Add missing +	cancel1 and cancel2 test targets. + +	* Makefile: Converted for use with MS nmake. + +2000-08-06  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* ccl.bat: Add /nologo to remove extraneous output. + +	* exception1.c (exceptionedThread): Init 'dummy'; +	put expression into if condition to prevent optimising away; +	remove unused variable. + +	* cancel4.c (mythread): Cast return value to avoid warnings. + +	* cancel2.c (mythread): Missing #endif. + +	* condvar9.c (mythread): Cast return value to avoid warnings. + +	* condvar8.c (mythread): Cast return value to avoid warnings. + +	* condvar7.c (mythread): Cast return value to avoid warnings. + +	* cleanup3.c (mythread): Cast return value to avoid warnings. + +	* cleanup2.c (mythread): Cast return value to avoid warnings. + +	* cleanup1.c (mythread): Cast return value to avoid warnings. + +	* condvar5.c (mythread): Cast return value to avoid warnings. + +	* condvar3.c (mythread): Cast return value to avoid warnings. + +	* condvar6.c (mythread): Cast return value to avoid warnings. + +	* condvar4.c (mythread): Cast return value to avoid warnings. + +2000-08-05  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* cancel2.c: Use PtW32CatchAll macro if defined. + +	* exception1.c: Use PtW32CatchAll macro if defined. + +2000-08-02  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* tsd1.c: Fix typecasts of &result [g++ is now very fussy]. +	 +	* test.h (assert): Return 0's explicitly to allay +	g++ errors. +	 +	* join2.c: Add explicit typecasts. +	 +	* join1.c: Add explicit typecasts. +	 +	* join0.c: Add explicit typecasts. +	 +	* eyal1.c: Add explicit typecasts. +	 +	* count1.c (main): Add type cast to remove g++ parse warning +	[gcc-2.95.2 seems to have tightened up on this]. + +	* Makefile (GLANG): Use c++ explicitly. +	Remove MSVC sections (was commented out). +	Add target to generate cpp output. + +2000-07-25  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* runtest.bat: modified to work under W98. +	 +	* runall.bat: Add new tests; modified to work under W98. +	It was ok under NT. + +	* Makefile: Add new tests. + +	* exception1.c: New; Test passing exceptions back to the +	application and retaining library internal exceptions. + +	* join0.c: New; Test a single join. + +2000-01-06  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* cleanup1.c: New; Test cleanup handler executes (when thread is +	canceled). + +	* cleanup2.c: New; Test cleanup handler executes (when thread is +	not canceled). + +	* cleanup3.c: New; Test cleanup handler does not execute +	(when thread is not canceled). + +2000-01-04  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* cancel4.c: New; Test cancelation does not occur in deferred +	cancelation threads with no cancelation points. + +	* cancel3.c: New; Test asynchronous cancelation. + +	* context1.c: New; Test context switching method for async +	cancelation. + +1999-11-23  Ross Johnson  <rpj@special.ise.canberra.edu.au> + +	* test.h: Add header includes; include local header versions rather +	than system versions; rearrange the assert macro defines. + +1999-11-07  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* loadfree.c: New. Test loading and freeing the library (DLL). + +1999-10-30  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* cancel1.c: New. Test pthread_setcancelstate and +	pthread_setcanceltype functions. +	* eyal1.c (waste_time): Change calculation to avoid FP exception +	on Aplhas +	- Rich Peters <rpeters@micro-magic.com> + +Oct 14 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* condvar7.c: New. Test broadcast after waiting thread is canceled. +	* condvar8.c: New. Test multiple broadcasts. +	* condvar9.c: New. Test multiple broadcasts with thread +	cancelation. +	 +Sep 16 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* rwlock6.c: New test. + +Sep 15 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* rwlock1.c: New test. +	* rwlock2.c: New test. +	* rwlock3.c: New test. +	* rwlock4.c: New test. +	* rwlock5.c: New test. + +Aug 22 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* runall.bat (join2): Add test. + +Aug 19 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* join2.c: New test. + +Wed Aug 12 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* Makefile (LIBS): Add -L. + +Mon May 31 10:25:01 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* Makefile (GLANG): Add GCC language option. + +Sat May 29 23:29:04 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* runall.bat (condvar5): Add new test. + +	* runall.bat (condvar6): Add new test. + +	* Makefile (condvar5) : Add new test. +	 +	* Makefile (condvar6) : Add new test. +	 +	* condvar5.c: New test for pthread_cond_broadcast(). + +	* condvar6.c: New test for pthread_cond_broadcast(). + +Sun Apr  4 12:04:28 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* tsd1.c (mythread): Change Sleep(0) to sched_yield(). +	(sched.h): Include. + +	* condvar3.c (mythread): Remove redundant Sleep(). + +	* runtest.bat: Re-organised to make more informative. + +Fri Mar 19 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* *.bat: redirect unwanted output to nul: + +	* runall.bat: new. + +	* cancel1.c: new. Not part of suite yet. +	 +Mon Mar 15 00:17:55 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* mutex1.c: only test mutex init and destroy; add assertions. + +	* count1.c: raise number of spawned threads to 60 (appears to +	be the limit under Win98). + +Sun Mar 14 21:31:02 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* test.h (assert): add assertion trace option. +	Use: +	"#define ASSERT_TRACE 1" to turn it on, +	"#define ASSERT_TRACE 0" to turn it off (default). + +	* condvar3.c (main): add more assertions. + +	* condvar4.c (main): add more assertions. + +	* condvar1.c (main): add more assertions. + +Fri Mar 12 08:34:15 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* condvar4.c (cvthing): switch the order of the INITIALIZERs. + +	* eyal1.c (main): Fix trylock loop; was not waiting for thread to lock +	the "started" mutex. + +Wed Mar 10 10:41:52 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* tryentercs.c: Apply typo patch from bje. + +	* tryentercs2.c: Ditto. + +Sun Mar  7 10:41:52 1999  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* Makefile (condvar3, condvar4): Add tests. + +	* condvar4.c (General): Reduce to simple test case; prerequisite +	is condvar3.c; add description. + +	* condvar3.c (General): Reduce to simple test case; prerequisite +	is condvar2.c; add description. + +	* condvar2.c (General): Reduce to simple test case; prerequisite +	is condvar1.c; add description. + +	* condvar1.c (General): Reduce to simple test case; add +	description. + +	* Template.c (Comments): Add generic test detail. + +1999-02-23  Ross Johnson  <rpj@ise.canberra.edu.au> + +        * Template.c: Revamp. + +        * condvar1.c: Add. + +        * condvar2.c: Add. + +        * Makefile: Add condvar1 condvar2 tests. + +        * exit1.c, exit2.c, exit3.c: Cosmetic changes. + +1999-02-23  Ross Johnson  <rpj@ise.canberra.edu.au> + +	* Makefile: Some refinement. + +	* *.c: More exhaustive checking through assertions; clean up; +	add some more tests. + +	* Makefile: Now actually runs the tests. + +	* tests.h: Define our own assert macro. The Mingw32 +	version pops up a dialog but we want to run non-interactively. + +	* equal1.c: use assert a little more directly so that it +	prints the actual call statement. + +	* exit1.c: Modify to return 0 on success, 1 on failure. + +1999-02-22  Ross Johnson  <rpj@ise.canberra.edu.au> + +	* self2.c: Bring up to date. + +	* self3.c: Ditto. + +1999-02-21  Ben Elliston  <bje@cygnus.com> + +	* README: Update. + +	* Makefile: New file. Run all tests automatically. Primitive tests +	are run first; more complex tests are run last. + +	* count1.c: New test. Validate the thread count. + +	* exit2.c: Perform a simpler test. +	 +	* exit3.c: New test. Replaces exit2.c, since exit2.c needs to +	perform simpler checking first. + +	* create1.c: Update to use the new testsuite exiting convention. +	 +	* equal1.c: Likewise. + +	* mutex1.c: Likewise. + +	* mutex2.c: Likewise. + +	* once1.c: Likewise. + +	* self2.c: Likewise. + +	* self3.c: Likewise. + +	* tsd1.c: Likewise. + +1999-02-20  Ross Johnson  <rpj@ise.canberra.edu.au> + +	* mutex2.c: Test static mutex initialisation. + +	* test.h: New. Declares a table mapping error numbers to +	error names. + +1999-01-17  Ross Johnson  <rpj@ise.canberra.edu.au> + +	* runtest: New script to build and run a test in the tests directory. + +Wed Dec 30 11:22:44 1998  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* tsd1.c: Re-written. See comments at start of file. +	* Template.c: New. Contains skeleton code and comment template +	intended to fully document the test. + +Fri Oct 16 17:59:49 1998  Ross Johnson  <rpj@swan.canberra.edu.au> + +	* tsd1.c (destroy_key): Add function. Change diagnostics. + +Thu Oct 15 17:42:37 1998  Ross Johnson  <rpj@swan.canberra.edu.au> + +	* tsd1.c (mythread): Fix some casts and add some message +	output. Fix inverted conditional. + +Mon Oct 12 02:12:29 1998  Ross Johnson  <rpj@ixobrychus.canberra.edu.au> + +	* tsd1.c: New. Test TSD using 1 key and 2 threads. + +1998-09-13  Ben Elliston  <bje@cygnus.com> + +	* eyal1.c: New file; contributed by Eyal Lebedinsky +	<eyal@eyal.emu.id.au>. + +1998-09-12  Ben Elliston  <bje@cygnus.com> + +	* exit2.c (func): Return a value. +	(main): Call the right thread entry function. + +1998-07-22  Ben Elliston  <bje@cygnus.com> + +	* exit2.c (main): Fix size of pthread_t array. + +1998-07-10  Ben Elliston  <bje@cygnus.com> + +	* exit2.c: New file; test pthread_exit() harder. + +	* exit1.c: New file; test pthread_exit(). diff --git a/tests/GNUmakefile b/tests/GNUmakefile index c031cd1..8700572 100644 --- a/tests/GNUmakefile +++ b/tests/GNUmakefile @@ -1,349 +1,349 @@ -# Makefile for the pthreads test suite.
 -# If all of the .pass files can be created, the test suite has passed.
 -#
 -# --------------------------------------------------------------------------
 -#
 -#      Pthreads-win32 - POSIX Threads Library for Win32
 -#      Copyright(C) 1998 John E. Bossom
 -#      Copyright(C) 1999,2005 Pthreads-win32 contributors
 -# 
 -#      Contact Email: rpj@callisto.canberra.edu.au
 -# 
 -#      The current list of contributors is contained
 -#      in the file CONTRIBUTORS included with the source
 -#      code distribution. The list can also be seen at the
 -#      following World Wide Web location:
 -#      http://sources.redhat.com/pthreads-win32/contributors.html
 -# 
 -#      This library is free software; you can redistribute it and/or
 -#      modify it under the terms of the GNU Lesser General Public
 -#      License as published by the Free Software Foundation; either
 -#      version 2 of the License, or (at your option) any later version.
 -# 
 -#      This library is distributed in the hope that it will be useful,
 -#      but WITHOUT ANY WARRANTY; without even the implied warranty of
 -#      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 -#      Lesser General Public License for more details.
 -# 
 -#      You should have received a copy of the GNU Lesser General Public
 -#      License along with this library in the file COPYING.LIB;
 -#      if not, write to the Free Software Foundation, Inc.,
 -#      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 -#
 -
 -DLL_VER	= 2
 -
 -CP	= cp -f
 -MV	= mv -f
 -RM	= rm -f
 -CAT	= cat
 -#CP	= copy
 -#MV	= rename
 -#RM	= erase
 -#CAT	= type
 -MKDIR	= mkdir
 -TOUCH	= echo Passed >
 -ECHO	= @echo
 -MAKE	= make
 -
 -#
 -# Mingw32
 -#
 -XXCFLAGS	= 
 -XXLIBS	= -lws2_32
 -#CFLAGS	= -O3 -UNDEBUG -Wall $(XXCFLAGS)
 -CFLAGS	= -g -UNDEBUG -Wall $(XXCFLAGS)
 -BUILD_DIR	= ..
 -INCLUDES	= -I.
 -
 -
 -TEST	= GC
 -
 -# Default lib version
 -GCX	= $(TEST)$(DLL_VER)
 -
 -# Files we need to run the tests
 -# - paths are relative to pthreads build dir.
 -HDR	= pthread.h semaphore.h sched.h
 -LIB	= libpthread$(GCX).a
 -DLL	= pthread$(GCX).dll
 -QAPC	= ../QueueUserAPCEx/User/quserex.dll
 -
 -COPYFILES	= $(HDR) $(LIB) $(DLL) $(QAPC)
 -
 -# If a test case returns a non-zero exit code to the shell, make will
 -# stop.
 -
 -TESTS	= sizes loadfree \
 -	  self1 mutex5 mutex1 mutex1e mutex1n mutex1r \
 -	  semaphore1 semaphore2 semaphore3 \
 -	  condvar1 condvar1_1 condvar1_2 condvar2 condvar2_1 exit1 \
 -	  create1 create2 reuse1 reuse2 equal1 \
 -	  kill1 valid1 valid2 \
 -	  exit2 exit3 exit4 exit5 \
 -	  join0 join1 join2 join3 \
 -	  mutex2 mutex2r mutex2e mutex3 mutex3r mutex3e \
 -	  mutex4 mutex6 mutex6n mutex6e mutex6r \
 -	  mutex6s mutex6es mutex6rs \
 -	  mutex7 mutex7n mutex7e mutex7r mutex8 mutex8n mutex8e mutex8r \
 -	  count1 once1 once2 once3 once4 tsd1 self2 \
 -	  cancel1 cancel2 \
 -	  semaphore4 semaphore4t \
 -	  delay1 delay2 eyal1 \
 -	  condvar3 condvar3_1 condvar3_2 condvar3_3 \
 -	  condvar4 condvar5 condvar6 condvar7 condvar8 condvar9 \
 -	  errno1 \
 -	  rwlock1 rwlock2 rwlock3 rwlock4 rwlock5 rwlock6 rwlock7 rwlock8 \
 -	  rwlock2_t rwlock3_t rwlock4_t rwlock5_t rwlock6_t rwlock6_t2 \
 -	  context1 cancel3 cancel4 cancel5 cancel6a cancel6d \
 -	  cancel7 cancel8 \
 -	  cleanup0 cleanup1 cleanup2 cleanup3 \
 -	  priority1 priority2 inherit1 \
 -	  spin1 spin2 spin3 spin4 \
 -	  barrier1 barrier2 barrier3 barrier4 barrier5 \
 -	  exception1 exception2 exception3 \
 -	  cancel9 create3
 -
 -BENCHTESTS = \
 -	benchtest1 benchtest2 benchtest3 benchtest4 benchtest5
 -
 -STATICTESTS = \
 -	self1
 -
 -PASSES		= $(TESTS:%=%.pass)
 -BENCHRESULTS	= $(BENCHTESTS:%=%.bench)
 -STATICRESULTS	= $(STATICTESTS:%=%.pass)
 -
 -help:
 -	@ $(ECHO) "Run one of the following command lines:"
 -	@ $(ECHO) "make clean GC    (to test using GC dll with C (no EH) applications)"
 -	@ $(ECHO) "make clean GCX   (to test using GC dll with C++ (EH) applications)"
 -	@ $(ECHO) "make clean GCE   (to test using GCE dll with C++ (EH) applications)"
 -	@ $(ECHO) "make clean GC-bench	  (to benchtest using GNU C dll with C cleanup code)"
 -	@ $(ECHO) "make clean GCE-bench   (to benchtest using GNU C dll with C++ exception handling)"
 -	@ $(ECHO) "make clean GC-static   (to test using GC static lib with C (no EH) applications)"
 -
 -all:
 -	@ $(MAKE) clean GC
 -	@ $(MAKE) clean GCX
 -	@ $(MAKE) clean GCE
 -
 -GC:
 -	$(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C" all-pass
 -
 -GCE:
 -	$(MAKE) TEST=GCE CC=g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" all-pass
 -
 -GCX:
 -	$(MAKE) TEST=GC CC=g++ XXCFLAGS="-mthreads -D__CLEANUP_C" all-pass
 -
 -GC-bench:
 -	$(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C" XXLIBS="benchlib.o" all-bench
 -
 -GCE-bench:
 -	$(MAKE) TEST=GCE  CC=g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" XXLIBS="benchlib." all-bench
 -
 -GC-static:
 -	$(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C -DPTW32_STATIC_LIB" DLL="" all-static
 -
 -all-pass: $(PASSES)
 -	@ $(ECHO) ALL TESTS PASSED! Congratulations!
 -
 -all-bench: $(BENCHRESULTS)
 -	@ $(ECHO) BENCH TESTS COMPLETED.
 -
 -all-static: $(STATICRESULTS)
 -	@ $(ECHO) ALL STATIC TESTS PASSED! Congratulations!
 -	@ $(ECHO) Build and test the DLL to run all tests.
 -	@ $(ECHO) This test only confirms that the static lib links correctly.
 -
 -benchtest1.bench:
 -benchtest2.bench:
 -benchtest3.bench:
 -benchtest4.bench:
 -benchtest5.bench:
 -
 -barrier1.pass:
 -barrier2.pass: barrier1.pass
 -barrier3.pass: barrier2.pass
 -barrier4.pass: barrier3.pass
 -barrier5.pass: barrier4.pass
 -cancel1.pass: create1.pass
 -cancel2.pass: cancel1.pass
 -cancel2_1.pass: cancel2.pass
 -cancel3.pass: context1.pass
 -cancel4.pass: cancel3.pass
 -cancel5.pass: cancel3.pass
 -cancel6a.pass: cancel3.pass
 -cancel6d.pass: cancel3.pass
 -cancel7.pass: kill1.pass
 -cancel8.pass: cancel7.pass
 -cleanup0.pass: cancel5.pass
 -cleanup1.pass: cleanup0.pass
 -cleanup2.pass: cleanup1.pass
 -cleanup3.pass: cleanup2.pass
 -condvar1.pass:
 -condvar1_1.pass: condvar1.pass
 -condvar1_2.pass: join2.pass
 -condvar2.pass: condvar1.pass
 -condvar2_1.pass: condvar2.pass join2.pass
 -condvar3.pass: create1.pass condvar2.pass
 -condvar3_1.pass: condvar3.pass join2.pass
 -condvar3_2.pass: condvar3_1.pass
 -condvar3_3.pass: condvar3_2.pass
 -condvar4.pass: create1.pass
 -condvar5.pass: condvar4.pass
 -condvar6.pass: condvar5.pass
 -condvar7.pass: condvar6.pass cleanup1.pass
 -condvar8.pass: condvar7.pass
 -condvar9.pass: condvar8.pass
 -context1.pass: cancel2.pass
 -count1.pass: join1.pass
 -create1.pass: mutex2.pass
 -create2.pass: create1.pass
 -create3.pass:
 -delay1.pass: cancel2.pass
 -delay2.pass: delay1.pass
 -equal1.pass: create1.pass
 -errno1.pass: mutex3.pass
 -exception1.pass: cancel4.pass
 -exception2.pass: exception1.pass
 -exception3.pass: exception2.pass
 -exit1.pass:
 -exit2.pass: create1.pass
 -exit3.pass: create1.pass
 -exit4.pass:
 -exit5.pass: exit4.pass kill1.pass
 -eyal1.pass: tsd1.pass
 -inherit1.pass: join1.pass priority1.pass
 -join0.pass: create1.pass
 -join1.pass: create1.pass
 -join2.pass: create1.pass
 -join3.pass: join2.pass
 -kill1.pass:
 -loadfree.pass: pthread.dll
 -mutex1.pass: self1.pass
 -mutex1n.pass: mutex1.pass
 -mutex1e.pass: mutex1.pass
 -mutex1r.pass: mutex1.pass
 -mutex2.pass: mutex1.pass
 -mutex2r.pass: mutex2.pass
 -mutex2e.pass: mutex2.pass
 -mutex3.pass: create1.pass
 -mutex3r.pass: mutex3.pass
 -mutex3e.pass: mutex3.pass
 -mutex4.pass: mutex3.pass
 -mutex5.pass:
 -mutex6.pass: mutex4.pass
 -mutex6n.pass: mutex4.pass
 -mutex6e.pass: mutex4.pass
 -mutex6r.pass: mutex4.pass
 -mutex6s.pass: mutex6.pass
 -mutex6rs.pass: mutex6r.pass
 -mutex6es.pass: mutex6e.pass
 -mutex7.pass: mutex6.pass
 -mutex7n.pass: mutex6n.pass
 -mutex7e.pass: mutex6e.pass
 -mutex7r.pass: mutex6r.pass
 -mutex8.pass: mutex7.pass
 -mutex8n.pass: mutex7n.pass
 -mutex8e.pass: mutex7e.pass
 -mutex8r.pass: mutex7r.pass
 -once1.pass: create1.pass
 -once2.pass: once1.pass
 -once3.pass: once2.pass
 -once4.pass: once3.pass
 -priority1.pass: join1.pass
 -priority2.pass: priority1.pass barrier3.pass
 -reuse1.pass: create2.pass
 -reuse2.pass: reuse1.pass
 -rwlock1.pass: condvar6.pass
 -rwlock2.pass: rwlock1.pass
 -rwlock3.pass: rwlock2.pass
 -rwlock4.pass: rwlock3.pass
 -rwlock5.pass: rwlock4.pass
 -rwlock6.pass: rwlock5.pass
 -rwlock7.pass: rwlock6.pass
 -rwlock8.pass: rwlock7.pass
 -rwlock2_t.pass: rwlock2.pass
 -rwlock3_t.pass: rwlock2_t.pass
 -rwlock4_t.pass: rwlock3_t.pass
 -rwlock5_t.pass: rwlock4_t.pass
 -rwlock6_t.pass: rwlock5_t.pass
 -rwlock6_t2.pass: rwlock6_t.pass
 -self1.pass:
 -self2.pass: create1.pass
 -semaphore1.pass:
 -semaphore2.pass:
 -semaphore3.pass: semaphore2.pass
 -semaphore4.pass: semaphore3.pass cancel1.pass
 -semaphore4t.pass: semaphore4.pass
 -sizes.pass:
 -spin1.pass:
 -spin2.pass: spin1.pass
 -spin3.pass: spin2.pass
 -spin4.pass: spin3.pass
 -tsd1.pass: join1.pass
 -valid1.pass: join1.pass
 -valid2.pass: valid1.pass
 -cancel9.pass: cancel8.pass
 -
 -sizes.pass: sizes.exe
 -	@ $(ECHO) Running $*
 -	$< > SIZES.$(TEST)
 -	@ $(CAT) SIZES.$(TEST)
 -	@ $(ECHO) Passed
 -	@ $(TOUCH) $@
 -
 -%.pass: %.exe
 -	@ $(ECHO) Running $*
 -	$*
 -	@ $(ECHO) Passed
 -	@ $(TOUCH) $@
 -
 -%.bench: $(LIB) $(DLL) $(HDR) $(QAPC) $(XXLIBS) %.exe
 -	@ $(ECHO) Running $*
 -	$*
 -	@ $(ECHO) Done
 -	@ $(TOUCH) $@
 -
 -%.exe: %.c $(LIB) $(DLL) $(HDR) $(QAPC)
 -	@ $(ECHO) Compiling $@
 -	@ $(ECHO) $(CC) $(CFLAGS) -o $@ $< $(INCLUDES) -L. -lpthread$(GCX) -lsupc++ $(XXLIBS)
 -	@ $(CC) $(CFLAGS) -o $@ $< $(INCLUDES) -L. -lpthread$(GCX) -lsupc++ $(XXLIBS)
 -
 -%.pre: %.c $(HDR)
 -	@ $(CC) -E $(CFLAGS) -o $@ $< $(INCLUDES)
 -
 -%.s: %.c $(HDR)
 -	@ $(CC) -S $(CFLAGS) -o $@ $< $(INCLUDES)
 -
 -$(COPYFILES):
 -	@ $(ECHO) Copying $@
 -	@ $(CP) $(BUILD_DIR)/$@ .
 -
 -benchlib.o: benchlib.c
 -	@ $(ECHO) Compiling $@
 -	@ $(ECHO) $(CC) -c $(CFLAGS) $< $(INCLUDES)
 -	@ $(CC) -c $(CFLAGS) $< $(INCLUDES)
 -
 -pthread.dll: $(DLL)
 -	@ $(CP) $(DLL) $@
 -
 -clean:
 -	- $(RM) *.dll
 -	- $(RM) *.lib
 -	- $(RM) pthread.h
 -	- $(RM) semaphore.h
 -	- $(RM) sched.h
 -	- $(RM) *.a
 -	- $(RM) *.e
 -	- $(RM) *.i
 -	- $(RM) *.o
 -	- $(RM) *.obj
 -	- $(RM) *.pdb
 -	- $(RM) *.exe
 -	- $(RM) *.pass
 -	- $(RM) *.bench
 -	- $(RM) *.static
 -	- $(RM) *.log
 +# Makefile for the pthreads test suite. +# If all of the .pass files can be created, the test suite has passed. +# +# -------------------------------------------------------------------------- +# +#      Pthreads-win32 - POSIX Threads Library for Win32 +#      Copyright(C) 1998 John E. Bossom +#      Copyright(C) 1999,2005 Pthreads-win32 contributors +#  +#      Contact Email: rpj@callisto.canberra.edu.au +#  +#      The current list of contributors is contained +#      in the file CONTRIBUTORS included with the source +#      code distribution. The list can also be seen at the +#      following World Wide Web location: +#      http://sources.redhat.com/pthreads-win32/contributors.html +#  +#      This library is free software; you can redistribute it and/or +#      modify it under the terms of the GNU Lesser General Public +#      License as published by the Free Software Foundation; either +#      version 2 of the License, or (at your option) any later version. +#  +#      This library is distributed in the hope that it will be useful, +#      but WITHOUT ANY WARRANTY; without even the implied warranty of +#      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +#      Lesser General Public License for more details. +#  +#      You should have received a copy of the GNU Lesser General Public +#      License along with this library in the file COPYING.LIB; +#      if not, write to the Free Software Foundation, Inc., +#      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +# + +DLL_VER	= 2 + +CP	= cp -f +MV	= mv -f +RM	= rm -f +CAT	= cat +#CP	= copy +#MV	= rename +#RM	= erase +#CAT	= type +MKDIR	= mkdir +TOUCH	= echo Passed > +ECHO	= @echo +MAKE	= make + +# +# Mingw32 +# +XXCFLAGS	=  +XXLIBS	= -lws2_32 +#CFLAGS	= -O3 -UNDEBUG -Wall $(XXCFLAGS) +CFLAGS	= -g -UNDEBUG -Wall $(XXCFLAGS) +BUILD_DIR	= .. +INCLUDES	= -I. + + +TEST	= GC + +# Default lib version +GCX	= $(TEST)$(DLL_VER) + +# Files we need to run the tests +# - paths are relative to pthreads build dir. +HDR	= pthread.h semaphore.h sched.h +LIB	= libpthread$(GCX).a +DLL	= pthread$(GCX).dll +QAPC	= ../QueueUserAPCEx/User/quserex.dll + +COPYFILES	= $(HDR) $(LIB) $(DLL) $(QAPC) + +# If a test case returns a non-zero exit code to the shell, make will +# stop. + +TESTS	= sizes loadfree \ +	  self1 mutex5 mutex1 mutex1e mutex1n mutex1r \ +	  semaphore1 semaphore2 semaphore3 \ +	  condvar1 condvar1_1 condvar1_2 condvar2 condvar2_1 exit1 \ +	  create1 create2 reuse1 reuse2 equal1 \ +	  kill1 valid1 valid2 \ +	  exit2 exit3 exit4 exit5 \ +	  join0 join1 join2 join3 \ +	  mutex2 mutex2r mutex2e mutex3 mutex3r mutex3e \ +	  mutex4 mutex6 mutex6n mutex6e mutex6r \ +	  mutex6s mutex6es mutex6rs \ +	  mutex7 mutex7n mutex7e mutex7r mutex8 mutex8n mutex8e mutex8r \ +	  count1 once1 once2 once3 once4 tsd1 self2 \ +	  cancel1 cancel2 \ +	  semaphore4 semaphore4t \ +	  delay1 delay2 eyal1 \ +	  condvar3 condvar3_1 condvar3_2 condvar3_3 \ +	  condvar4 condvar5 condvar6 condvar7 condvar8 condvar9 \ +	  errno1 \ +	  rwlock1 rwlock2 rwlock3 rwlock4 rwlock5 rwlock6 rwlock7 rwlock8 \ +	  rwlock2_t rwlock3_t rwlock4_t rwlock5_t rwlock6_t rwlock6_t2 \ +	  context1 cancel3 cancel4 cancel5 cancel6a cancel6d \ +	  cancel7 cancel8 \ +	  cleanup0 cleanup1 cleanup2 cleanup3 \ +	  priority1 priority2 inherit1 \ +	  spin1 spin2 spin3 spin4 \ +	  barrier1 barrier2 barrier3 barrier4 barrier5 \ +	  exception1 exception2 exception3 \ +	  cancel9 create3 + +BENCHTESTS = \ +	benchtest1 benchtest2 benchtest3 benchtest4 benchtest5 + +STATICTESTS = \ +	self1 + +PASSES		= $(TESTS:%=%.pass) +BENCHRESULTS	= $(BENCHTESTS:%=%.bench) +STATICRESULTS	= $(STATICTESTS:%=%.pass) + +help: +	@ $(ECHO) "Run one of the following command lines:" +	@ $(ECHO) "make clean GC    (to test using GC dll with C (no EH) applications)" +	@ $(ECHO) "make clean GCX   (to test using GC dll with C++ (EH) applications)" +	@ $(ECHO) "make clean GCE   (to test using GCE dll with C++ (EH) applications)" +	@ $(ECHO) "make clean GC-bench	  (to benchtest using GNU C dll with C cleanup code)" +	@ $(ECHO) "make clean GCE-bench   (to benchtest using GNU C dll with C++ exception handling)" +	@ $(ECHO) "make clean GC-static   (to test using GC static lib with C (no EH) applications)" + +all: +	@ $(MAKE) clean GC +	@ $(MAKE) clean GCX +	@ $(MAKE) clean GCE + +GC: +	$(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C" all-pass + +GCE: +	$(MAKE) TEST=GCE CC=g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" all-pass + +GCX: +	$(MAKE) TEST=GC CC=g++ XXCFLAGS="-mthreads -D__CLEANUP_C" all-pass + +GC-bench: +	$(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C" XXLIBS="benchlib.o" all-bench + +GCE-bench: +	$(MAKE) TEST=GCE  CC=g++ XXCFLAGS="-mthreads -D__CLEANUP_CXX" XXLIBS="benchlib." all-bench + +GC-static: +	$(MAKE) TEST=GC CC=gcc XXCFLAGS="-D__CLEANUP_C -DPTW32_STATIC_LIB" DLL="" all-static + +all-pass: $(PASSES) +	@ $(ECHO) ALL TESTS PASSED! Congratulations! + +all-bench: $(BENCHRESULTS) +	@ $(ECHO) BENCH TESTS COMPLETED. + +all-static: $(STATICRESULTS) +	@ $(ECHO) ALL STATIC TESTS PASSED! Congratulations! +	@ $(ECHO) Build and test the DLL to run all tests. +	@ $(ECHO) This test only confirms that the static lib links correctly. + +benchtest1.bench: +benchtest2.bench: +benchtest3.bench: +benchtest4.bench: +benchtest5.bench: + +barrier1.pass: +barrier2.pass: barrier1.pass +barrier3.pass: barrier2.pass +barrier4.pass: barrier3.pass +barrier5.pass: barrier4.pass +cancel1.pass: create1.pass +cancel2.pass: cancel1.pass +cancel2_1.pass: cancel2.pass +cancel3.pass: context1.pass +cancel4.pass: cancel3.pass +cancel5.pass: cancel3.pass +cancel6a.pass: cancel3.pass +cancel6d.pass: cancel3.pass +cancel7.pass: kill1.pass +cancel8.pass: cancel7.pass +cleanup0.pass: cancel5.pass +cleanup1.pass: cleanup0.pass +cleanup2.pass: cleanup1.pass +cleanup3.pass: cleanup2.pass +condvar1.pass: +condvar1_1.pass: condvar1.pass +condvar1_2.pass: join2.pass +condvar2.pass: condvar1.pass +condvar2_1.pass: condvar2.pass join2.pass +condvar3.pass: create1.pass condvar2.pass +condvar3_1.pass: condvar3.pass join2.pass +condvar3_2.pass: condvar3_1.pass +condvar3_3.pass: condvar3_2.pass +condvar4.pass: create1.pass +condvar5.pass: condvar4.pass +condvar6.pass: condvar5.pass +condvar7.pass: condvar6.pass cleanup1.pass +condvar8.pass: condvar7.pass +condvar9.pass: condvar8.pass +context1.pass: cancel2.pass +count1.pass: join1.pass +create1.pass: mutex2.pass +create2.pass: create1.pass +create3.pass: +delay1.pass: cancel2.pass +delay2.pass: delay1.pass +equal1.pass: create1.pass +errno1.pass: mutex3.pass +exception1.pass: cancel4.pass +exception2.pass: exception1.pass +exception3.pass: exception2.pass +exit1.pass: +exit2.pass: create1.pass +exit3.pass: create1.pass +exit4.pass: +exit5.pass: exit4.pass kill1.pass +eyal1.pass: tsd1.pass +inherit1.pass: join1.pass priority1.pass +join0.pass: create1.pass +join1.pass: create1.pass +join2.pass: create1.pass +join3.pass: join2.pass +kill1.pass: +loadfree.pass: pthread.dll +mutex1.pass: self1.pass +mutex1n.pass: mutex1.pass +mutex1e.pass: mutex1.pass +mutex1r.pass: mutex1.pass +mutex2.pass: mutex1.pass +mutex2r.pass: mutex2.pass +mutex2e.pass: mutex2.pass +mutex3.pass: create1.pass +mutex3r.pass: mutex3.pass +mutex3e.pass: mutex3.pass +mutex4.pass: mutex3.pass +mutex5.pass: +mutex6.pass: mutex4.pass +mutex6n.pass: mutex4.pass +mutex6e.pass: mutex4.pass +mutex6r.pass: mutex4.pass +mutex6s.pass: mutex6.pass +mutex6rs.pass: mutex6r.pass +mutex6es.pass: mutex6e.pass +mutex7.pass: mutex6.pass +mutex7n.pass: mutex6n.pass +mutex7e.pass: mutex6e.pass +mutex7r.pass: mutex6r.pass +mutex8.pass: mutex7.pass +mutex8n.pass: mutex7n.pass +mutex8e.pass: mutex7e.pass +mutex8r.pass: mutex7r.pass +once1.pass: create1.pass +once2.pass: once1.pass +once3.pass: once2.pass +once4.pass: once3.pass +priority1.pass: join1.pass +priority2.pass: priority1.pass barrier3.pass +reuse1.pass: create2.pass +reuse2.pass: reuse1.pass +rwlock1.pass: condvar6.pass +rwlock2.pass: rwlock1.pass +rwlock3.pass: rwlock2.pass +rwlock4.pass: rwlock3.pass +rwlock5.pass: rwlock4.pass +rwlock6.pass: rwlock5.pass +rwlock7.pass: rwlock6.pass +rwlock8.pass: rwlock7.pass +rwlock2_t.pass: rwlock2.pass +rwlock3_t.pass: rwlock2_t.pass +rwlock4_t.pass: rwlock3_t.pass +rwlock5_t.pass: rwlock4_t.pass +rwlock6_t.pass: rwlock5_t.pass +rwlock6_t2.pass: rwlock6_t.pass +self1.pass: +self2.pass: create1.pass +semaphore1.pass: +semaphore2.pass: +semaphore3.pass: semaphore2.pass +semaphore4.pass: semaphore3.pass cancel1.pass +semaphore4t.pass: semaphore4.pass +sizes.pass: +spin1.pass: +spin2.pass: spin1.pass +spin3.pass: spin2.pass +spin4.pass: spin3.pass +tsd1.pass: join1.pass +valid1.pass: join1.pass +valid2.pass: valid1.pass +cancel9.pass: cancel8.pass + +sizes.pass: sizes.exe +	@ $(ECHO) Running $* +	$< > SIZES.$(TEST) +	@ $(CAT) SIZES.$(TEST) +	@ $(ECHO) Passed +	@ $(TOUCH) $@ + +%.pass: %.exe +	@ $(ECHO) Running $* +	$* +	@ $(ECHO) Passed +	@ $(TOUCH) $@ + +%.bench: $(LIB) $(DLL) $(HDR) $(QAPC) $(XXLIBS) %.exe +	@ $(ECHO) Running $* +	$* +	@ $(ECHO) Done +	@ $(TOUCH) $@ + +%.exe: %.c $(LIB) $(DLL) $(HDR) $(QAPC) +	@ $(ECHO) Compiling $@ +	@ $(ECHO) $(CC) $(CFLAGS) -o $@ $< $(INCLUDES) -L. -lpthread$(GCX) -lsupc++ $(XXLIBS) +	@ $(CC) $(CFLAGS) -o $@ $< $(INCLUDES) -L. -lpthread$(GCX) -lsupc++ $(XXLIBS) + +%.pre: %.c $(HDR) +	@ $(CC) -E $(CFLAGS) -o $@ $< $(INCLUDES) + +%.s: %.c $(HDR) +	@ $(CC) -S $(CFLAGS) -o $@ $< $(INCLUDES) + +$(COPYFILES): +	@ $(ECHO) Copying $@ +	@ $(CP) $(BUILD_DIR)/$@ . + +benchlib.o: benchlib.c +	@ $(ECHO) Compiling $@ +	@ $(ECHO) $(CC) -c $(CFLAGS) $< $(INCLUDES) +	@ $(CC) -c $(CFLAGS) $< $(INCLUDES) + +pthread.dll: $(DLL) +	@ $(CP) $(DLL) $@ + +clean: +	- $(RM) *.dll +	- $(RM) *.lib +	- $(RM) pthread.h +	- $(RM) semaphore.h +	- $(RM) sched.h +	- $(RM) *.a +	- $(RM) *.e +	- $(RM) *.i +	- $(RM) *.o +	- $(RM) *.obj +	- $(RM) *.pdb +	- $(RM) *.exe +	- $(RM) *.pass +	- $(RM) *.bench +	- $(RM) *.static +	- $(RM) *.log diff --git a/tests/Makefile b/tests/Makefile index 786d85e..6a82a58 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,369 +1,369 @@ -# Makefile for the pthreads test suite.
 -# If all of the .pass files can be created, the test suite has passed.
 -#
 -# --------------------------------------------------------------------------
 -#
 -#      Pthreads-win32 - POSIX Threads Library for Win32
 -#      Copyright(C) 1998 John E. Bossom
 -#      Copyright(C) 1999,2005 Pthreads-win32 contributors
 -# 
 -#      Contact Email: rpj@callisto.canberra.edu.au
 -# 
 -#      The current list of contributors is contained
 -#      in the file CONTRIBUTORS included with the source
 -#      code distribution. The list can also be seen at the
 -#      following World Wide Web location:
 -#      http://sources.redhat.com/pthreads-win32/contributors.html
 -# 
 -#      This library is free software; you can redistribute it and/or
 -#      modify it under the terms of the GNU Lesser General Public
 -#      License as published by the Free Software Foundation; either
 -#      version 2 of the License, or (at your option) any later version.
 -# 
 -#      This library is distributed in the hope that it will be useful,
 -#      but WITHOUT ANY WARRANTY; without even the implied warranty of
 -#      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 -#      Lesser General Public License for more details.
 -# 
 -#      You should have received a copy of the GNU Lesser General Public
 -#      License along with this library in the file COPYING.LIB;
 -#      if not, write to the Free Software Foundation, Inc.,
 -#      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 -#
 -
 -DLL_VER	= 2
 -
 -CP	= copy
 -RM	= erase
 -CAT	= type
 -MKDIR	= mkdir
 -TOUCH	= echo Passed >
 -ECHO	= @echo
 -
 -QAPC	= ..\QueueUserAPCEx\User\quserex.dll
 -
 -CPHDR	= pthread.h semaphore.h sched.h
 -
 -OPTIM	= /O2 /Ob0
 -
 -XXLIBS	= ws2_32.lib
 -
 -# C++ Exceptions
 -VCEFLAGS	= /GX /TP /DPtW32NoCatchWarn /D__CLEANUP_CXX
 -VCELIB	= pthreadVCE$(DLL_VER).lib
 -VCEDLL	= pthreadVCE$(DLL_VER).dll
 -# Structured Exceptions
 -VSEFLAGS	= /D__CLEANUP_SEH
 -VSELIB	= pthreadVSE$(DLL_VER).lib
 -VSEDLL	= pthreadVSE$(DLL_VER).dll
 -# C cleanup code
 -VCFLAGS	= /D__CLEANUP_C
 -VCLIB	= pthreadVC$(DLL_VER).lib
 -VCDLL	= pthreadVC$(DLL_VER).dll
 -# C++ Exceptions in application - using VC version of pthreads dll
 -VCXFLAGS	= /GX /TP /D__CLEANUP_C
 -
 -# Defaults
 -CPLIB	= $(VCLIB)
 -CPDLL	= $(VCDLL)
 -
 -CFLAGS= $(OPTIM) /W3 /WX /MD /nologo /Yd /Zi
 -LFLAGS= /INCREMENTAL:NO
 -INCLUDES=-I.
 -BUILD_DIR=..
 -
 -COPYFILES	= $(CPHDR) $(CPLIB) $(CPDLL) $(QAPC)
 -
 -TEST		=
 -EHFLAGS	=
 -
 -# If a test case returns a non-zero exit code to the shell, make will
 -# stop.
 -
 -PASSES= sizes.pass  loadfree.pass \
 -	  self1.pass  mutex5.pass  \
 -	  mutex1.pass  mutex1n.pass  mutex1e.pass  mutex1r.pass  \
 -	  semaphore1.pass  semaphore2.pass  semaphore3.pass  \
 -	  mutex2.pass  mutex3.pass  \
 -	  mutex2r.pass  mutex2e.pass  mutex3r.pass  mutex3e.pass  \
 -	  condvar1.pass  condvar1_1.pass  condvar1_2.pass  condvar2.pass  condvar2_1.pass  \
 -	  exit1.pass  create1.pass  create2.pass  reuse1.pass  reuse2.pass  equal1.pass  \
 -	  kill1.pass  valid1.pass  valid2.pass  \
 -	  exit2.pass  exit3.pass  exit4.pass  exit5.pass  \
 -	  join0.pass  join1.pass  join2.pass join3.pass  \
 -	  mutex4.pass  mutex6.pass  mutex6n.pass  mutex6e.pass  mutex6r.pass  \
 -	  mutex6s.pass  mutex6es.pass  mutex6rs.pass  \
 -	  mutex7.pass  mutex7n.pass  mutex7e.pass  mutex7r.pass  \
 -	  mutex8.pass  mutex8n.pass  mutex8e.pass  mutex8r.pass  \
 -	  count1.pass  once1.pass  once2.pass  once3.pass  once4.pass  tsd1.pass  \
 -	  self2.pass  \
 -	  cancel1.pass  cancel2.pass  \
 -	  semaphore4.pass  semaphore4t.pass  \
 -	  delay1.pass  delay2.pass  eyal1.pass  \
 -	  condvar3.pass  condvar3_1.pass  condvar3_2.pass  condvar3_3.pass  \
 -	  condvar4.pass  condvar5.pass  condvar6.pass  \
 -	  condvar7.pass  condvar8.pass  condvar9.pass  \
 -	  errno1.pass  \
 -	  rwlock1.pass  rwlock2.pass  rwlock3.pass  rwlock4.pass  \
 -	  rwlock5.pass  rwlock6.pass  rwlock7.pass  rwlock8.pass  \
 -	  rwlock2_t.pass  rwlock3_t.pass  rwlock4_t.pass  rwlock5_t.pass  rwlock6_t.pass  rwlock6_t2.pass  \
 -	  context1.pass  \
 -	  cancel3.pass  cancel4.pass  cancel5.pass  cancel6a.pass  cancel6d.pass  \
 -	  cancel7.pass  cancel8.pass  \
 -	  cleanup0.pass  cleanup1.pass  cleanup2.pass  cleanup3.pass  \
 -	  priority1.pass priority2.pass inherit1.pass  \
 -	  spin1.pass  spin2.pass  spin3.pass  spin4.pass  \
 -	  barrier1.pass  barrier2.pass  barrier3.pass  barrier4.pass  barrier5.pass  \
 -	  exception1.pass  exception2.pass  exception3.pass  \
 -	  cancel9.pass create3.pass
 -
 -BENCHRESULTS = \
 -	  benchtest1.bench benchtest2.bench benchtest3.bench benchtest4.bench benchtest5.bench
 -
 -STATICRESULTS = \
 -	  self1.pass
 -
 -help:
 -	@ $(ECHO) Run one of the following command lines:
 -	@ $(ECHO) nmake clean VC    (to test using VC dll with VC (no EH) applications)
 -	@ $(ECHO) nmake clean VCX   (to test using VC dll with VC++ (EH) applications)
 -	@ $(ECHO) nmake clean VCE   (to test using the VCE dll with VC++ EH applications)
 -	@ $(ECHO) nmake clean VSE   (to test using VSE dll with VC (SEH) applications)
 -	@ $(ECHO) nmake clean VC-bench    (to benchtest using VC dll with C bench app)
 -	@ $(ECHO) nmake clean VCX-bench   (to benchtest using VC dll with C++ bench app)
 -	@ $(ECHO) nmake clean VCE-bench   (to benchtest using VCE dll with C++ bench app)
 -	@ $(ECHO) nmake clean VSE-bench   (to benchtest using VSE dll with SEH bench app)
 -	@ $(ECHO) nmake clean VC-static   (to test using VC static lib with VC (no EH) applications)
 -
 -all:
 -	@ nmake clean VC
 -	@ nmake clean VCX
 -	@ nmake clean VCE
 -	@ nmake clean VSE
 -	@ nmake clean VC-bench
 -
 -# This allows an individual test application to be made using the default lib.
 -# e.g. nmake clean test cancel3.exe
 -test: $(CPLIB) $(CPDLL) $(CPHDR) $(QAPC)
 -
 -tests: $(CPLIB) $(CPDLL) $(CPHDR) $(QAPC) $(PASSES)
 -	@ $(ECHO) ALL TESTS PASSED! Congratulations!
 -
 -benchtests: $(CPLIB) $(CPDLL) $(CPHDR) $(XXLIBS) $(BENCHRESULTS)
 -	@ $(ECHO) ALL BENCH TESTS DONE.
 -
 -statictests: $(CPLIB) $(CPDLL) $(CPHDR) $(STATICRESULTS)
 -	@ $(ECHO) ALL STATIC TESTS DONE.
 -	@ $(ECHO) Build and test the DLL to run all tests.
 -	@ $(ECHO) The static test only confirms that the .lib links correctly.
 -
 -sizes.pass: sizes.exe
 -	@ $(ECHO) ... Running $(TEST)$(DLL_VER) test: $*.exe
 -	@ .\$*.exe > SIZES.$(TEST)
 -	@ $(CAT) SIZES.$(TEST)
 -	@ $(ECHO) ...... Passed
 -	@ $(TOUCH) $*.pass
 -
 -$(PASSES): $*.exe
 -	@ $(ECHO) ... Running $(TEST) test: $*.exe
 -	@ .\$*.exe
 -	@ $(ECHO) ...... Passed
 -	@ $(TOUCH) $*.pass
 -
 -$(BENCHRESULTS): $*.exe
 -	@ $(ECHO) ... Running $(TEST) benchtest: $*.exe
 -	@ .\$*.exe
 -	@ $(ECHO) ...... Done
 -	@ $(TOUCH) $*.bench
 -
 -VCE:
 -	@ nmake TEST="$@" CPLIB="$(VCELIB)" CPDLL="$(VCEDLL)" EHFLAGS="$(VCEFLAGS)" tests
 -
 -VSE:	
 -	@ nmake TEST="$@" CPLIB="$(VSELIB)" CPDLL="$(VSEDLL)" EHFLAGS="$(VSEFLAGS)" tests
 -
 -VC:
 -	@ nmake TEST="$@" CPLIB="$(VCLIB)" CPDLL="$(VCDLL)" EHFLAGS="$(VCFLAGS)" tests
 -
 -VCX:
 -	@ nmake TEST="$@" CPLIB="$(VCLIB)" CPDLL="$(VCDLL)" EHFLAGS="$(VCXFLAGS)" tests
 -
 -VCE-bench:
 -	@ nmake TEST="$@" CPLIB="$(VCELIB)" CPDLL="$(VCEDLL)" EHFLAGS="$(VCEFLAGS)" XXLIBS="benchlib.o" benchtests
 -
 -VSE-bench:
 -	@ nmake TEST="$@" CPLIB="$(VSELIB)" CPDLL="$(VSEDLL)" EHFLAGS="$(VSEFLAGS)" XXLIBS="benchlib.o" benchtests
 -
 -VC-bench:
 -	@ nmake TEST="$@" CPLIB="$(VCLIB)" CPDLL="$(VCDLL)" EHFLAGS="$(VCFLAGS)" XXLIBS="benchlib.o" benchtests
 -
 -VCX-bench:
 -	@ nmake TEST="$@" CPLIB="$(VCLIB)" CPDLL="$(VCDLL)" EHFLAGS="$(VCXFLAGS)" XXLIBS="benchlib.o" benchtests
 -
 -VC-static:
 -	@ nmake TEST="$@" CPLIB="$(VCLIB)" CPDLL="" EHFLAGS="$(VCFLAGS) /DPTW32_STATIC_LIB" statictests
 -
 -.c.exe:
 -	@ $(ECHO) $(CC) $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< /Fe$@ /link $(LFLAGS) $(CPLIB) $(XXLIBS)
 -	@ $(CC) $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< /Fe$@ /link $(LFLAGS) $(CPLIB) $(XXLIBS)
 -
 -.c.o:
 -	@ $(ECHO) $(CC) $(EHFLAGS) /c $(CFLAGS) $(INCLUDES) $< /Fo$@
 -	@ $(CC) $(EHFLAGS) $(CFLAGS) /c $(INCLUDES) $< /Fo$@
 -
 -.c.i:
 -	@ $(CC) /P $(EHFLAGS) $(CFLAGS) $(INCLUDES) $<
 -
 -$(COPYFILES):
 -	@ $(ECHO) Copying $@
 -	@ $(CP) $(BUILD_DIR)\$@ .
 -
 -pthread.dll: $(CPDLL)
 -	@ $(CP) $(CPDLL) pthread.dll
 -	@ $(CP) $(CPLIB) pthread.lib
 -
 -clean:
 -	- $(RM) *.dll
 -	- $(RM) *.lib
 -	- $(RM) pthread.h
 -	- $(RM) semaphore.h
 -	- $(RM) sched.h
 -	- $(RM) *.e
 -	- $(RM) *.i
 -	- $(RM) *.obj
 -	- $(RM) *.pdb
 -	- $(RM) *.o
 -	- $(RM) *.asm
 -	- $(RM) *.exe
 -	- $(RM) *.pass
 -	- $(RM) *.bench
 -	- $(RM) *.log
 -
 -benchtest1.bench:
 -benchtest2.bench:
 -benchtest3.bench:
 -benchtest4.bench:
 -benchtest5.bench:
 -barrier1.pass:
 -barrier2.pass: barrier1.pass
 -barrier3.pass: barrier2.pass
 -barrier4.pass: barrier3.pass
 -barrier5.pass: barrier4.pass
 -cancel1.pass: create1.pass
 -cancel2.pass: cancel1.pass
 -cancel3.pass: context1.pass
 -cancel4.pass: cancel3.pass
 -cancel5.pass: cancel3.pass
 -cancel6a.pass: cancel3.pass
 -cancel6d.pass: cancel3.pass
 -cancel7.pass: kill1.pass
 -cancel8.pass: cancel7.pass
 -cleanup0.pass: cancel5.pass
 -cleanup1.pass: cleanup0.pass
 -cleanup2.pass: cleanup1.pass
 -cleanup3.pass: cleanup2.pass
 -condvar1.pass:
 -condvar1_1.pass: condvar1.pass
 -condvar1_2.pass: join2.pass
 -condvar2.pass: condvar1.pass
 -condvar2_1.pass: condvar2.pass join2.pass
 -condvar3.pass: create1.pass condvar2.pass
 -condvar3_1.pass: condvar3.pass join2.pass
 -condvar3_2.pass: condvar3_1.pass
 -condvar3_3.pass: condvar3_2.pass
 -condvar4.pass: create1.pass
 -condvar5.pass: condvar4.pass
 -condvar6.pass: condvar5.pass
 -condvar7.pass: condvar6.pass cleanup1.pass
 -condvar8.pass: condvar7.pass
 -condvar9.pass: condvar8.pass
 -context1.pass: cancel2.pass
 -count1.pass: join1.pass
 -create1.pass: mutex2.pass
 -create2.pass: create1.pass
 -create3.pass:
 -delay1.pass:
 -delay2.pass: delay1.pass
 -equal1.pass: create1.pass
 -errno1.pass: mutex3.pass
 -exception1.pass: cancel4.pass
 -exception2.pass: exception1.pass
 -exception3.pass: exception2.pass
 -exit1.pass:
 -exit2.pass: create1.pass
 -exit3.pass: create1.pass
 -exit4.pass:
 -exit5.pass: kill1.pass
 -eyal1.pass: tsd1.pass
 -inherit1.pass: join1.pass priority1.pass
 -join0.pass: create1.pass
 -join1.pass: create1.pass
 -join2.pass: create1.pass
 -join3.pass: join2.pass
 -kill1.pass: 
 -loadfree.pass: pthread.dll
 -mutex1.pass: self1.pass
 -mutex1n.pass: mutex1.pass
 -mutex1e.pass: mutex1.pass
 -mutex1r.pass: mutex1.pass
 -mutex2.pass: mutex1.pass
 -mutex2r.pass: mutex2.pass
 -mutex2e.pass: mutex2.pass
 -mutex3.pass: create1.pass
 -mutex3r.pass: mutex3.pass
 -mutex3e.pass: mutex3.pass
 -mutex4.pass: mutex3.pass
 -mutex5.pass:
 -mutex6.pass: mutex4.pass
 -mutex6n.pass: mutex4.pass
 -mutex6e.pass: mutex4.pass
 -mutex6r.pass: mutex4.pass
 -mutex6s.pass: mutex6.pass
 -mutex6rs.pass: mutex6r.pass
 -mutex6es.pass: mutex6e.pass
 -mutex7.pass: mutex6.pass
 -mutex7n.pass: mutex6n.pass
 -mutex7e.pass: mutex6e.pass
 -mutex7r.pass: mutex6r.pass
 -mutex8.pass: mutex7.pass
 -mutex8n.pass: mutex7n.pass
 -mutex8e.pass: mutex7e.pass
 -mutex8r.pass: mutex7r.pass
 -once1.pass: create1.pass
 -once2.pass: once1.pass
 -once3.pass: once2.pass
 -once4.pass: once3.pass
 -priority1.pass: join1.pass
 -priority2.pass: priority1.pass barrier3.pass
 -reuse1.pass: create2.pass
 -reuse2.pass: reuse1.pass
 -rwlock1.pass: condvar6.pass
 -rwlock2.pass: rwlock1.pass
 -rwlock3.pass: rwlock2.pass
 -rwlock4.pass: rwlock3.pass
 -rwlock5.pass: rwlock4.pass
 -rwlock6.pass: rwlock5.pass
 -rwlock7.pass: rwlock6.pass
 -rwlock8.pass: rwlock7.pass
 -rwlock2_t.pass: rwlock2.pass
 -rwlock3_t.pass: rwlock2_t.pass
 -rwlock4_t.pass: rwlock3_t.pass
 -rwlock5_t.pass: rwlock4_t.pass
 -rwlock6_t.pass: rwlock5_t.pass
 -rwlock6_t2.pass: rwlock6_t.pass
 -self1.pass:
 -self2.pass: create1.pass
 -semaphore1.pass:
 -semaphore2.pass:
 -semaphore3.pass: semaphore2.pass
 -semaphore4.pass: semaphore3.pass cancel1.pass
 -semaphore4t.pass: semaphore4.pass
 -sizes.pass:
 -spin1.pass:
 -spin2.pass: spin1.pass
 -spin3.pass: spin2.pass
 -spin4.pass: spin3.pass
 -tsd1.pass: join1.pass
 -valid1.pass: join1.pass
 -valid2.pass: valid1.pass
 -cancel9.pass: cancel8.pass
 +# Makefile for the pthreads test suite. +# If all of the .pass files can be created, the test suite has passed. +# +# -------------------------------------------------------------------------- +# +#      Pthreads-win32 - POSIX Threads Library for Win32 +#      Copyright(C) 1998 John E. Bossom +#      Copyright(C) 1999,2005 Pthreads-win32 contributors +#  +#      Contact Email: rpj@callisto.canberra.edu.au +#  +#      The current list of contributors is contained +#      in the file CONTRIBUTORS included with the source +#      code distribution. The list can also be seen at the +#      following World Wide Web location: +#      http://sources.redhat.com/pthreads-win32/contributors.html +#  +#      This library is free software; you can redistribute it and/or +#      modify it under the terms of the GNU Lesser General Public +#      License as published by the Free Software Foundation; either +#      version 2 of the License, or (at your option) any later version. +#  +#      This library is distributed in the hope that it will be useful, +#      but WITHOUT ANY WARRANTY; without even the implied warranty of +#      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +#      Lesser General Public License for more details. +#  +#      You should have received a copy of the GNU Lesser General Public +#      License along with this library in the file COPYING.LIB; +#      if not, write to the Free Software Foundation, Inc., +#      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +# + +DLL_VER	= 2 + +CP	= copy +RM	= erase +CAT	= type +MKDIR	= mkdir +TOUCH	= echo Passed > +ECHO	= @echo + +QAPC	= ..\QueueUserAPCEx\User\quserex.dll + +CPHDR	= pthread.h semaphore.h sched.h + +OPTIM	= /O2 /Ob0 + +XXLIBS	= ws2_32.lib + +# C++ Exceptions +VCEFLAGS	= /GX /TP /DPtW32NoCatchWarn /D__CLEANUP_CXX +VCELIB	= pthreadVCE$(DLL_VER).lib +VCEDLL	= pthreadVCE$(DLL_VER).dll +# Structured Exceptions +VSEFLAGS	= /D__CLEANUP_SEH +VSELIB	= pthreadVSE$(DLL_VER).lib +VSEDLL	= pthreadVSE$(DLL_VER).dll +# C cleanup code +VCFLAGS	= /D__CLEANUP_C +VCLIB	= pthreadVC$(DLL_VER).lib +VCDLL	= pthreadVC$(DLL_VER).dll +# C++ Exceptions in application - using VC version of pthreads dll +VCXFLAGS	= /GX /TP /D__CLEANUP_C + +# Defaults +CPLIB	= $(VCLIB) +CPDLL	= $(VCDLL) + +CFLAGS= $(OPTIM) /W3 /WX /MD /nologo /Yd /Zi +LFLAGS= /INCREMENTAL:NO +INCLUDES=-I. +BUILD_DIR=.. + +COPYFILES	= $(CPHDR) $(CPLIB) $(CPDLL) $(QAPC) + +TEST		= +EHFLAGS	= + +# If a test case returns a non-zero exit code to the shell, make will +# stop. + +PASSES= sizes.pass  loadfree.pass \ +	  self1.pass  mutex5.pass  \ +	  mutex1.pass  mutex1n.pass  mutex1e.pass  mutex1r.pass  \ +	  semaphore1.pass  semaphore2.pass  semaphore3.pass  \ +	  mutex2.pass  mutex3.pass  \ +	  mutex2r.pass  mutex2e.pass  mutex3r.pass  mutex3e.pass  \ +	  condvar1.pass  condvar1_1.pass  condvar1_2.pass  condvar2.pass  condvar2_1.pass  \ +	  exit1.pass  create1.pass  create2.pass  reuse1.pass  reuse2.pass  equal1.pass  \ +	  kill1.pass  valid1.pass  valid2.pass  \ +	  exit2.pass  exit3.pass  exit4.pass  exit5.pass  \ +	  join0.pass  join1.pass  join2.pass join3.pass  \ +	  mutex4.pass  mutex6.pass  mutex6n.pass  mutex6e.pass  mutex6r.pass  \ +	  mutex6s.pass  mutex6es.pass  mutex6rs.pass  \ +	  mutex7.pass  mutex7n.pass  mutex7e.pass  mutex7r.pass  \ +	  mutex8.pass  mutex8n.pass  mutex8e.pass  mutex8r.pass  \ +	  count1.pass  once1.pass  once2.pass  once3.pass  once4.pass  tsd1.pass  \ +	  self2.pass  \ +	  cancel1.pass  cancel2.pass  \ +	  semaphore4.pass  semaphore4t.pass  \ +	  delay1.pass  delay2.pass  eyal1.pass  \ +	  condvar3.pass  condvar3_1.pass  condvar3_2.pass  condvar3_3.pass  \ +	  condvar4.pass  condvar5.pass  condvar6.pass  \ +	  condvar7.pass  condvar8.pass  condvar9.pass  \ +	  errno1.pass  \ +	  rwlock1.pass  rwlock2.pass  rwlock3.pass  rwlock4.pass  \ +	  rwlock5.pass  rwlock6.pass  rwlock7.pass  rwlock8.pass  \ +	  rwlock2_t.pass  rwlock3_t.pass  rwlock4_t.pass  rwlock5_t.pass  rwlock6_t.pass  rwlock6_t2.pass  \ +	  context1.pass  \ +	  cancel3.pass  cancel4.pass  cancel5.pass  cancel6a.pass  cancel6d.pass  \ +	  cancel7.pass  cancel8.pass  \ +	  cleanup0.pass  cleanup1.pass  cleanup2.pass  cleanup3.pass  \ +	  priority1.pass priority2.pass inherit1.pass  \ +	  spin1.pass  spin2.pass  spin3.pass  spin4.pass  \ +	  barrier1.pass  barrier2.pass  barrier3.pass  barrier4.pass  barrier5.pass  \ +	  exception1.pass  exception2.pass  exception3.pass  \ +	  cancel9.pass create3.pass + +BENCHRESULTS = \ +	  benchtest1.bench benchtest2.bench benchtest3.bench benchtest4.bench benchtest5.bench + +STATICRESULTS = \ +	  self1.pass + +help: +	@ $(ECHO) Run one of the following command lines: +	@ $(ECHO) nmake clean VC    (to test using VC dll with VC (no EH) applications) +	@ $(ECHO) nmake clean VCX   (to test using VC dll with VC++ (EH) applications) +	@ $(ECHO) nmake clean VCE   (to test using the VCE dll with VC++ EH applications) +	@ $(ECHO) nmake clean VSE   (to test using VSE dll with VC (SEH) applications) +	@ $(ECHO) nmake clean VC-bench    (to benchtest using VC dll with C bench app) +	@ $(ECHO) nmake clean VCX-bench   (to benchtest using VC dll with C++ bench app) +	@ $(ECHO) nmake clean VCE-bench   (to benchtest using VCE dll with C++ bench app) +	@ $(ECHO) nmake clean VSE-bench   (to benchtest using VSE dll with SEH bench app) +	@ $(ECHO) nmake clean VC-static   (to test using VC static lib with VC (no EH) applications) + +all: +	@ nmake clean VC +	@ nmake clean VCX +	@ nmake clean VCE +	@ nmake clean VSE +	@ nmake clean VC-bench + +# This allows an individual test application to be made using the default lib. +# e.g. nmake clean test cancel3.exe +test: $(CPLIB) $(CPDLL) $(CPHDR) $(QAPC) + +tests: $(CPLIB) $(CPDLL) $(CPHDR) $(QAPC) $(PASSES) +	@ $(ECHO) ALL TESTS PASSED! Congratulations! + +benchtests: $(CPLIB) $(CPDLL) $(CPHDR) $(XXLIBS) $(BENCHRESULTS) +	@ $(ECHO) ALL BENCH TESTS DONE. + +statictests: $(CPLIB) $(CPDLL) $(CPHDR) $(STATICRESULTS) +	@ $(ECHO) ALL STATIC TESTS DONE. +	@ $(ECHO) Build and test the DLL to run all tests. +	@ $(ECHO) The static test only confirms that the .lib links correctly. + +sizes.pass: sizes.exe +	@ $(ECHO) ... Running $(TEST)$(DLL_VER) test: $*.exe +	@ .\$*.exe > SIZES.$(TEST) +	@ $(CAT) SIZES.$(TEST) +	@ $(ECHO) ...... Passed +	@ $(TOUCH) $*.pass + +$(PASSES): $*.exe +	@ $(ECHO) ... Running $(TEST) test: $*.exe +	@ .\$*.exe +	@ $(ECHO) ...... Passed +	@ $(TOUCH) $*.pass + +$(BENCHRESULTS): $*.exe +	@ $(ECHO) ... Running $(TEST) benchtest: $*.exe +	@ .\$*.exe +	@ $(ECHO) ...... Done +	@ $(TOUCH) $*.bench + +VCE: +	@ nmake TEST="$@" CPLIB="$(VCELIB)" CPDLL="$(VCEDLL)" EHFLAGS="$(VCEFLAGS)" tests + +VSE:	 +	@ nmake TEST="$@" CPLIB="$(VSELIB)" CPDLL="$(VSEDLL)" EHFLAGS="$(VSEFLAGS)" tests + +VC: +	@ nmake TEST="$@" CPLIB="$(VCLIB)" CPDLL="$(VCDLL)" EHFLAGS="$(VCFLAGS)" tests + +VCX: +	@ nmake TEST="$@" CPLIB="$(VCLIB)" CPDLL="$(VCDLL)" EHFLAGS="$(VCXFLAGS)" tests + +VCE-bench: +	@ nmake TEST="$@" CPLIB="$(VCELIB)" CPDLL="$(VCEDLL)" EHFLAGS="$(VCEFLAGS)" XXLIBS="benchlib.o" benchtests + +VSE-bench: +	@ nmake TEST="$@" CPLIB="$(VSELIB)" CPDLL="$(VSEDLL)" EHFLAGS="$(VSEFLAGS)" XXLIBS="benchlib.o" benchtests + +VC-bench: +	@ nmake TEST="$@" CPLIB="$(VCLIB)" CPDLL="$(VCDLL)" EHFLAGS="$(VCFLAGS)" XXLIBS="benchlib.o" benchtests + +VCX-bench: +	@ nmake TEST="$@" CPLIB="$(VCLIB)" CPDLL="$(VCDLL)" EHFLAGS="$(VCXFLAGS)" XXLIBS="benchlib.o" benchtests + +VC-static: +	@ nmake TEST="$@" CPLIB="$(VCLIB)" CPDLL="" EHFLAGS="$(VCFLAGS) /DPTW32_STATIC_LIB" statictests + +.c.exe: +	@ $(ECHO) $(CC) $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< /Fe$@ /link $(LFLAGS) $(CPLIB) $(XXLIBS) +	@ $(CC) $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< /Fe$@ /link $(LFLAGS) $(CPLIB) $(XXLIBS) + +.c.o: +	@ $(ECHO) $(CC) $(EHFLAGS) /c $(CFLAGS) $(INCLUDES) $< /Fo$@ +	@ $(CC) $(EHFLAGS) $(CFLAGS) /c $(INCLUDES) $< /Fo$@ + +.c.i: +	@ $(CC) /P $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< + +$(COPYFILES): +	@ $(ECHO) Copying $@ +	@ $(CP) $(BUILD_DIR)\$@ . + +pthread.dll: $(CPDLL) +	@ $(CP) $(CPDLL) pthread.dll +	@ $(CP) $(CPLIB) pthread.lib + +clean: +	- $(RM) *.dll +	- $(RM) *.lib +	- $(RM) pthread.h +	- $(RM) semaphore.h +	- $(RM) sched.h +	- $(RM) *.e +	- $(RM) *.i +	- $(RM) *.obj +	- $(RM) *.pdb +	- $(RM) *.o +	- $(RM) *.asm +	- $(RM) *.exe +	- $(RM) *.pass +	- $(RM) *.bench +	- $(RM) *.log + +benchtest1.bench: +benchtest2.bench: +benchtest3.bench: +benchtest4.bench: +benchtest5.bench: +barrier1.pass: +barrier2.pass: barrier1.pass +barrier3.pass: barrier2.pass +barrier4.pass: barrier3.pass +barrier5.pass: barrier4.pass +cancel1.pass: create1.pass +cancel2.pass: cancel1.pass +cancel3.pass: context1.pass +cancel4.pass: cancel3.pass +cancel5.pass: cancel3.pass +cancel6a.pass: cancel3.pass +cancel6d.pass: cancel3.pass +cancel7.pass: kill1.pass +cancel8.pass: cancel7.pass +cleanup0.pass: cancel5.pass +cleanup1.pass: cleanup0.pass +cleanup2.pass: cleanup1.pass +cleanup3.pass: cleanup2.pass +condvar1.pass: +condvar1_1.pass: condvar1.pass +condvar1_2.pass: join2.pass +condvar2.pass: condvar1.pass +condvar2_1.pass: condvar2.pass join2.pass +condvar3.pass: create1.pass condvar2.pass +condvar3_1.pass: condvar3.pass join2.pass +condvar3_2.pass: condvar3_1.pass +condvar3_3.pass: condvar3_2.pass +condvar4.pass: create1.pass +condvar5.pass: condvar4.pass +condvar6.pass: condvar5.pass +condvar7.pass: condvar6.pass cleanup1.pass +condvar8.pass: condvar7.pass +condvar9.pass: condvar8.pass +context1.pass: cancel2.pass +count1.pass: join1.pass +create1.pass: mutex2.pass +create2.pass: create1.pass +create3.pass: +delay1.pass: +delay2.pass: delay1.pass +equal1.pass: create1.pass +errno1.pass: mutex3.pass +exception1.pass: cancel4.pass +exception2.pass: exception1.pass +exception3.pass: exception2.pass +exit1.pass: +exit2.pass: create1.pass +exit3.pass: create1.pass +exit4.pass: +exit5.pass: kill1.pass +eyal1.pass: tsd1.pass +inherit1.pass: join1.pass priority1.pass +join0.pass: create1.pass +join1.pass: create1.pass +join2.pass: create1.pass +join3.pass: join2.pass +kill1.pass:  +loadfree.pass: pthread.dll +mutex1.pass: self1.pass +mutex1n.pass: mutex1.pass +mutex1e.pass: mutex1.pass +mutex1r.pass: mutex1.pass +mutex2.pass: mutex1.pass +mutex2r.pass: mutex2.pass +mutex2e.pass: mutex2.pass +mutex3.pass: create1.pass +mutex3r.pass: mutex3.pass +mutex3e.pass: mutex3.pass +mutex4.pass: mutex3.pass +mutex5.pass: +mutex6.pass: mutex4.pass +mutex6n.pass: mutex4.pass +mutex6e.pass: mutex4.pass +mutex6r.pass: mutex4.pass +mutex6s.pass: mutex6.pass +mutex6rs.pass: mutex6r.pass +mutex6es.pass: mutex6e.pass +mutex7.pass: mutex6.pass +mutex7n.pass: mutex6n.pass +mutex7e.pass: mutex6e.pass +mutex7r.pass: mutex6r.pass +mutex8.pass: mutex7.pass +mutex8n.pass: mutex7n.pass +mutex8e.pass: mutex7e.pass +mutex8r.pass: mutex7r.pass +once1.pass: create1.pass +once2.pass: once1.pass +once3.pass: once2.pass +once4.pass: once3.pass +priority1.pass: join1.pass +priority2.pass: priority1.pass barrier3.pass +reuse1.pass: create2.pass +reuse2.pass: reuse1.pass +rwlock1.pass: condvar6.pass +rwlock2.pass: rwlock1.pass +rwlock3.pass: rwlock2.pass +rwlock4.pass: rwlock3.pass +rwlock5.pass: rwlock4.pass +rwlock6.pass: rwlock5.pass +rwlock7.pass: rwlock6.pass +rwlock8.pass: rwlock7.pass +rwlock2_t.pass: rwlock2.pass +rwlock3_t.pass: rwlock2_t.pass +rwlock4_t.pass: rwlock3_t.pass +rwlock5_t.pass: rwlock4_t.pass +rwlock6_t.pass: rwlock5_t.pass +rwlock6_t2.pass: rwlock6_t.pass +self1.pass: +self2.pass: create1.pass +semaphore1.pass: +semaphore2.pass: +semaphore3.pass: semaphore2.pass +semaphore4.pass: semaphore3.pass cancel1.pass +semaphore4t.pass: semaphore4.pass +sizes.pass: +spin1.pass: +spin2.pass: spin1.pass +spin3.pass: spin2.pass +spin4.pass: spin3.pass +tsd1.pass: join1.pass +valid1.pass: join1.pass +valid2.pass: valid1.pass +cancel9.pass: cancel8.pass diff --git a/tests/README.benchtests b/tests/README.benchtests index 01051a2..e02cb3e 100644 --- a/tests/README.benchtests +++ b/tests/README.benchtests @@ -1,97 +1,97 @@ -
 -------------
 -Benchmarking
 -------------
 -There is a new but growing set a benchmarking programs in the
 -"tests" directory. These should be runnable using the
 -following command-lines corresponding to each of the possible
 -library builds:
 -
 -MSVC:
 -nmake clean VC-bench
 -nmake clean VCE-bench
 -nmake clean VSE-bench
 -
 -Mingw32:
 -make clean GC-bench
 -make clean GCE-bench
 -
 -UWIN:
 -The benchtests are run as part of the testsuite.
 -
 -
 -Mutex benchtests
 -----------------
 -
 -benchtest1 - Lock plus unlock on an unlocked mutex.
 -benchtest2 - Lock plus unlock on a locked mutex.
 -benchtest3 - Trylock on a locked mutex.
 -benchtest4 - Trylock plus unlock on an unlocked mutex.
 -
 -
 -Each test times up to three alternate synchronisation
 -implementations as a reference, and then times each of
 -the four mutex types provided by the library. Each is
 -described below:
 -
 -Simple Critical Section
 -- uses a simple Win32 critical section. There is no
 -additional overhead for this case as there is in the
 -remaining cases.
 -
 -POSIX mutex implemented using a Critical Section
 -- The old implementation which uses runtime adaptation
 -depending on the Windows variant being run on. When
 -the pthreads DLL was run on WinNT or higher then
 -POSIX mutexes would use Win32 Critical Sections.
 -
 -POSIX mutex implemented using a Win32 Mutex
 -- The old implementation which uses runtime adaptation
 -depending on the Windows variant being run on. When
 -the pthreads DLL was run on Win9x then POSIX mutexes
 -would use Win32 Mutexes (because TryEnterCriticalSection
 -is not implemented on Win9x).
 -
 -PTHREAD_MUTEX_DEFAULT
 -PTHREAD_MUTEX_NORMAL
 -PTHREAD_MUTEX_ERRORCHECK
 -PTHREAD_MUTEX_RECURSIVE
 -- The current implementation supports these mutex types.
 -The underlying basis of POSIX mutexes is now the same
 -irrespective of the Windows variant, and should therefore
 -have consistent performance.
 -
 -
 -In all benchtests, the operation is repeated a large
 -number of times and an average is calculated. Loop
 -overhead is measured and subtracted from all test times.
 -
 -Comment on the results
 -----------------------
 -The gain in performance for Win9x systems is enormous - up to
 -40 times faster for unlocked mutexes (2 times faster for locked
 -mutexes).
 -
 -Pthread_mutex_trylock also appears to be faster for locked mutexes.
 -
 -The price for the new consistency between WinNT and Win9x is
 -slower performance (up to twice as long) across a lock/unlock
 -sequence. It is difficult to get a good split timing for lock
 -and unlock operations, but by code inspection, it is the unlock
 -operation that is slowing the pair down in comparison with the
 -old-style CS mutexes, even for the fast PTHREAD_MUTEX_NORMAL mutex
 -type with no other waiting threads. However, comparitive
 -performance for operations on already locked mutexes is very close.
 -
 -When this is translated to real-world applications, the overall
 -camparitive performance should be almost identical on NT class
 -systems. That is, applications with heavy mutex contention should
 -have almost equal performance, while applications with only light
 -mutex contention should also have almost equal performance because
 -the most critical operation in this case is the lock operation.
 -
 -Overall, the newer pthreads-win32 mutex routines are only slower
 -(on NT class systems) where and when it is least critical.
 -
 -Thanks go to Thomas Pfaff for the current implementation of mutex
 -routines.
 + +------------ +Benchmarking +------------ +There is a new but growing set a benchmarking programs in the +"tests" directory. These should be runnable using the +following command-lines corresponding to each of the possible +library builds: + +MSVC: +nmake clean VC-bench +nmake clean VCE-bench +nmake clean VSE-bench + +Mingw32: +make clean GC-bench +make clean GCE-bench + +UWIN: +The benchtests are run as part of the testsuite. + + +Mutex benchtests +---------------- + +benchtest1 - Lock plus unlock on an unlocked mutex. +benchtest2 - Lock plus unlock on a locked mutex. +benchtest3 - Trylock on a locked mutex. +benchtest4 - Trylock plus unlock on an unlocked mutex. + + +Each test times up to three alternate synchronisation +implementations as a reference, and then times each of +the four mutex types provided by the library. Each is +described below: + +Simple Critical Section +- uses a simple Win32 critical section. There is no +additional overhead for this case as there is in the +remaining cases. + +POSIX mutex implemented using a Critical Section +- The old implementation which uses runtime adaptation +depending on the Windows variant being run on. When +the pthreads DLL was run on WinNT or higher then +POSIX mutexes would use Win32 Critical Sections. + +POSIX mutex implemented using a Win32 Mutex +- The old implementation which uses runtime adaptation +depending on the Windows variant being run on. When +the pthreads DLL was run on Win9x then POSIX mutexes +would use Win32 Mutexes (because TryEnterCriticalSection +is not implemented on Win9x). + +PTHREAD_MUTEX_DEFAULT +PTHREAD_MUTEX_NORMAL +PTHREAD_MUTEX_ERRORCHECK +PTHREAD_MUTEX_RECURSIVE +- The current implementation supports these mutex types. +The underlying basis of POSIX mutexes is now the same +irrespective of the Windows variant, and should therefore +have consistent performance. + + +In all benchtests, the operation is repeated a large +number of times and an average is calculated. Loop +overhead is measured and subtracted from all test times. + +Comment on the results +---------------------- +The gain in performance for Win9x systems is enormous - up to +40 times faster for unlocked mutexes (2 times faster for locked +mutexes). + +Pthread_mutex_trylock also appears to be faster for locked mutexes. + +The price for the new consistency between WinNT and Win9x is +slower performance (up to twice as long) across a lock/unlock +sequence. It is difficult to get a good split timing for lock +and unlock operations, but by code inspection, it is the unlock +operation that is slowing the pair down in comparison with the +old-style CS mutexes, even for the fast PTHREAD_MUTEX_NORMAL mutex +type with no other waiting threads. However, comparitive +performance for operations on already locked mutexes is very close. + +When this is translated to real-world applications, the overall +camparitive performance should be almost identical on NT class +systems. That is, applications with heavy mutex contention should +have almost equal performance, while applications with only light +mutex contention should also have almost equal performance because +the most critical operation in this case is the lock operation. + +Overall, the newer pthreads-win32 mutex routines are only slower +(on NT class systems) where and when it is least critical. + +Thanks go to Thomas Pfaff for the current implementation of mutex +routines. diff --git a/tests/Wmakefile b/tests/Wmakefile index 512b2ce..4f003df 100644 --- a/tests/Wmakefile +++ b/tests/Wmakefile @@ -1,341 +1,341 @@ -# Watcom makefile for the pthreads test suite.
 -# If all of the .pass files can be created, the test suite has passed.
 -#
 -# --------------------------------------------------------------------------
 -#
 -#      Pthreads-win32 - POSIX Threads Library for Win32
 -#      Copyright(C) 1998 John E. Bossom
 -#      Copyright(C) 1999,2005 Pthreads-win32 contributors
 -# 
 -#      Contact Email: rpj@callisto.canberra.edu.au
 -# 
 -#      The current list of contributors is contained
 -#      in the file CONTRIBUTORS included with the source
 -#      code distribution. The list can also be seen at the
 -#     following World Wide Web location:
 -#      http://sources.redhat.com/pthreads-win32/contributors.html
 -# 
 -#      This library is free software; you can redistribute it and/or
 -#      modify it under the terms of the GNU Lesser General Public
 -#      License as published by the Free Software Foundation; either
 -#      version 2 of the License, or (at your option) any later version.
 -# 
 -#      This library is distributed in the hope that it will be useful,
 -#      but WITHOUT ANY WARRANTY; without even the implied warranty of
 -#      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 -#      Lesser General Public License for more details.
 -# 
 -#      You should have received a copy of the GNU Lesser General Public
 -#      License along with this library in the file COPYING.LIB;
 -#      if not, write to the Free Software Foundation, Inc.,
 -#      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 -#
 -
 -
 -DLL_VER	= 2
 -
 -.EXTENSIONS:
 -
 -.EXTENSIONS: .pass .exe .obj .i .c
 -
 -CP	= copy
 -RM	= erase
 -CAT	= type
 -MKDIR	= mkdir
 -TOUCH	= echo Passed >
 -ECHO	= @echo
 -
 -CPHDR	= pthread.h semaphore.h sched.h
 -
 -OPTIM	= -od
 -
 -XXLIBS	=
 -
 -# C++ Exceptions
 -WCEFLAGS	= -xs -dPtW32NoCatchWarn -d__CLEANUP_CXX
 -WCELIB	= pthreadWCE$(DLL_VER).lib
 -WCEDLL	= pthreadWCE$(DLL_VER).dll
 -# C cleanup code
 -WCFLAGS	= -d__CLEANUP_C
 -WCLIB	= pthreadWC$(DLL_VER).lib
 -WCDLL	= pthreadWC$(DLL_VER).dll
 -# C++ Exceptions in application - using WC version of pthreads dll
 -WCXFLAGS	= -xs -d__CLEANUP_C
 -
 -CFLAGS= -w4 -e25 -d_WIN32_WINNT=0x400 -d_REENTRANT -zq -bm $(OPTIM) -5r -bt=nt -mf -d2
 -
 -LFLAGS= 
 -INCLUDES= -i=.
 -BUILD_DIR=..
 -
 -COPYFILES	= $(CPHDR) $(CPLIB) $(CPDLL)
 -
 -TEST		=
 -EHFLAGS	=
 -
 -# If a test case returns a non-zero exit code to the shell, make will
 -# stop.
 -
 -PASSES	= sizes.pass  loadfree.pass &
 -	  self1.pass  mutex5.pass  &
 -	  mutex1.pass  mutex1n.pass  mutex1e.pass  mutex1r.pass &
 -	  semaphore1.pass  semaphore2.pass semaphore3.pass &
 -	  mutex2.pass  mutex3.pass  &
 -	  mutex2r.pass  mutex2e.pass  mutex3r.pass  mutex3e.pass  &
 -	  condvar1.pass  condvar1_1.pass  condvar1_2.pass  condvar2.pass  condvar2_1.pass  &
 -	  exit1.pass  create1.pass  create2.pass  reuse1.pass  reuse2.pass  equal1.pass  &
 -	  kill1.pass  valid1.pass  valid2.pass  &
 -	  exit2.pass  exit3.pass  exit4  exit5  &
 -	  join0.pass  join1.pass  join2.pass join3.pass  &
 -	  mutex4.pass  mutex6.pass  mutex6n.pass  mutex6e.pass  mutex6r.pass  &
 -	  mutex6s.pass  mutex6es.pass  mutex6rs.pass  &
 -	  mutex7.pass  mutex7n.pass  mutex7e.pass  mutex7r.pass  &
 -	  mutex8.pass  mutex8n.pass  mutex8e.pass  mutex8r.pass  &
 -	  count1.pass  once1.pass  once2.pass  once3.pass  once4.pass  tsd1.pass  &
 -	  self2.pass  &
 -	  cancel1.pass  cancel2.pass  &
 -	  semaphore4.pass semaphore4t.pass  &
 -	  delay1.pass  delay2.pass  eyal1.pass  &
 -	  condvar3.pass  condvar3_1.pass  condvar3_2.pass  condvar3_3.pass  &
 -	  condvar4.pass  condvar5.pass  condvar6.pass  &
 -	  condvar7.pass  condvar8.pass  condvar9.pass  &
 -	  errno1.pass  &
 -	  rwlock1.pass  rwlock2.pass  rwlock3.pass  rwlock4.pass  rwlock5.pass  &
 -	  rwlock6.pass  rwlock7.pass  rwlock8.pass  &
 -	  rwlock2_t.pass  rwlock3_t.pass  rwlock4_t.pass  rwlock5_t.pass  rwlock6_t.pass  rwlock6_t2.pass  &
 -	  context1.pass  &
 -	  cancel3.pass  cancel4.pass  cancel5.pass  cancel6a.pass  cancel6d.pass  &
 -	  cancel7  cancel8  &
 -	  cleanup0.pass  cleanup1.pass  cleanup2.pass  cleanup3.pass  &
 -	  priority1.pass priority2.pass inherit1.pass  &
 -	  spin1.pass  spin2.pass  spin3.pass  spin4.pass  &
 -	  barrier1.pass  barrier2.pass  barrier3.pass  barrier4.pass  barrier5.pass  &
 -	  exception1.pass  exception2.pass  exception3.pass  &
 -	  cancel9.pass
 -
 -BENCHRESULTS = &
 -	  benchtest1.bench benchtest2.bench benchtest3.bench benchtest4.bench benchtest5.bench
 -
 -help: .SYMBOLIC
 -	@ $(ECHO) Run one of the following command lines:
 -	@ $(ECHO) wmake /f Wmakefile clean WC    (to test using WC dll with wcc386 (no EH) applications)
 -	@ $(ECHO) wmake /f Wmakefile clean WCX   (to test using WC dll with wpp386 (EH) applications)
 -	@ $(ECHO) wmake /f Wmakefile clean WCE   (to test using the WCE dll with wpp386 EH applications)
 -	@ $(ECHO) wmake /f Wmakefile clean WC-bench    (to benchtest using WC dll with C bench app)
 -	@ $(ECHO) wmake /f Wmakefile clean WCX-bench   (to benchtest using WC dll with C++ bench app)
 -	@ $(ECHO) wmake /f Wmakefile clean WCE-bench   (to benchtest using WCE dll with C++ bench app)
 -
 -all: .SYMBOLIC
 -	@ wmake /f Wmakefile clean WC
 -	@ wmake /f Wmakefile clean WCX
 -	@ wmake /f Wmakefile clean WCE
 -	@ wmake /f Wmakefile clean WSE
 -	@ wmake /f Wmakefile clean WC-bench
 -
 -tests: $(CPLIB) $(CPDLL) $(CPHDR) $(PASSES) .SYMBOLIC
 -	@ $(ECHO) ALL TESTS PASSED! Congratulations!
 -
 -benchtests: $(CPLIB) $(CPDLL) $(CPHDR) $(XXLIBS) $(BENCHRESULTS) .SYMBOLIC
 -	@ $(ECHO) ALL BENCH TESTS DONE.
 -
 -$(BENCHRESULTS): ($[*).exe
 -	@ $(ECHO) ... Running $(TEST) benchtest: ($[*).exe
 -	@ .\($[*).exe
 -	@ $(ECHO) ...... Done
 -	@ $(TOUCH) ($[*).bench
 -
 -WCE: .SYMBOLIC
 -	@ wmake /f Wmakefile CC=wpp386 TEST="$@" CPLIB="$(WCELIB)" CPDLL="$(WCEDLL)" EHFLAGS="$(WCEFLAGS)" tests
 -
 -WC: .SYMBOLIC
 -	@ wmake /f Wmakefile CC=wcc386 TEST="$@" CPLIB="$(WCLIB)" CPDLL="$(WCDLL)" EHFLAGS="$(WCFLAGS)" tests
 -
 -WCX: .SYMBOLIC
 -	@ wmake /f Wmakefile CC=wpp386 TEST="$@" CPLIB="$(WCLIB)" CPDLL="$(WCDLL)" EHFLAGS="$(WCXFLAGS)" tests
 -
 -WCE-bench: .SYMBOLIC
 -	@ wmake /f Wmakefile CC=wpp386 TEST="$@" CPLIB="$(WCELIB)" CPDLL="$(WCEDLL)" EHFLAGS="$(WCEFLAGS)" XXLIBS="benchlib.o" benchtests
 -
 -WC-bench: .SYMBOLIC
 -	@ wmake /f Wmakefile CC=wcc386 TEST="$@" CPLIB="$(WCLIB)" CPDLL="$(WCDLL)" EHFLAGS="$(WCFLAGS)" XXLIBS="benchlib.o" benchtests
 -
 -WCX-bench: .SYMBOLIC
 -	@ wmake /f Wmakefile CC=wpp386 TEST="$@" CPLIB="$(WCLIB)" CPDLL="$(WCDLL)" EHFLAGS="$(WCXFLAGS)" XXLIBS="benchlib.o" benchtests
 -
 -sizes.pass: sizes.exe
 -	@ $(ECHO) ... Running $(TEST) test: $^*
 -	@ $[@ > SIZES.$(TEST)
 -	@ $(CAT) SIZES.$(TEST)
 -	@ $(ECHO) ...... Passed
 -	@ $(TOUCH) $^@
 -
 -.exe.pass:
 -	@ $(ECHO) ... Running $(TEST) test: $^*
 -	@ $[@
 -	@ $(ECHO) ...... Passed
 -	@ $(TOUCH) $^@
 -
 -.obj.exe:
 -	@ $(ECHO) wlink NAME $^@ FILE $[@ LIBRARY $(CPLIB) OPTION quiet
 -	@ wlink NAME $^@ FILE $[@ LIBRARY $(CPLIB) OPTION quiet
 -
 -.c.obj:
 -	@ $(ECHO) $(CC) $^* $(EHFLAGS) $(CFLAGS) $(INCLUDES)
 -	@ $(CC) $^* $(EHFLAGS) $(CFLAGS) $(INCLUDES)
 -
 -.c.i:
 -	@ $(CC) /P $(EHFLAGS) $(CFLAGS) $(INCLUDES) $<
 -
 -$(COPYFILES): .SYMBOLIC
 -	@ $(ECHO) Copying $@
 -	@ $(CP) $(BUILD_DIR)\$@ .
 -
 -pthread.dll:
 -	@ $(CP) $(CPDLL) $*.dll
 -	@ $(CP) $(CPLIB) $*.lib
 -
 -clean: .SYMBOLIC
 -	@ if exist *.dll $(RM) *.dll
 -	@ if exist *.lib $(RM) *.lib
 -	@ if exist *.err $(RM) *.err
 -	@ if exist pthread.h $(RM) pthread.h
 -	@ if exist semaphore.h $(RM) semaphore.h
 -	@ if exist sched.h $(RM) sched.h
 -	@ if exist *.e $(RM) *.e
 -	@ if exist *.i $(RM) *.i
 -	@ if exist *.obj $(RM) *.obj
 -	@ if exist *.pdb $(RM) *.pdb
 -	@ if exist *.o $(RM) *.o
 -	@ if exist *.asm $(RM) *.asm
 -	@ if exist *.exe $(RM) *.exe
 -	@ if exist *.pass $(RM) *.pass
 -	@ if exist *.bench $(RM) *.bench
 -	@ if exist *.log $(RM) *.log
 -	@ $(ECHO) Clean completed.
 -
 -benchtest1.bench:
 -benchtest2.bench:
 -benchtest3.bench:
 -benchtest4.bench:
 -benchtest5.bench:
 -barrier1.pass:
 -barrier2.pass: barrier1.pass
 -barrier3.pass: barrier2.pass
 -barrier4.pass: barrier3.pass
 -barrier5.pass: barrier4.pass
 -cancel1.pass: create1.pass
 -cancel2.pass: cancel1.pass
 -cancel3.pass: context1.pass
 -cancel4.pass: cancel3.pass
 -cancel5.pass: cancel3.pass
 -cancel6a.pass: cancel3.pass
 -cancel6d.pass: cancel3.pass
 -cancel7.pass: kill1.pass
 -cancel8.pass: cancel7.pass
 -cleanup0.pass: cancel5.pass
 -cleanup1.pass: cleanup0.pass
 -cleanup2.pass: cleanup1.pass
 -cleanup3.pass: cleanup2.pass
 -condvar1.pass:
 -condvar1_1.pass: condvar1.pass
 -condvar1_2.pass: join2.pass
 -condvar2.pass: condvar1.pass
 -condvar2_1.pass: condvar2.pass join2.pass
 -condvar3.pass: create1.pass condvar2.pass
 -condvar3_1.pass: condvar3.pass join2.pass
 -condvar3_2.pass: condvar3_1.pass
 -condvar3_3.pass: condvar3_2.pass
 -condvar4.pass: create1.pass
 -condvar5.pass: condvar4.pass
 -condvar6.pass: condvar5.pass
 -condvar7.pass: condvar6.pass cleanup1.pass
 -condvar8.pass: condvar7.pass
 -condvar9.pass: condvar8.pass
 -context1.pass: cancel2.pass
 -count1.pass: join1.pass
 -create1.pass: mutex2.pass
 -create2.pass: create1.pass
 -delay1.pass:
 -delay2.pass: delay1.pass
 -equal1.pass: create1.pass
 -errno1.pass: mutex3.pass
 -exception1.pass: cancel4.pass
 -exception2.pass: exception1.pass
 -exception3.pass: exception2.pass
 -exit1.pass:
 -exit2.pass: create1.pass
 -exit3.pass: create1.pass
 -exit4.pass:
 -exit5.pass: kill1.pass
 -eyal1.pass: tsd1.pass
 -inherit1.pass: join1.pass priority1.pass
 -join0.pass: create1.pass
 -join1.pass: create1.pass
 -join2.pass: create1.pass
 -join3.pass: join2.pass
 -kill1.pass: 
 -loadfree.pass: pthread.dll
 -mutex1.pass: self1.pass
 -mutex1n.pass: mutex1.pass
 -mutex1e.pass: mutex1.pass
 -mutex1r.pass: mutex1.pass
 -mutex2.pass: mutex1.pass
 -mutex2r.pass: mutex2.pass
 -mutex2e.pass: mutex2.pass
 -mutex3.pass: create1.pass
 -mutex3r.pass: mutex3.pass
 -mutex3e.pass: mutex3.pass
 -mutex4.pass: mutex3.pass
 -mutex5.pass:
 -mutex6.pass: mutex4.pass
 -mutex6n.pass: mutex4.pass
 -mutex6e.pass: mutex4.pass
 -mutex6r.pass: mutex4.pass
 -mutex6s.pass: mutex6.pass
 -mutex6rs.pass: mutex6r.pass
 -mutex6es.pass: mutex6e.pass
 -mutex7.pass: mutex6.pass
 -mutex7n.pass: mutex6n.pass
 -mutex7e.pass: mutex6e.pass
 -mutex7r.pass: mutex6r.pass
 -mutex8.pass: mutex7.pass
 -mutex8n.pass: mutex7n.pass
 -mutex8e.pass: mutex7e.pass
 -mutex8r.pass: mutex7r.pass
 -once1.pass: create1.pass
 -once2.pass: once1.pass
 -once3.pass: once2.pass
 -once4.pass: once3.pass
 -priority1.pass: join1.pass
 -priority2.pass: priority1.pass barrier3.pass
 -reuse1.pass: create2.pass
 -reuse2.pass: reuse1.pass
 -rwlock1.pass: condvar6.pass
 -rwlock2.pass: rwlock1.pass
 -rwlock3.pass: rwlock2.pass
 -rwlock4.pass: rwlock3.pass
 -rwlock5.pass: rwlock4.pass
 -rwlock6.pass: rwlock5.pass
 -rwlock7.pass: rwlock6.pass
 -rwlock2_t.pass: rwlock2.pass
 -rwlock3_t.pass: rwlock2_t.pass
 -rwlock4_t.pass: rwlock3_t.pass
 -rwlock5_t.pass: rwlock4_t.pass
 -rwlock6_t.pass: rwlock5_t.pass
 -rwlock6_t2.pass: rwlock6_t.pass
 -self1.pass:
 -self2.pass: create1.pass
 -semaphore1.pass:
 -semaphore2.pass:
 -semaphore3.pass: semaphore2.pass
 -semaphore4.pass: semaphore3.pass cancel1.pass
 -semaphore4t.pass: semaphore4.pass
 -sizes.pass:
 -spin1.pass:
 -spin2.pass: spin1.pass
 -spin3.pass: spin2.pass
 -spin4.pass: spin3.pass
 -tsd1.pass: join1.pass
 -valid1.pass: join1.pass
 -valid2.pass: valid1.pass
 -cancel9.pass: cancel8.pass
 +# Watcom makefile for the pthreads test suite. +# If all of the .pass files can be created, the test suite has passed. +# +# -------------------------------------------------------------------------- +# +#      Pthreads-win32 - POSIX Threads Library for Win32 +#      Copyright(C) 1998 John E. Bossom +#      Copyright(C) 1999,2005 Pthreads-win32 contributors +#  +#      Contact Email: rpj@callisto.canberra.edu.au +#  +#      The current list of contributors is contained +#      in the file CONTRIBUTORS included with the source +#      code distribution. The list can also be seen at the +#     following World Wide Web location: +#      http://sources.redhat.com/pthreads-win32/contributors.html +#  +#      This library is free software; you can redistribute it and/or +#      modify it under the terms of the GNU Lesser General Public +#      License as published by the Free Software Foundation; either +#      version 2 of the License, or (at your option) any later version. +#  +#      This library is distributed in the hope that it will be useful, +#      but WITHOUT ANY WARRANTY; without even the implied warranty of +#      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +#      Lesser General Public License for more details. +#  +#      You should have received a copy of the GNU Lesser General Public +#      License along with this library in the file COPYING.LIB; +#      if not, write to the Free Software Foundation, Inc., +#      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +# + + +DLL_VER	= 2 + +.EXTENSIONS: + +.EXTENSIONS: .pass .exe .obj .i .c + +CP	= copy +RM	= erase +CAT	= type +MKDIR	= mkdir +TOUCH	= echo Passed > +ECHO	= @echo + +CPHDR	= pthread.h semaphore.h sched.h + +OPTIM	= -od + +XXLIBS	= + +# C++ Exceptions +WCEFLAGS	= -xs -dPtW32NoCatchWarn -d__CLEANUP_CXX +WCELIB	= pthreadWCE$(DLL_VER).lib +WCEDLL	= pthreadWCE$(DLL_VER).dll +# C cleanup code +WCFLAGS	= -d__CLEANUP_C +WCLIB	= pthreadWC$(DLL_VER).lib +WCDLL	= pthreadWC$(DLL_VER).dll +# C++ Exceptions in application - using WC version of pthreads dll +WCXFLAGS	= -xs -d__CLEANUP_C + +CFLAGS= -w4 -e25 -d_WIN32_WINNT=0x400 -d_REENTRANT -zq -bm $(OPTIM) -5r -bt=nt -mf -d2 + +LFLAGS=  +INCLUDES= -i=. +BUILD_DIR=.. + +COPYFILES	= $(CPHDR) $(CPLIB) $(CPDLL) + +TEST		= +EHFLAGS	= + +# If a test case returns a non-zero exit code to the shell, make will +# stop. + +PASSES	= sizes.pass  loadfree.pass & +	  self1.pass  mutex5.pass  & +	  mutex1.pass  mutex1n.pass  mutex1e.pass  mutex1r.pass & +	  semaphore1.pass  semaphore2.pass semaphore3.pass & +	  mutex2.pass  mutex3.pass  & +	  mutex2r.pass  mutex2e.pass  mutex3r.pass  mutex3e.pass  & +	  condvar1.pass  condvar1_1.pass  condvar1_2.pass  condvar2.pass  condvar2_1.pass  & +	  exit1.pass  create1.pass  create2.pass  reuse1.pass  reuse2.pass  equal1.pass  & +	  kill1.pass  valid1.pass  valid2.pass  & +	  exit2.pass  exit3.pass  exit4  exit5  & +	  join0.pass  join1.pass  join2.pass join3.pass  & +	  mutex4.pass  mutex6.pass  mutex6n.pass  mutex6e.pass  mutex6r.pass  & +	  mutex6s.pass  mutex6es.pass  mutex6rs.pass  & +	  mutex7.pass  mutex7n.pass  mutex7e.pass  mutex7r.pass  & +	  mutex8.pass  mutex8n.pass  mutex8e.pass  mutex8r.pass  & +	  count1.pass  once1.pass  once2.pass  once3.pass  once4.pass  tsd1.pass  & +	  self2.pass  & +	  cancel1.pass  cancel2.pass  & +	  semaphore4.pass semaphore4t.pass  & +	  delay1.pass  delay2.pass  eyal1.pass  & +	  condvar3.pass  condvar3_1.pass  condvar3_2.pass  condvar3_3.pass  & +	  condvar4.pass  condvar5.pass  condvar6.pass  & +	  condvar7.pass  condvar8.pass  condvar9.pass  & +	  errno1.pass  & +	  rwlock1.pass  rwlock2.pass  rwlock3.pass  rwlock4.pass  rwlock5.pass  & +	  rwlock6.pass  rwlock7.pass  rwlock8.pass  & +	  rwlock2_t.pass  rwlock3_t.pass  rwlock4_t.pass  rwlock5_t.pass  rwlock6_t.pass  rwlock6_t2.pass  & +	  context1.pass  & +	  cancel3.pass  cancel4.pass  cancel5.pass  cancel6a.pass  cancel6d.pass  & +	  cancel7  cancel8  & +	  cleanup0.pass  cleanup1.pass  cleanup2.pass  cleanup3.pass  & +	  priority1.pass priority2.pass inherit1.pass  & +	  spin1.pass  spin2.pass  spin3.pass  spin4.pass  & +	  barrier1.pass  barrier2.pass  barrier3.pass  barrier4.pass  barrier5.pass  & +	  exception1.pass  exception2.pass  exception3.pass  & +	  cancel9.pass + +BENCHRESULTS = & +	  benchtest1.bench benchtest2.bench benchtest3.bench benchtest4.bench benchtest5.bench + +help: .SYMBOLIC +	@ $(ECHO) Run one of the following command lines: +	@ $(ECHO) wmake /f Wmakefile clean WC    (to test using WC dll with wcc386 (no EH) applications) +	@ $(ECHO) wmake /f Wmakefile clean WCX   (to test using WC dll with wpp386 (EH) applications) +	@ $(ECHO) wmake /f Wmakefile clean WCE   (to test using the WCE dll with wpp386 EH applications) +	@ $(ECHO) wmake /f Wmakefile clean WC-bench    (to benchtest using WC dll with C bench app) +	@ $(ECHO) wmake /f Wmakefile clean WCX-bench   (to benchtest using WC dll with C++ bench app) +	@ $(ECHO) wmake /f Wmakefile clean WCE-bench   (to benchtest using WCE dll with C++ bench app) + +all: .SYMBOLIC +	@ wmake /f Wmakefile clean WC +	@ wmake /f Wmakefile clean WCX +	@ wmake /f Wmakefile clean WCE +	@ wmake /f Wmakefile clean WSE +	@ wmake /f Wmakefile clean WC-bench + +tests: $(CPLIB) $(CPDLL) $(CPHDR) $(PASSES) .SYMBOLIC +	@ $(ECHO) ALL TESTS PASSED! Congratulations! + +benchtests: $(CPLIB) $(CPDLL) $(CPHDR) $(XXLIBS) $(BENCHRESULTS) .SYMBOLIC +	@ $(ECHO) ALL BENCH TESTS DONE. + +$(BENCHRESULTS): ($[*).exe +	@ $(ECHO) ... Running $(TEST) benchtest: ($[*).exe +	@ .\($[*).exe +	@ $(ECHO) ...... Done +	@ $(TOUCH) ($[*).bench + +WCE: .SYMBOLIC +	@ wmake /f Wmakefile CC=wpp386 TEST="$@" CPLIB="$(WCELIB)" CPDLL="$(WCEDLL)" EHFLAGS="$(WCEFLAGS)" tests + +WC: .SYMBOLIC +	@ wmake /f Wmakefile CC=wcc386 TEST="$@" CPLIB="$(WCLIB)" CPDLL="$(WCDLL)" EHFLAGS="$(WCFLAGS)" tests + +WCX: .SYMBOLIC +	@ wmake /f Wmakefile CC=wpp386 TEST="$@" CPLIB="$(WCLIB)" CPDLL="$(WCDLL)" EHFLAGS="$(WCXFLAGS)" tests + +WCE-bench: .SYMBOLIC +	@ wmake /f Wmakefile CC=wpp386 TEST="$@" CPLIB="$(WCELIB)" CPDLL="$(WCEDLL)" EHFLAGS="$(WCEFLAGS)" XXLIBS="benchlib.o" benchtests + +WC-bench: .SYMBOLIC +	@ wmake /f Wmakefile CC=wcc386 TEST="$@" CPLIB="$(WCLIB)" CPDLL="$(WCDLL)" EHFLAGS="$(WCFLAGS)" XXLIBS="benchlib.o" benchtests + +WCX-bench: .SYMBOLIC +	@ wmake /f Wmakefile CC=wpp386 TEST="$@" CPLIB="$(WCLIB)" CPDLL="$(WCDLL)" EHFLAGS="$(WCXFLAGS)" XXLIBS="benchlib.o" benchtests + +sizes.pass: sizes.exe +	@ $(ECHO) ... Running $(TEST) test: $^* +	@ $[@ > SIZES.$(TEST) +	@ $(CAT) SIZES.$(TEST) +	@ $(ECHO) ...... Passed +	@ $(TOUCH) $^@ + +.exe.pass: +	@ $(ECHO) ... Running $(TEST) test: $^* +	@ $[@ +	@ $(ECHO) ...... Passed +	@ $(TOUCH) $^@ + +.obj.exe: +	@ $(ECHO) wlink NAME $^@ FILE $[@ LIBRARY $(CPLIB) OPTION quiet +	@ wlink NAME $^@ FILE $[@ LIBRARY $(CPLIB) OPTION quiet + +.c.obj: +	@ $(ECHO) $(CC) $^* $(EHFLAGS) $(CFLAGS) $(INCLUDES) +	@ $(CC) $^* $(EHFLAGS) $(CFLAGS) $(INCLUDES) + +.c.i: +	@ $(CC) /P $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< + +$(COPYFILES): .SYMBOLIC +	@ $(ECHO) Copying $@ +	@ $(CP) $(BUILD_DIR)\$@ . + +pthread.dll: +	@ $(CP) $(CPDLL) $*.dll +	@ $(CP) $(CPLIB) $*.lib + +clean: .SYMBOLIC +	@ if exist *.dll $(RM) *.dll +	@ if exist *.lib $(RM) *.lib +	@ if exist *.err $(RM) *.err +	@ if exist pthread.h $(RM) pthread.h +	@ if exist semaphore.h $(RM) semaphore.h +	@ if exist sched.h $(RM) sched.h +	@ if exist *.e $(RM) *.e +	@ if exist *.i $(RM) *.i +	@ if exist *.obj $(RM) *.obj +	@ if exist *.pdb $(RM) *.pdb +	@ if exist *.o $(RM) *.o +	@ if exist *.asm $(RM) *.asm +	@ if exist *.exe $(RM) *.exe +	@ if exist *.pass $(RM) *.pass +	@ if exist *.bench $(RM) *.bench +	@ if exist *.log $(RM) *.log +	@ $(ECHO) Clean completed. + +benchtest1.bench: +benchtest2.bench: +benchtest3.bench: +benchtest4.bench: +benchtest5.bench: +barrier1.pass: +barrier2.pass: barrier1.pass +barrier3.pass: barrier2.pass +barrier4.pass: barrier3.pass +barrier5.pass: barrier4.pass +cancel1.pass: create1.pass +cancel2.pass: cancel1.pass +cancel3.pass: context1.pass +cancel4.pass: cancel3.pass +cancel5.pass: cancel3.pass +cancel6a.pass: cancel3.pass +cancel6d.pass: cancel3.pass +cancel7.pass: kill1.pass +cancel8.pass: cancel7.pass +cleanup0.pass: cancel5.pass +cleanup1.pass: cleanup0.pass +cleanup2.pass: cleanup1.pass +cleanup3.pass: cleanup2.pass +condvar1.pass: +condvar1_1.pass: condvar1.pass +condvar1_2.pass: join2.pass +condvar2.pass: condvar1.pass +condvar2_1.pass: condvar2.pass join2.pass +condvar3.pass: create1.pass condvar2.pass +condvar3_1.pass: condvar3.pass join2.pass +condvar3_2.pass: condvar3_1.pass +condvar3_3.pass: condvar3_2.pass +condvar4.pass: create1.pass +condvar5.pass: condvar4.pass +condvar6.pass: condvar5.pass +condvar7.pass: condvar6.pass cleanup1.pass +condvar8.pass: condvar7.pass +condvar9.pass: condvar8.pass +context1.pass: cancel2.pass +count1.pass: join1.pass +create1.pass: mutex2.pass +create2.pass: create1.pass +delay1.pass: +delay2.pass: delay1.pass +equal1.pass: create1.pass +errno1.pass: mutex3.pass +exception1.pass: cancel4.pass +exception2.pass: exception1.pass +exception3.pass: exception2.pass +exit1.pass: +exit2.pass: create1.pass +exit3.pass: create1.pass +exit4.pass: +exit5.pass: kill1.pass +eyal1.pass: tsd1.pass +inherit1.pass: join1.pass priority1.pass +join0.pass: create1.pass +join1.pass: create1.pass +join2.pass: create1.pass +join3.pass: join2.pass +kill1.pass:  +loadfree.pass: pthread.dll +mutex1.pass: self1.pass +mutex1n.pass: mutex1.pass +mutex1e.pass: mutex1.pass +mutex1r.pass: mutex1.pass +mutex2.pass: mutex1.pass +mutex2r.pass: mutex2.pass +mutex2e.pass: mutex2.pass +mutex3.pass: create1.pass +mutex3r.pass: mutex3.pass +mutex3e.pass: mutex3.pass +mutex4.pass: mutex3.pass +mutex5.pass: +mutex6.pass: mutex4.pass +mutex6n.pass: mutex4.pass +mutex6e.pass: mutex4.pass +mutex6r.pass: mutex4.pass +mutex6s.pass: mutex6.pass +mutex6rs.pass: mutex6r.pass +mutex6es.pass: mutex6e.pass +mutex7.pass: mutex6.pass +mutex7n.pass: mutex6n.pass +mutex7e.pass: mutex6e.pass +mutex7r.pass: mutex6r.pass +mutex8.pass: mutex7.pass +mutex8n.pass: mutex7n.pass +mutex8e.pass: mutex7e.pass +mutex8r.pass: mutex7r.pass +once1.pass: create1.pass +once2.pass: once1.pass +once3.pass: once2.pass +once4.pass: once3.pass +priority1.pass: join1.pass +priority2.pass: priority1.pass barrier3.pass +reuse1.pass: create2.pass +reuse2.pass: reuse1.pass +rwlock1.pass: condvar6.pass +rwlock2.pass: rwlock1.pass +rwlock3.pass: rwlock2.pass +rwlock4.pass: rwlock3.pass +rwlock5.pass: rwlock4.pass +rwlock6.pass: rwlock5.pass +rwlock7.pass: rwlock6.pass +rwlock2_t.pass: rwlock2.pass +rwlock3_t.pass: rwlock2_t.pass +rwlock4_t.pass: rwlock3_t.pass +rwlock5_t.pass: rwlock4_t.pass +rwlock6_t.pass: rwlock5_t.pass +rwlock6_t2.pass: rwlock6_t.pass +self1.pass: +self2.pass: create1.pass +semaphore1.pass: +semaphore2.pass: +semaphore3.pass: semaphore2.pass +semaphore4.pass: semaphore3.pass cancel1.pass +semaphore4t.pass: semaphore4.pass +sizes.pass: +spin1.pass: +spin2.pass: spin1.pass +spin3.pass: spin2.pass +spin4.pass: spin3.pass +tsd1.pass: join1.pass +valid1.pass: join1.pass +valid2.pass: valid1.pass +cancel9.pass: cancel8.pass diff --git a/tests/benchtest1.c b/tests/benchtest1.c index da0380e..116dad0 100644 --- a/tests/benchtest1.c +++ b/tests/benchtest1.c @@ -1,249 +1,249 @@ -/*
 - * benchtest1.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Measure time taken to complete an elementary operation.
 - *
 - * - Mutex
 - *   Single thread iteration over lock/unlock for each mutex type.
 - */
 -
 -#include "test.h"
 -#include <sys/timeb.h>
 -
 -#ifdef __GNUC__
 -#include <stdlib.h>
 -#endif
 -
 -#include "benchtest.h"
 -
 -#define PTW32_MUTEX_TYPES
 -#define ITERATIONS      10000000L
 -
 -pthread_mutex_t mx;
 -pthread_mutexattr_t ma;
 -struct _timeb currSysTimeStart;
 -struct _timeb currSysTimeStop;
 -long durationMilliSecs;
 -long overHeadMilliSecs = 0;
 -int one = 1;
 -int zero = 0;
 -
 -#define GetDurationMilliSecs(_TStart, _TStop) ((_TStop.time*1000+_TStop.millitm) \
 -                                               - (_TStart.time*1000+_TStart.millitm))
 -
 -/*
 - * Dummy use of j, otherwise the loop may be removed by the optimiser
 - * when doing the overhead timing with an empty loop.
 - */
 -#define TESTSTART \
 -  { int i, j = 0, k = 0; _ftime(&currSysTimeStart); for (i = 0; i < ITERATIONS; i++) { j++;
 -
 -#define TESTSTOP \
 -  }; _ftime(&currSysTimeStop); if (j + k == i) j++; }
 -
 -
 -void
 -runTest (char * testNameString, int mType)
 -{
 -#ifdef PTW32_MUTEX_TYPES
 -  assert(pthread_mutexattr_settype(&ma, mType) == 0);
 -#endif
 -  assert(pthread_mutex_init(&mx, &ma) == 0);
 -
 -  TESTSTART
 -  assert(pthread_mutex_lock(&mx) == zero);
 -  assert(pthread_mutex_unlock(&mx) == zero);
 -  TESTSTOP
 -
 -  assert(pthread_mutex_destroy(&mx) == 0);
 -
 -  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs;
 -
 -  printf( "%-45s %15ld %15.3f\n",
 -	    testNameString,
 -          durationMilliSecs,
 -          (float) durationMilliSecs * 1E3 / ITERATIONS);
 -}
 -
 -
 -int
 -main (int argc, char *argv[])
 -{
 -  int i = 0;
 -  CRITICAL_SECTION cs;
 -  old_mutex_t ox;
 -  pthread_mutexattr_init(&ma);
 -
 -  printf( "=============================================================================\n");
 -  printf( "\nLock plus unlock on an unlocked mutex.\n%ld iterations\n\n",
 -          ITERATIONS);
 -  printf( "%-45s %15s %15s\n",
 -	    "Test",
 -	    "Total(msec)",
 -	    "average(usec)");
 -  printf( "-----------------------------------------------------------------------------\n");
 -
 -  /*
 -   * Time the loop overhead so we can subtract it from the actual test times.
 -   */
 -
 -  TESTSTART
 -  assert(1 == one);
 -  assert(1 == one);
 -  TESTSTOP
 -
 -  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs;
 -  overHeadMilliSecs = durationMilliSecs;
 -
 -
 -  TESTSTART
 -  assert((dummy_call(&i), 1) == one);
 -  assert((dummy_call(&i), 1) == one);
 -  TESTSTOP
 -
 -  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs;
 -
 -  printf( "%-45s %15ld %15.3f\n",
 -	    "Dummy call x 2",
 -          durationMilliSecs,
 -          (float) durationMilliSecs * 1E3 / ITERATIONS);
 -
 -
 -  TESTSTART
 -  assert((interlocked_inc_with_conditionals(&i), 1) == one);
 -  assert((interlocked_dec_with_conditionals(&i), 1) == one);
 -  TESTSTOP
 -
 -  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs;
 -
 -  printf( "%-45s %15ld %15.3f\n",
 -	    "Dummy call -> Interlocked with cond x 2",
 -          durationMilliSecs,
 -          (float) durationMilliSecs * 1E3 / ITERATIONS);
 -
 -
 -  TESTSTART
 -  assert((InterlockedIncrement((LPLONG)&i), 1) == (LONG)one);
 -  assert((InterlockedDecrement((LPLONG)&i), 1) == (LONG)one);
 -  TESTSTOP
 -
 -  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs;
 -
 -  printf( "%-45s %15ld %15.3f\n",
 -	    "InterlockedOp x 2",
 -          durationMilliSecs,
 -          (float) durationMilliSecs * 1E3 / ITERATIONS);
 -
 -
 -  InitializeCriticalSection(&cs);
 -
 -  TESTSTART
 -  assert((EnterCriticalSection(&cs), 1) == one);
 -  assert((LeaveCriticalSection(&cs), 1) == one);
 -  TESTSTOP
 -
 -  DeleteCriticalSection(&cs);
 -
 -  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs;
 -
 -  printf( "%-45s %15ld %15.3f\n",
 -	    "Simple Critical Section",
 -          durationMilliSecs,
 -          (float) durationMilliSecs * 1E3 / ITERATIONS);
 -
 -
 -  old_mutex_use = OLD_WIN32CS;
 -  assert(old_mutex_init(&ox, NULL) == 0);
 -
 -  TESTSTART
 -  assert(old_mutex_lock(&ox) == zero);
 -  assert(old_mutex_unlock(&ox) == zero);
 -  TESTSTOP
 -
 -  assert(old_mutex_destroy(&ox) == 0);
 -
 -  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs;
 -
 -  printf( "%-45s %15ld %15.3f\n",
 -	    "Old PT Mutex using a Critical Section (WNT)",
 -          durationMilliSecs,
 -          (float) durationMilliSecs * 1E3 / ITERATIONS);
 -
 -
 -  old_mutex_use = OLD_WIN32MUTEX;
 -  assert(old_mutex_init(&ox, NULL) == 0);
 -
 -  TESTSTART
 -  assert(old_mutex_lock(&ox) == zero);
 -  assert(old_mutex_unlock(&ox) == zero);
 -  TESTSTOP
 -
 -  assert(old_mutex_destroy(&ox) == 0);
 -
 -  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs;
 -
 -  printf( "%-45s %15ld %15.3f\n",
 -	    "Old PT Mutex using a Win32 Mutex (W9x)",
 -          durationMilliSecs,
 -          (float) durationMilliSecs * 1E3 / ITERATIONS);
 -
 -  printf( ".............................................................................\n");
 -
 -  /*
 -   * Now we can start the actual tests
 -   */
 -#ifdef PTW32_MUTEX_TYPES
 -  runTest("PTHREAD_MUTEX_DEFAULT (W9x,WNT)", PTHREAD_MUTEX_DEFAULT);
 -
 -  runTest("PTHREAD_MUTEX_NORMAL (W9x,WNT)", PTHREAD_MUTEX_NORMAL);
 -
 -  runTest("PTHREAD_MUTEX_ERRORCHECK (W9x,WNT)", PTHREAD_MUTEX_ERRORCHECK);
 -
 -  runTest("PTHREAD_MUTEX_RECURSIVE (W9x,WNT)", PTHREAD_MUTEX_RECURSIVE);
 -#else
 -  runTest("Non-blocking lock", 0);
 -#endif
 -
 -  printf( "=============================================================================\n");
 -
 -  /*
 -   * End of tests.
 -   */
 -
 -  pthread_mutexattr_destroy(&ma);
 -
 -  one = i; /* Dummy assignment to avoid 'variable unused' warning */
 -  return 0;
 -}
 +/* + * benchtest1.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Measure time taken to complete an elementary operation. + * + * - Mutex + *   Single thread iteration over lock/unlock for each mutex type. + */ + +#include "test.h" +#include <sys/timeb.h> + +#ifdef __GNUC__ +#include <stdlib.h> +#endif + +#include "benchtest.h" + +#define PTW32_MUTEX_TYPES +#define ITERATIONS      10000000L + +pthread_mutex_t mx; +pthread_mutexattr_t ma; +struct _timeb currSysTimeStart; +struct _timeb currSysTimeStop; +long durationMilliSecs; +long overHeadMilliSecs = 0; +int one = 1; +int zero = 0; + +#define GetDurationMilliSecs(_TStart, _TStop) ((_TStop.time*1000+_TStop.millitm) \ +                                               - (_TStart.time*1000+_TStart.millitm)) + +/* + * Dummy use of j, otherwise the loop may be removed by the optimiser + * when doing the overhead timing with an empty loop. + */ +#define TESTSTART \ +  { int i, j = 0, k = 0; _ftime(&currSysTimeStart); for (i = 0; i < ITERATIONS; i++) { j++; + +#define TESTSTOP \ +  }; _ftime(&currSysTimeStop); if (j + k == i) j++; } + + +void +runTest (char * testNameString, int mType) +{ +#ifdef PTW32_MUTEX_TYPES +  assert(pthread_mutexattr_settype(&ma, mType) == 0); +#endif +  assert(pthread_mutex_init(&mx, &ma) == 0); + +  TESTSTART +  assert(pthread_mutex_lock(&mx) == zero); +  assert(pthread_mutex_unlock(&mx) == zero); +  TESTSTOP + +  assert(pthread_mutex_destroy(&mx) == 0); + +  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + +  printf( "%-45s %15ld %15.3f\n", +	    testNameString, +          durationMilliSecs, +          (float) durationMilliSecs * 1E3 / ITERATIONS); +} + + +int +main (int argc, char *argv[]) +{ +  int i = 0; +  CRITICAL_SECTION cs; +  old_mutex_t ox; +  pthread_mutexattr_init(&ma); + +  printf( "=============================================================================\n"); +  printf( "\nLock plus unlock on an unlocked mutex.\n%ld iterations\n\n", +          ITERATIONS); +  printf( "%-45s %15s %15s\n", +	    "Test", +	    "Total(msec)", +	    "average(usec)"); +  printf( "-----------------------------------------------------------------------------\n"); + +  /* +   * Time the loop overhead so we can subtract it from the actual test times. +   */ + +  TESTSTART +  assert(1 == one); +  assert(1 == one); +  TESTSTOP + +  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; +  overHeadMilliSecs = durationMilliSecs; + + +  TESTSTART +  assert((dummy_call(&i), 1) == one); +  assert((dummy_call(&i), 1) == one); +  TESTSTOP + +  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + +  printf( "%-45s %15ld %15.3f\n", +	    "Dummy call x 2", +          durationMilliSecs, +          (float) durationMilliSecs * 1E3 / ITERATIONS); + + +  TESTSTART +  assert((interlocked_inc_with_conditionals(&i), 1) == one); +  assert((interlocked_dec_with_conditionals(&i), 1) == one); +  TESTSTOP + +  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + +  printf( "%-45s %15ld %15.3f\n", +	    "Dummy call -> Interlocked with cond x 2", +          durationMilliSecs, +          (float) durationMilliSecs * 1E3 / ITERATIONS); + + +  TESTSTART +  assert((InterlockedIncrement((LPLONG)&i), 1) == (LONG)one); +  assert((InterlockedDecrement((LPLONG)&i), 1) == (LONG)one); +  TESTSTOP + +  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + +  printf( "%-45s %15ld %15.3f\n", +	    "InterlockedOp x 2", +          durationMilliSecs, +          (float) durationMilliSecs * 1E3 / ITERATIONS); + + +  InitializeCriticalSection(&cs); + +  TESTSTART +  assert((EnterCriticalSection(&cs), 1) == one); +  assert((LeaveCriticalSection(&cs), 1) == one); +  TESTSTOP + +  DeleteCriticalSection(&cs); + +  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + +  printf( "%-45s %15ld %15.3f\n", +	    "Simple Critical Section", +          durationMilliSecs, +          (float) durationMilliSecs * 1E3 / ITERATIONS); + + +  old_mutex_use = OLD_WIN32CS; +  assert(old_mutex_init(&ox, NULL) == 0); + +  TESTSTART +  assert(old_mutex_lock(&ox) == zero); +  assert(old_mutex_unlock(&ox) == zero); +  TESTSTOP + +  assert(old_mutex_destroy(&ox) == 0); + +  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + +  printf( "%-45s %15ld %15.3f\n", +	    "Old PT Mutex using a Critical Section (WNT)", +          durationMilliSecs, +          (float) durationMilliSecs * 1E3 / ITERATIONS); + + +  old_mutex_use = OLD_WIN32MUTEX; +  assert(old_mutex_init(&ox, NULL) == 0); + +  TESTSTART +  assert(old_mutex_lock(&ox) == zero); +  assert(old_mutex_unlock(&ox) == zero); +  TESTSTOP + +  assert(old_mutex_destroy(&ox) == 0); + +  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + +  printf( "%-45s %15ld %15.3f\n", +	    "Old PT Mutex using a Win32 Mutex (W9x)", +          durationMilliSecs, +          (float) durationMilliSecs * 1E3 / ITERATIONS); + +  printf( ".............................................................................\n"); + +  /* +   * Now we can start the actual tests +   */ +#ifdef PTW32_MUTEX_TYPES +  runTest("PTHREAD_MUTEX_DEFAULT (W9x,WNT)", PTHREAD_MUTEX_DEFAULT); + +  runTest("PTHREAD_MUTEX_NORMAL (W9x,WNT)", PTHREAD_MUTEX_NORMAL); + +  runTest("PTHREAD_MUTEX_ERRORCHECK (W9x,WNT)", PTHREAD_MUTEX_ERRORCHECK); + +  runTest("PTHREAD_MUTEX_RECURSIVE (W9x,WNT)", PTHREAD_MUTEX_RECURSIVE); +#else +  runTest("Non-blocking lock", 0); +#endif + +  printf( "=============================================================================\n"); + +  /* +   * End of tests. +   */ + +  pthread_mutexattr_destroy(&ma); + +  one = i; /* Dummy assignment to avoid 'variable unused' warning */ +  return 0; +} diff --git a/tests/benchtest5.c b/tests/benchtest5.c index 2fba9e3..7700fde 100644 --- a/tests/benchtest5.c +++ b/tests/benchtest5.c @@ -1,159 +1,159 @@ -/*
 - * benchtest5.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Measure time taken to complete an elementary operation.
 - *
 - * - Semaphore
 - *   Single thread iteration over post/wait for a semaphore.
 - */
 -
 -#include "test.h"
 -#include <sys/timeb.h>
 -
 -#ifdef __GNUC__
 -#include <stdlib.h>
 -#endif
 -
 -#include "benchtest.h"
 -
 -#define ITERATIONS      1000000L
 -
 -sem_t sema;
 -HANDLE w32sema;
 -
 -struct _timeb currSysTimeStart;
 -struct _timeb currSysTimeStop;
 -long durationMilliSecs;
 -long overHeadMilliSecs = 0;
 -int one = 1;
 -int zero = 0;
 -
 -#define GetDurationMilliSecs(_TStart, _TStop) ((_TStop.time*1000+_TStop.millitm) \
 -                                               - (_TStart.time*1000+_TStart.millitm))
 -
 -/*
 - * Dummy use of j, otherwise the loop may be removed by the optimiser
 - * when doing the overhead timing with an empty loop.
 - */
 -#define TESTSTART \
 -  { int i, j = 0, k = 0; _ftime(&currSysTimeStart); for (i = 0; i < ITERATIONS; i++) { j++;
 -
 -#define TESTSTOP \
 -  }; _ftime(&currSysTimeStop); if (j + k == i) j++; }
 -
 -
 -void
 -reportTest (char * testNameString)
 -{
 -  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs;
 -
 -  printf( "%-45s %15ld %15.3f\n",
 -	    testNameString,
 -          durationMilliSecs,
 -          (float) durationMilliSecs * 1E3 / ITERATIONS);
 -}
 -
 -
 -int
 -main (int argc, char *argv[])
 -{
 -  printf( "=============================================================================\n");
 -  printf( "\nOperations on a semaphore.\n%ld iterations\n\n",
 -          ITERATIONS);
 -  printf( "%-45s %15s %15s\n",
 -	    "Test",
 -	    "Total(msec)",
 -	    "average(usec)");
 -  printf( "-----------------------------------------------------------------------------\n");
 -
 -  /*
 -   * Time the loop overhead so we can subtract it from the actual test times.
 -   */
 -
 -  TESTSTART
 -  assert(1 == one);
 -  TESTSTOP
 -
 -  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs;
 -  overHeadMilliSecs = durationMilliSecs;
 -
 -
 -  /*
 -   * Now we can start the actual tests
 -   */
 -  assert((w32sema = CreateSemaphore(NULL, (long) 0, (long) ITERATIONS, NULL)) != 0);
 -  TESTSTART
 -  assert(ReleaseSemaphore(w32sema, 1, NULL) != zero);
 -  TESTSTOP
 -  assert(CloseHandle(w32sema) != 0);
 -
 -  reportTest("W32 Post with no waiters");
 -
 -
 -  assert((w32sema = CreateSemaphore(NULL, (long) ITERATIONS, (long) ITERATIONS, NULL)) != 0);
 -  TESTSTART
 -  assert(WaitForSingleObject(w32sema, INFINITE) == WAIT_OBJECT_0);
 -  TESTSTOP
 -  assert(CloseHandle(w32sema) != 0);
 -
 -  reportTest("W32 Wait without blocking");
 -
 -
 -  assert(sem_init(&sema, 0, 0) == 0);
 -  TESTSTART
 -  assert(sem_post(&sema) == zero);
 -  TESTSTOP
 -  assert(sem_destroy(&sema) == 0);
 -
 -  reportTest("POSIX Post with no waiters");
 -
 -
 -  assert(sem_init(&sema, 0, ITERATIONS) == 0);
 -  TESTSTART
 -  assert(sem_wait(&sema) == zero);
 -  TESTSTOP
 -  assert(sem_destroy(&sema) == 0);
 -
 -  reportTest("POSIX Wait without blocking");
 -
 -
 -  printf( "=============================================================================\n");
 -
 -  /*
 -   * End of tests.
 -   */
 -
 -  return 0;
 -}
 +/* + * benchtest5.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Measure time taken to complete an elementary operation. + * + * - Semaphore + *   Single thread iteration over post/wait for a semaphore. + */ + +#include "test.h" +#include <sys/timeb.h> + +#ifdef __GNUC__ +#include <stdlib.h> +#endif + +#include "benchtest.h" + +#define ITERATIONS      1000000L + +sem_t sema; +HANDLE w32sema; + +struct _timeb currSysTimeStart; +struct _timeb currSysTimeStop; +long durationMilliSecs; +long overHeadMilliSecs = 0; +int one = 1; +int zero = 0; + +#define GetDurationMilliSecs(_TStart, _TStop) ((_TStop.time*1000+_TStop.millitm) \ +                                               - (_TStart.time*1000+_TStart.millitm)) + +/* + * Dummy use of j, otherwise the loop may be removed by the optimiser + * when doing the overhead timing with an empty loop. + */ +#define TESTSTART \ +  { int i, j = 0, k = 0; _ftime(&currSysTimeStart); for (i = 0; i < ITERATIONS; i++) { j++; + +#define TESTSTOP \ +  }; _ftime(&currSysTimeStop); if (j + k == i) j++; } + + +void +reportTest (char * testNameString) +{ +  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; + +  printf( "%-45s %15ld %15.3f\n", +	    testNameString, +          durationMilliSecs, +          (float) durationMilliSecs * 1E3 / ITERATIONS); +} + + +int +main (int argc, char *argv[]) +{ +  printf( "=============================================================================\n"); +  printf( "\nOperations on a semaphore.\n%ld iterations\n\n", +          ITERATIONS); +  printf( "%-45s %15s %15s\n", +	    "Test", +	    "Total(msec)", +	    "average(usec)"); +  printf( "-----------------------------------------------------------------------------\n"); + +  /* +   * Time the loop overhead so we can subtract it from the actual test times. +   */ + +  TESTSTART +  assert(1 == one); +  TESTSTOP + +  durationMilliSecs = GetDurationMilliSecs(currSysTimeStart, currSysTimeStop) - overHeadMilliSecs; +  overHeadMilliSecs = durationMilliSecs; + + +  /* +   * Now we can start the actual tests +   */ +  assert((w32sema = CreateSemaphore(NULL, (long) 0, (long) ITERATIONS, NULL)) != 0); +  TESTSTART +  assert(ReleaseSemaphore(w32sema, 1, NULL) != zero); +  TESTSTOP +  assert(CloseHandle(w32sema) != 0); + +  reportTest("W32 Post with no waiters"); + + +  assert((w32sema = CreateSemaphore(NULL, (long) ITERATIONS, (long) ITERATIONS, NULL)) != 0); +  TESTSTART +  assert(WaitForSingleObject(w32sema, INFINITE) == WAIT_OBJECT_0); +  TESTSTOP +  assert(CloseHandle(w32sema) != 0); + +  reportTest("W32 Wait without blocking"); + + +  assert(sem_init(&sema, 0, 0) == 0); +  TESTSTART +  assert(sem_post(&sema) == zero); +  TESTSTOP +  assert(sem_destroy(&sema) == 0); + +  reportTest("POSIX Post with no waiters"); + + +  assert(sem_init(&sema, 0, ITERATIONS) == 0); +  TESTSTART +  assert(sem_wait(&sema) == zero); +  TESTSTOP +  assert(sem_destroy(&sema) == 0); + +  reportTest("POSIX Wait without blocking"); + + +  printf( "=============================================================================\n"); + +  /* +   * End of tests. +   */ + +  return 0; +} diff --git a/tests/condvar3.c b/tests/condvar3.c index 60cd0e7..e3a23f5 100644 --- a/tests/condvar3.c +++ b/tests/condvar3.c @@ -1,148 +1,148 @@ -/*
 - * File: condvar3.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Test Synopsis:
 - * - Test basic function of a CV
 - *
 - * Test Method (Validation or Falsification):
 - * - Validation
 - *
 - * Requirements Tested:
 - * - 
 - *
 - * Features Tested:
 - * - 
 - *
 - * Cases Tested:
 - * - 
 - *
 - * Description:
 - * - The primary thread takes the lock before creating any threads.
 - *   The secondary thread blocks on the lock allowing the primary
 - *   thread to enter the cv wait state which releases the lock.
 - *   The secondary thread then takes the lock and signals the waiting
 - *   primary thread.
 - *
 - * Environment:
 - * - 
 - *
 - * Input:
 - * - None.
 - *
 - * Output:
 - * - File name, Line number, and failed expression on failure.
 - * - No output on success.
 - *
 - * Assumptions:
 - * - 
 - *
 - * Pass Criteria:
 - * - pthread_cond_timedwait returns 0.
 - * - Process returns zero exit status.
 - *
 - * Fail Criteria:
 - * - pthread_cond_timedwait returns ETIMEDOUT.
 - * - Process returns non-zero exit status.
 - */
 -
 -#include "test.h"
 -#include <sys/timeb.h>
 -
 -static pthread_cond_t cv;
 -static pthread_mutex_t mutex;
 -static int shared = 0;
 -
 -enum {
 -  NUMTHREADS = 2         /* Including the primary thread. */
 -};
 -
 -void *
 -mythread(void * arg)
 -{
 -  int result = 0;
 -
 -  assert(pthread_mutex_lock(&mutex) == 0);
 -  shared++;
 -  assert(pthread_mutex_unlock(&mutex) == 0);
 -
 -  if ((result = pthread_cond_signal(&cv)) != 0)
 -    {
 -      printf("Error = %s\n", error_string[result]);
 -    }
 -  assert(result == 0);
 -
 -
 -  return (void *) 0;
 -}
 -
 -int
 -main()
 -{
 -  pthread_t t[NUMTHREADS];
 -  struct timespec abstime = { 0, 0 };
 -  struct _timeb currSysTime;
 -  const DWORD NANOSEC_PER_MILLISEC = 1000000;
 -
 -  assert((t[0] = pthread_self()).p != NULL);
 -
 -  assert(pthread_cond_init(&cv, NULL) == 0);
 -
 -  assert(pthread_mutex_init(&mutex, NULL) == 0);
 -
 -  assert(pthread_mutex_lock(&mutex) == 0);
 -
 -  /* get current system time */
 -  _ftime(&currSysTime);
 -
 -  abstime.tv_sec = currSysTime.time;
 -  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -
 -  assert(pthread_create(&t[1], NULL, mythread, (void *) 1) == 0);
 -
 -  abstime.tv_sec += 5;
 -
 -  while (! (shared > 0))
 -    assert(pthread_cond_timedwait(&cv, &mutex, &abstime) == 0);
 -
 -  assert(shared > 0);
 -
 -  assert(pthread_mutex_unlock(&mutex) == 0);
 -
 -  assert(pthread_join(t[1], NULL) == 0);
 -
 -  assert(pthread_cond_destroy(&cv) == 0);
 -
 -  return 0;
 -}
 +/* + * File: condvar3.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test basic function of a CV + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * -  + * + * Features Tested: + * -  + * + * Cases Tested: + * -  + * + * Description: + * - The primary thread takes the lock before creating any threads. + *   The secondary thread blocks on the lock allowing the primary + *   thread to enter the cv wait state which releases the lock. + *   The secondary thread then takes the lock and signals the waiting + *   primary thread. + * + * Environment: + * -  + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * -  + * + * Pass Criteria: + * - pthread_cond_timedwait returns 0. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include <sys/timeb.h> + +static pthread_cond_t cv; +static pthread_mutex_t mutex; +static int shared = 0; + +enum { +  NUMTHREADS = 2         /* Including the primary thread. */ +}; + +void * +mythread(void * arg) +{ +  int result = 0; + +  assert(pthread_mutex_lock(&mutex) == 0); +  shared++; +  assert(pthread_mutex_unlock(&mutex) == 0); + +  if ((result = pthread_cond_signal(&cv)) != 0) +    { +      printf("Error = %s\n", error_string[result]); +    } +  assert(result == 0); + + +  return (void *) 0; +} + +int +main() +{ +  pthread_t t[NUMTHREADS]; +  struct timespec abstime = { 0, 0 }; +  struct _timeb currSysTime; +  const DWORD NANOSEC_PER_MILLISEC = 1000000; + +  assert((t[0] = pthread_self()).p != NULL); + +  assert(pthread_cond_init(&cv, NULL) == 0); + +  assert(pthread_mutex_init(&mutex, NULL) == 0); + +  assert(pthread_mutex_lock(&mutex) == 0); + +  /* get current system time */ +  _ftime(&currSysTime); + +  abstime.tv_sec = currSysTime.time; +  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + +  assert(pthread_create(&t[1], NULL, mythread, (void *) 1) == 0); + +  abstime.tv_sec += 5; + +  while (! (shared > 0)) +    assert(pthread_cond_timedwait(&cv, &mutex, &abstime) == 0); + +  assert(shared > 0); + +  assert(pthread_mutex_unlock(&mutex) == 0); + +  assert(pthread_join(t[1], NULL) == 0); + +  assert(pthread_cond_destroy(&cv) == 0); + +  return 0; +} diff --git a/tests/condvar3_1.c b/tests/condvar3_1.c index 369c07c..25a50e4 100644 --- a/tests/condvar3_1.c +++ b/tests/condvar3_1.c @@ -1,201 +1,201 @@ -/*
 - * File: condvar3_1.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Test Synopsis:
 - * - Test timeout of multiple waits on a CV with some signaled.
 - *
 - * Test Method (Validation or Falsification):
 - * - Validation
 - *
 - * Requirements Tested:
 - * - 
 - *
 - * Features Tested:
 - * - 
 - *
 - * Cases Tested:
 - * - 
 - *
 - * Description:
 - * - Because some CVs are never signaled, we expect their waits to time out.
 - *   Some are signaled, the rest time out. Pthread_cond_destroy() will fail
 - *   unless all are accounted for, either signaled or timedout.
 - *
 - * Environment:
 - * -
 - *
 - * Input:
 - * - None.
 - *
 - * Output:
 - * - File name, Line number, and failed expression on failure.
 - * - No output on success.
 - *
 - * Assumptions:
 - * - 
 - *
 - * Pass Criteria:
 - * - pthread_cond_timedwait returns ETIMEDOUT.
 - * - Process returns zero exit status.
 - *
 - * Fail Criteria:
 - * - pthread_cond_timedwait does not return ETIMEDOUT.
 - * - Process returns non-zero exit status.
 - */
 -
 -#define _WIN32_WINNT 0x400
 -
 -#include "test.h"
 -#include <sys/timeb.h>
 -
 -static pthread_cond_t cv;
 -static pthread_cond_t cv1;
 -static pthread_mutex_t mutex;
 -static pthread_mutex_t mutex1;
 -static struct timespec abstime = { 0, 0 };
 -static int timedout = 0;
 -static int signaled = 0;
 -static int awoken = 0;
 -static int waiting = 0;
 -
 -enum {
 -  NUMTHREADS = 30
 -};
 -
 -void *
 -mythread(void * arg)
 -{
 -  int result;
 -
 -  assert(pthread_mutex_lock(&mutex1) == 0);
 -  ++waiting;
 -  assert(pthread_mutex_unlock(&mutex1) == 0);
 -  assert(pthread_cond_signal(&cv1) == 0);
 -
 -  assert(pthread_mutex_lock(&mutex) == 0);
 -  result = pthread_cond_timedwait(&cv, &mutex, &abstime);
 -  if (result == ETIMEDOUT)
 -    {
 -      timedout++;
 -    }
 -  else
 -    {
 -      awoken++;
 -    }
 -  assert(pthread_mutex_unlock(&mutex) == 0);
 -
 -  return arg;
 -}
 -
 -#include "../implement.h"
 -
 -int
 -main()
 -{
 -  int i;
 -  pthread_t t[NUMTHREADS + 1];
 -  int result = 0;
 -  struct _timeb currSysTime;
 -  const DWORD NANOSEC_PER_MILLISEC = 1000000;
 -
 -  assert(pthread_cond_init(&cv, NULL) == 0);
 -  assert(pthread_cond_init(&cv1, NULL) == 0);
 -
 -  assert(pthread_mutex_init(&mutex, NULL) == 0);
 -  assert(pthread_mutex_init(&mutex1, NULL) == 0);
 -
 -  /* get current system time */
 -  _ftime(&currSysTime);
 -
 -  abstime.tv_sec = currSysTime.time;
 -  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -
 -  abstime.tv_sec += 5;
 -
 -  assert(pthread_mutex_lock(&mutex1) == 0);
 -
 -  for (i = 1; i <= NUMTHREADS; i++)
 -    {
 -      assert(pthread_create(&t[i], NULL, mythread, (void *) i) == 0);
 -    }
 -
 -  do {
 -    assert(pthread_cond_wait(&cv1,&mutex1) == 0);
 -  } while ( NUMTHREADS > waiting );
 -
 -  assert(pthread_mutex_unlock(&mutex1) == 0);
 -
 -  for (i = NUMTHREADS/3; i <= 2*NUMTHREADS/3; i++)
 -    {
 -//      assert(pthread_mutex_lock(&mutex) == 0);
 -      assert(pthread_cond_signal(&cv) == 0);
 -//      assert(pthread_mutex_unlock(&mutex) == 0);
 -
 -      signaled++;
 -    }
 -
 -  for (i = 1; i <= NUMTHREADS; i++)
 -    {
 -      assert(pthread_join(t[i], (void **) &result) == 0);
 -        assert(result == i);
 -    }
 -
 -      fprintf(stderr, "awk = %d\n", awoken);
 -      fprintf(stderr, "sig = %d\n", signaled);
 -      fprintf(stderr, "tot = %d\n", timedout);
 -
 -  assert(signaled == awoken);
 -  assert(timedout == NUMTHREADS - signaled);
 -
 -  assert(pthread_cond_destroy(&cv1) == 0);
 -
 -  {
 -  int result = pthread_cond_destroy(&cv);
 -  if (result != 0)
 -    {
 -      fprintf(stderr, "Result = %s\n", error_string[result]);
 -        fprintf(stderr, "\tWaitersBlocked = %ld\n", cv->nWaitersBlocked);
 -        fprintf(stderr, "\tWaitersGone = %ld\n", cv->nWaitersGone);
 -        fprintf(stderr, "\tWaitersToUnblock = %ld\n", cv->nWaitersToUnblock);
 -        fflush(stderr);
 -    }
 -  assert(result == 0);
 -  }
 -
 -  assert(pthread_mutex_destroy(&mutex1) == 0);
 -  assert(pthread_mutex_destroy(&mutex) == 0);
 -
 -  return 0;
 -}
 +/* + * File: condvar3_1.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test timeout of multiple waits on a CV with some signaled. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * -  + * + * Features Tested: + * -  + * + * Cases Tested: + * -  + * + * Description: + * - Because some CVs are never signaled, we expect their waits to time out. + *   Some are signaled, the rest time out. Pthread_cond_destroy() will fail + *   unless all are accounted for, either signaled or timedout. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * -  + * + * Pass Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait does not return ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +#define _WIN32_WINNT 0x400 + +#include "test.h" +#include <sys/timeb.h> + +static pthread_cond_t cv; +static pthread_cond_t cv1; +static pthread_mutex_t mutex; +static pthread_mutex_t mutex1; +static struct timespec abstime = { 0, 0 }; +static int timedout = 0; +static int signaled = 0; +static int awoken = 0; +static int waiting = 0; + +enum { +  NUMTHREADS = 30 +}; + +void * +mythread(void * arg) +{ +  int result; + +  assert(pthread_mutex_lock(&mutex1) == 0); +  ++waiting; +  assert(pthread_mutex_unlock(&mutex1) == 0); +  assert(pthread_cond_signal(&cv1) == 0); + +  assert(pthread_mutex_lock(&mutex) == 0); +  result = pthread_cond_timedwait(&cv, &mutex, &abstime); +  if (result == ETIMEDOUT) +    { +      timedout++; +    } +  else +    { +      awoken++; +    } +  assert(pthread_mutex_unlock(&mutex) == 0); + +  return arg; +} + +#include "../implement.h" + +int +main() +{ +  int i; +  pthread_t t[NUMTHREADS + 1]; +  int result = 0; +  struct _timeb currSysTime; +  const DWORD NANOSEC_PER_MILLISEC = 1000000; + +  assert(pthread_cond_init(&cv, NULL) == 0); +  assert(pthread_cond_init(&cv1, NULL) == 0); + +  assert(pthread_mutex_init(&mutex, NULL) == 0); +  assert(pthread_mutex_init(&mutex1, NULL) == 0); + +  /* get current system time */ +  _ftime(&currSysTime); + +  abstime.tv_sec = currSysTime.time; +  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + +  abstime.tv_sec += 5; + +  assert(pthread_mutex_lock(&mutex1) == 0); + +  for (i = 1; i <= NUMTHREADS; i++) +    { +      assert(pthread_create(&t[i], NULL, mythread, (void *) i) == 0); +    } + +  do { +    assert(pthread_cond_wait(&cv1,&mutex1) == 0); +  } while ( NUMTHREADS > waiting ); + +  assert(pthread_mutex_unlock(&mutex1) == 0); + +  for (i = NUMTHREADS/3; i <= 2*NUMTHREADS/3; i++) +    { +//      assert(pthread_mutex_lock(&mutex) == 0); +      assert(pthread_cond_signal(&cv) == 0); +//      assert(pthread_mutex_unlock(&mutex) == 0); + +      signaled++; +    } + +  for (i = 1; i <= NUMTHREADS; i++) +    { +      assert(pthread_join(t[i], (void **) &result) == 0); +        assert(result == i); +    } + +      fprintf(stderr, "awk = %d\n", awoken); +      fprintf(stderr, "sig = %d\n", signaled); +      fprintf(stderr, "tot = %d\n", timedout); + +  assert(signaled == awoken); +  assert(timedout == NUMTHREADS - signaled); + +  assert(pthread_cond_destroy(&cv1) == 0); + +  { +  int result = pthread_cond_destroy(&cv); +  if (result != 0) +    { +      fprintf(stderr, "Result = %s\n", error_string[result]); +        fprintf(stderr, "\tWaitersBlocked = %ld\n", cv->nWaitersBlocked); +        fprintf(stderr, "\tWaitersGone = %ld\n", cv->nWaitersGone); +        fprintf(stderr, "\tWaitersToUnblock = %ld\n", cv->nWaitersToUnblock); +        fflush(stderr); +    } +  assert(result == 0); +  } + +  assert(pthread_mutex_destroy(&mutex1) == 0); +  assert(pthread_mutex_destroy(&mutex) == 0); + +  return 0; +} diff --git a/tests/condvar3_2.c b/tests/condvar3_2.c index c9d58ad..5ddcf57 100644 --- a/tests/condvar3_2.c +++ b/tests/condvar3_2.c @@ -1,193 +1,193 @@ -/*
 - * File: condvar3_2.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Test Synopsis:
 - * - Test timeout of multiple waits on a CV with remainder broadcast awoken.
 - *
 - * Test Method (Validation or Falsification):
 - * - Validation
 - *
 - * Requirements Tested:
 - * - 
 - *
 - * Features Tested:
 - * - 
 - *
 - * Cases Tested:
 - * - 
 - *
 - * Description:
 - * - Because some CVs are never signaled, we expect their waits to time out.
 - *   Some time out, the rest are broadcast signaled. Pthread_cond_destroy() will fail
 - *   unless all are accounted for, either signaled or timedout.
 - *
 - * Environment:
 - * -
 - *
 - * Input:
 - * - None.
 - *
 - * Output:
 - * - File name, Line number, and failed expression on failure.
 - * - No output on success.
 - *
 - * Assumptions:
 - * - 
 - *
 - * Pass Criteria:
 - * - pthread_cond_timedwait returns ETIMEDOUT.
 - * - Process returns zero exit status.
 - *
 - * Fail Criteria:
 - * - pthread_cond_timedwait does not return ETIMEDOUT.
 - * - Process returns non-zero exit status.
 - */
 -
 -#define _WIN32_WINNT 0x400
 -
 -#include "test.h"
 -#include <sys/timeb.h>
 -
 -static pthread_cond_t cv;
 -static pthread_mutex_t mutex;
 -static struct timespec abstime = { 0, 0 };
 -static struct timespec abstime2 = { 0, 0 };
 -static int timedout = 0;
 -static int awoken = 0;
 -
 -enum {
 -  NUMTHREADS = 30
 -};
 -
 -void *
 -mythread(void * arg)
 -{
 -  int result;
 -
 -  assert(pthread_mutex_lock(&mutex) == 0);
 -
 -  abstime2.tv_sec = abstime.tv_sec;
 -
 -  if ((int) arg % 3 == 0)
 -    {
 -      abstime2.tv_sec += 2;
 -    }
 -
 -  result = pthread_cond_timedwait(&cv, &mutex, &abstime2);
 -  assert(pthread_mutex_unlock(&mutex) == 0);
 -  if (result == ETIMEDOUT)
 -    {
 -      InterlockedIncrement((LPLONG)&timedout);
 -    }
 -  else
 -    {
 -      InterlockedIncrement((LPLONG)&awoken);
 -    }
 -
 -
 -  return arg;
 -}
 -
 -#include "../implement.h"
 -
 -int
 -main()
 -{
 -  int i;
 -  pthread_t t[NUMTHREADS + 1];
 -  int result = 0;
 -  struct _timeb currSysTime;
 -  const DWORD NANOSEC_PER_MILLISEC = 1000000;
 -
 -  assert(pthread_cond_init(&cv, NULL) == 0);
 -
 -  assert(pthread_mutex_init(&mutex, NULL) == 0);
 -
 -  /* get current system time */
 -  _ftime(&currSysTime);
 -
 -  abstime.tv_sec = abstime.tv_sec = currSysTime.time + 5;
 -  abstime.tv_nsec = abstime2.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -
 -  assert(pthread_mutex_lock(&mutex) == 0);
 -
 -  for (i = 1; i <= NUMTHREADS; i++)
 -    {
 -      assert(pthread_create(&t[i], NULL, mythread, (void *) i) == 0);
 -    }
 -
 -  assert(pthread_mutex_unlock(&mutex) == 0);
 -
 -  for (i = 1; i <= NUMTHREADS; i++)
 -    {
 -      assert(pthread_join(t[i], (void **) &result) == 0);
 -	assert(result == i);
 -      /*
 -       * Approximately 2/3rds of the threads are expected to time out.
 -       * Signal the remainder after some threads have woken up and exited
 -       * and while some are still waking up after timeout.
 -       * Also tests that redundant broadcasts don't return errors.
 -       */
 -
 -//      assert(pthread_mutex_lock(&mutex) == 0);
 -
 -      if (InterlockedExchangeAdd((LPLONG)&awoken, 0L) > NUMTHREADS/3)
 -        {
 -          assert(pthread_cond_broadcast(&cv) == 0);
 -        }
 -
 -//      assert(pthread_mutex_unlock(&mutex) == 0);
 -
 -    }
 -
 -  assert(awoken == NUMTHREADS - timedout);
 -
 -  {
 -  int result = pthread_cond_destroy(&cv);
 -  if (result != 0)
 -    {
 -      fprintf(stderr, "Result = %s\n", error_string[result]);
 -	fprintf(stderr, "\tWaitersBlocked = %ld\n", cv->nWaitersBlocked);
 -	fprintf(stderr, "\tWaitersGone = %ld\n", cv->nWaitersGone);
 -	fprintf(stderr, "\tWaitersToUnblock = %ld\n", cv->nWaitersToUnblock);
 -	fflush(stderr);
 -    }
 -  assert(result == 0);
 -  }
 -
 -  assert(pthread_mutex_destroy(&mutex) == 0);
 -
 -  return 0;
 -}
 +/* + * File: condvar3_2.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test timeout of multiple waits on a CV with remainder broadcast awoken. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * -  + * + * Features Tested: + * -  + * + * Cases Tested: + * -  + * + * Description: + * - Because some CVs are never signaled, we expect their waits to time out. + *   Some time out, the rest are broadcast signaled. Pthread_cond_destroy() will fail + *   unless all are accounted for, either signaled or timedout. + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * -  + * + * Pass Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait does not return ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +#define _WIN32_WINNT 0x400 + +#include "test.h" +#include <sys/timeb.h> + +static pthread_cond_t cv; +static pthread_mutex_t mutex; +static struct timespec abstime = { 0, 0 }; +static struct timespec abstime2 = { 0, 0 }; +static int timedout = 0; +static int awoken = 0; + +enum { +  NUMTHREADS = 30 +}; + +void * +mythread(void * arg) +{ +  int result; + +  assert(pthread_mutex_lock(&mutex) == 0); + +  abstime2.tv_sec = abstime.tv_sec; + +  if ((int) arg % 3 == 0) +    { +      abstime2.tv_sec += 2; +    } + +  result = pthread_cond_timedwait(&cv, &mutex, &abstime2); +  assert(pthread_mutex_unlock(&mutex) == 0); +  if (result == ETIMEDOUT) +    { +      InterlockedIncrement((LPLONG)&timedout); +    } +  else +    { +      InterlockedIncrement((LPLONG)&awoken); +    } + + +  return arg; +} + +#include "../implement.h" + +int +main() +{ +  int i; +  pthread_t t[NUMTHREADS + 1]; +  int result = 0; +  struct _timeb currSysTime; +  const DWORD NANOSEC_PER_MILLISEC = 1000000; + +  assert(pthread_cond_init(&cv, NULL) == 0); + +  assert(pthread_mutex_init(&mutex, NULL) == 0); + +  /* get current system time */ +  _ftime(&currSysTime); + +  abstime.tv_sec = abstime.tv_sec = currSysTime.time + 5; +  abstime.tv_nsec = abstime2.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + +  assert(pthread_mutex_lock(&mutex) == 0); + +  for (i = 1; i <= NUMTHREADS; i++) +    { +      assert(pthread_create(&t[i], NULL, mythread, (void *) i) == 0); +    } + +  assert(pthread_mutex_unlock(&mutex) == 0); + +  for (i = 1; i <= NUMTHREADS; i++) +    { +      assert(pthread_join(t[i], (void **) &result) == 0); +	assert(result == i); +      /* +       * Approximately 2/3rds of the threads are expected to time out. +       * Signal the remainder after some threads have woken up and exited +       * and while some are still waking up after timeout. +       * Also tests that redundant broadcasts don't return errors. +       */ + +//      assert(pthread_mutex_lock(&mutex) == 0); + +      if (InterlockedExchangeAdd((LPLONG)&awoken, 0L) > NUMTHREADS/3) +        { +          assert(pthread_cond_broadcast(&cv) == 0); +        } + +//      assert(pthread_mutex_unlock(&mutex) == 0); + +    } + +  assert(awoken == NUMTHREADS - timedout); + +  { +  int result = pthread_cond_destroy(&cv); +  if (result != 0) +    { +      fprintf(stderr, "Result = %s\n", error_string[result]); +	fprintf(stderr, "\tWaitersBlocked = %ld\n", cv->nWaitersBlocked); +	fprintf(stderr, "\tWaitersGone = %ld\n", cv->nWaitersGone); +	fprintf(stderr, "\tWaitersToUnblock = %ld\n", cv->nWaitersToUnblock); +	fflush(stderr); +    } +  assert(result == 0); +  } + +  assert(pthread_mutex_destroy(&mutex) == 0); + +  return 0; +} diff --git a/tests/condvar3_3.c b/tests/condvar3_3.c index 840a83b..fe67632 100644 --- a/tests/condvar3_3.c +++ b/tests/condvar3_3.c @@ -1,132 +1,132 @@ -/*
 - * File: condvar3_3.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Test Synopsis:
 - * - Test timeouts and lost signals on a CV.
 - *
 - * Test Method (Validation or Falsification):
 - * - Validation
 - *
 - * Requirements Tested:
 - * - 
 - *
 - * Features Tested:
 - * - 
 - *
 - * Cases Tested:
 - * - 
 - *
 - * Description:
 - * -
 - *
 - * Environment:
 - * -
 - *
 - * Input:
 - * - None.
 - *
 - * Output:
 - * - File name, Line number, and failed expression on failure.
 - * - No output on success.
 - *
 - * Assumptions:
 - * - 
 - *
 - * Pass Criteria:
 - * - pthread_cond_timedwait returns ETIMEDOUT.
 - * - Process returns zero exit status.
 - *
 - * Fail Criteria:
 - * - pthread_cond_timedwait does not return ETIMEDOUT.
 - * - Process returns non-zero exit status.
 - */
 -
 -/* Timur Aydin (taydin@snet.net) */
 -
 -#include "test.h"
 -
 -#include <sys/timeb.h>
 -
 -pthread_cond_t cnd;
 -pthread_mutex_t mtx;
 -
 -int main()
 -{
 -   int rc;
 -
 -   struct timespec abstime = { 0, 0 };
 -   struct _timeb currSysTime;
 -   const DWORD NANOSEC_PER_MILLISEC = 1000000;
 -
 -   assert(pthread_cond_init(&cnd, 0) == 0);
 -   assert(pthread_mutex_init(&mtx, 0) == 0);
 -
 -   /* get current system time */
 -   _ftime(&currSysTime);
 -
 -   abstime.tv_sec = currSysTime.time;
 -   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -   abstime.tv_sec += 1;
 -
 -   /* Here pthread_cond_timedwait should time out after one second. */
 -
 -   assert(pthread_mutex_lock(&mtx) == 0);
 -
 -   assert((rc = pthread_cond_timedwait(&cnd, &mtx, &abstime)) == ETIMEDOUT);
 -
 -   assert(pthread_mutex_unlock(&mtx) == 0);
 -
 -   /* Here, the condition variable is signaled, but there are no
 -      threads waiting on it. The signal should be lost and
 -      the next pthread_cond_timedwait should time out too. */
 -
 -//   assert(pthread_mutex_lock(&mtx) == 0);
 -
 -   assert((rc = pthread_cond_signal(&cnd)) == 0);
 -
 -//   assert(pthread_mutex_unlock(&mtx) == 0);
 -
 -   assert(pthread_mutex_lock(&mtx) == 0);
 -
 -   abstime.tv_sec = currSysTime.time;
 -   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -   abstime.tv_sec += 1;
 -
 -   assert((rc = pthread_cond_timedwait(&cnd, &mtx, &abstime)) == ETIMEDOUT);
 -
 -   assert(pthread_mutex_unlock(&mtx) == 0);
 -
 -   return 0;
 -}
 +/* + * File: condvar3_3.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test timeouts and lost signals on a CV. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * -  + * + * Features Tested: + * -  + * + * Cases Tested: + * -  + * + * Description: + * - + * + * Environment: + * - + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * -  + * + * Pass Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait does not return ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +/* Timur Aydin (taydin@snet.net) */ + +#include "test.h" + +#include <sys/timeb.h> + +pthread_cond_t cnd; +pthread_mutex_t mtx; + +int main() +{ +   int rc; + +   struct timespec abstime = { 0, 0 }; +   struct _timeb currSysTime; +   const DWORD NANOSEC_PER_MILLISEC = 1000000; + +   assert(pthread_cond_init(&cnd, 0) == 0); +   assert(pthread_mutex_init(&mtx, 0) == 0); + +   /* get current system time */ +   _ftime(&currSysTime); + +   abstime.tv_sec = currSysTime.time; +   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; +   abstime.tv_sec += 1; + +   /* Here pthread_cond_timedwait should time out after one second. */ + +   assert(pthread_mutex_lock(&mtx) == 0); + +   assert((rc = pthread_cond_timedwait(&cnd, &mtx, &abstime)) == ETIMEDOUT); + +   assert(pthread_mutex_unlock(&mtx) == 0); + +   /* Here, the condition variable is signaled, but there are no +      threads waiting on it. The signal should be lost and +      the next pthread_cond_timedwait should time out too. */ + +//   assert(pthread_mutex_lock(&mtx) == 0); + +   assert((rc = pthread_cond_signal(&cnd)) == 0); + +//   assert(pthread_mutex_unlock(&mtx) == 0); + +   assert(pthread_mutex_lock(&mtx) == 0); + +   abstime.tv_sec = currSysTime.time; +   abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; +   abstime.tv_sec += 1; + +   assert((rc = pthread_cond_timedwait(&cnd, &mtx, &abstime)) == ETIMEDOUT); + +   assert(pthread_mutex_unlock(&mtx) == 0); + +   return 0; +} diff --git a/tests/condvar4.c b/tests/condvar4.c index 89fa855..3babeea 100644 --- a/tests/condvar4.c +++ b/tests/condvar4.c @@ -1,169 +1,169 @@ -/*
 - * File: condvar4.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Test Synopsis:
 - * - Test PTHREAD_COND_INITIALIZER.
 - *
 - * Test Method (Validation or Falsification):
 - * - Validation
 - *
 - * Requirements Tested:
 - * - 
 - *
 - * Features Tested:
 - * - 
 - *
 - * Cases Tested:
 - * - 
 - *
 - * Description:
 - * - Test basic CV function but starting with a static initialised
 - *   CV.
 - *
 - * Environment:
 - * - 
 - *
 - * Input:
 - * - None.
 - *
 - * Output:
 - * - File name, Line number, and failed expression on failure.
 - * - No output on success.
 - *
 - * Assumptions:
 - * - 
 - *
 - * Pass Criteria:
 - * - pthread_cond_timedwait returns 0.
 - * - Process returns zero exit status.
 - *
 - * Fail Criteria:
 - * - pthread_cond_timedwait returns ETIMEDOUT.
 - * - Process returns non-zero exit status.
 - */
 -
 -#include "test.h"
 -#include <sys/timeb.h>
 -
 -typedef struct cvthing_t_ cvthing_t;
 -
 -struct cvthing_t_ {
 -  pthread_cond_t notbusy;
 -  pthread_mutex_t lock;
 -  int shared;
 -};
 -
 -static cvthing_t cvthing = {
 -  PTHREAD_COND_INITIALIZER,
 -  PTHREAD_MUTEX_INITIALIZER,
 -  0
 -};
 -
 -enum {
 -  NUMTHREADS = 2
 -};
 -
 -void *
 -mythread(void * arg)
 -{
 -  assert(pthread_mutex_lock(&cvthing.lock) == 0);
 -  cvthing.shared++;
 -  assert(pthread_mutex_unlock(&cvthing.lock) == 0);
 -
 -  assert(pthread_cond_signal(&cvthing.notbusy) == 0);
 -
 -  return (void *) 0;
 -}
 -
 -int
 -main()
 -{
 -  pthread_t t[NUMTHREADS];
 -  struct timespec abstime = { 0, 0 };
 -  struct _timeb currSysTime;
 -  const DWORD NANOSEC_PER_MILLISEC = 1000000;
 -
 -  cvthing.shared = 0;
 -
 -  assert((t[0] = pthread_self()).p != NULL);
 -
 -  assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER);
 -
 -  assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER);
 -
 -  assert(pthread_mutex_lock(&cvthing.lock) == 0);
 -
 -  assert(cvthing.lock != PTHREAD_MUTEX_INITIALIZER);
 -
 -  /* get current system time */
 -  _ftime(&currSysTime);
 -
 -  abstime.tv_sec = currSysTime.time;
 -  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -
 -  abstime.tv_sec += 5;
 -
 -  assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == ETIMEDOUT);
 -  
 -  assert(cvthing.notbusy != PTHREAD_COND_INITIALIZER);
 -
 -  assert(pthread_create(&t[1], NULL, mythread, (void *) 1) == 0);
 -
 -  _ftime(&currSysTime);
 -
 -  abstime.tv_sec = currSysTime.time;
 -  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -
 -  abstime.tv_sec += 5;
 -
 -  while (! (cvthing.shared > 0))
 -    assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
 -
 -  assert(cvthing.shared > 0);
 -
 -  assert(pthread_mutex_unlock(&cvthing.lock) == 0);
 -
 -  assert(pthread_join(t[1], NULL) == 0);
 -
 -  assert(pthread_mutex_destroy(&cvthing.lock) == 0);
 -
 -  assert(cvthing.lock == NULL);
 -
 -  assert(pthread_cond_destroy(&cvthing.notbusy) == 0);
 -
 -  assert(cvthing.notbusy == NULL);
 -
 -  return 0;
 -}
 +/* + * File: condvar4.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test PTHREAD_COND_INITIALIZER. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * -  + * + * Features Tested: + * -  + * + * Cases Tested: + * -  + * + * Description: + * - Test basic CV function but starting with a static initialised + *   CV. + * + * Environment: + * -  + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * -  + * + * Pass Criteria: + * - pthread_cond_timedwait returns 0. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include <sys/timeb.h> + +typedef struct cvthing_t_ cvthing_t; + +struct cvthing_t_ { +  pthread_cond_t notbusy; +  pthread_mutex_t lock; +  int shared; +}; + +static cvthing_t cvthing = { +  PTHREAD_COND_INITIALIZER, +  PTHREAD_MUTEX_INITIALIZER, +  0 +}; + +enum { +  NUMTHREADS = 2 +}; + +void * +mythread(void * arg) +{ +  assert(pthread_mutex_lock(&cvthing.lock) == 0); +  cvthing.shared++; +  assert(pthread_mutex_unlock(&cvthing.lock) == 0); + +  assert(pthread_cond_signal(&cvthing.notbusy) == 0); + +  return (void *) 0; +} + +int +main() +{ +  pthread_t t[NUMTHREADS]; +  struct timespec abstime = { 0, 0 }; +  struct _timeb currSysTime; +  const DWORD NANOSEC_PER_MILLISEC = 1000000; + +  cvthing.shared = 0; + +  assert((t[0] = pthread_self()).p != NULL); + +  assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER); + +  assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER); + +  assert(pthread_mutex_lock(&cvthing.lock) == 0); + +  assert(cvthing.lock != PTHREAD_MUTEX_INITIALIZER); + +  /* get current system time */ +  _ftime(&currSysTime); + +  abstime.tv_sec = currSysTime.time; +  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + +  abstime.tv_sec += 5; + +  assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == ETIMEDOUT); +   +  assert(cvthing.notbusy != PTHREAD_COND_INITIALIZER); + +  assert(pthread_create(&t[1], NULL, mythread, (void *) 1) == 0); + +  _ftime(&currSysTime); + +  abstime.tv_sec = currSysTime.time; +  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + +  abstime.tv_sec += 5; + +  while (! (cvthing.shared > 0)) +    assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0); + +  assert(cvthing.shared > 0); + +  assert(pthread_mutex_unlock(&cvthing.lock) == 0); + +  assert(pthread_join(t[1], NULL) == 0); + +  assert(pthread_mutex_destroy(&cvthing.lock) == 0); + +  assert(cvthing.lock == NULL); + +  assert(pthread_cond_destroy(&cvthing.notbusy) == 0); + +  assert(cvthing.notbusy == NULL); + +  return 0; +} diff --git a/tests/condvar5.c b/tests/condvar5.c index 4836676..4d51f39 100644 --- a/tests/condvar5.c +++ b/tests/condvar5.c @@ -1,168 +1,168 @@ -/*
 - * File: condvar5.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Test Synopsis:
 - * - Test pthread_cond_broadcast.
 - *
 - * Test Method (Validation or Falsification):
 - * - Validation
 - *
 - * Requirements Tested:
 - * - 
 - *
 - * Features Tested:
 - * - 
 - *
 - * Cases Tested:
 - * - 
 - *
 - * Description:
 - * - Test broadcast with one waiting CV.
 - *
 - * Environment:
 - * - 
 - *
 - * Input:
 - * - None.
 - *
 - * Output:
 - * - File name, Line number, and failed expression on failure.
 - * - No output on success.
 - *
 - * Assumptions:
 - * - 
 - *
 - * Pass Criteria:
 - * - pthread_cond_timedwait returns 0.
 - * - Process returns zero exit status.
 - *
 - * Fail Criteria:
 - * - pthread_cond_timedwait returns ETIMEDOUT.
 - * - Process returns non-zero exit status.
 - */
 -
 -#include "test.h"
 -#include <sys/timeb.h>
 -
 -typedef struct cvthing_t_ cvthing_t;
 -
 -struct cvthing_t_ {
 -  pthread_cond_t notbusy;
 -  pthread_mutex_t lock;
 -  int shared;
 -};
 -
 -static cvthing_t cvthing = {
 -  PTHREAD_COND_INITIALIZER,
 -  PTHREAD_MUTEX_INITIALIZER,
 -  0
 -};
 -
 -enum {
 -  NUMTHREADS = 2
 -};
 -
 -void *
 -mythread(void * arg)
 -{
 -  assert(pthread_mutex_lock(&cvthing.lock) == 0);
 -  cvthing.shared++;
 -  assert(pthread_mutex_unlock(&cvthing.lock) == 0);
 -
 -  assert(pthread_cond_broadcast(&cvthing.notbusy) == 0);
 -
 -  return (void *) 0;
 -}
 -
 -int
 -main()
 -{
 -  pthread_t t[NUMTHREADS];
 -  struct timespec abstime = { 0, 0 };
 -  struct _timeb currSysTime;
 -  const DWORD NANOSEC_PER_MILLISEC = 1000000;
 -
 -  cvthing.shared = 0;
 -
 -  assert((t[0] = pthread_self()).p != NULL);
 -
 -  assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER);
 -
 -  assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER);
 -
 -  assert(pthread_mutex_lock(&cvthing.lock) == 0);
 -
 -  assert(cvthing.lock != PTHREAD_MUTEX_INITIALIZER);
 -
 -  /* get current system time */
 -  _ftime(&currSysTime);
 -
 -  abstime.tv_sec = currSysTime.time;
 -  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -
 -  abstime.tv_sec += 5;
 -
 -  assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == ETIMEDOUT);
 -  
 -  assert(cvthing.notbusy != PTHREAD_COND_INITIALIZER);
 -
 -  assert(pthread_create(&t[1], NULL, mythread, (void *) 1) == 0);
 -
 -  _ftime(&currSysTime);
 -
 -  abstime.tv_sec = currSysTime.time;
 -  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -
 -  abstime.tv_sec += 5;
 -
 -  while (! (cvthing.shared > 0))
 -    assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
 -
 -  assert(cvthing.shared > 0);
 -
 -  assert(pthread_mutex_unlock(&cvthing.lock) == 0);
 -
 -  assert(pthread_join(t[1], NULL) == 0);
 -
 -  assert(pthread_mutex_destroy(&cvthing.lock) == 0);
 -
 -  assert(cvthing.lock == NULL);
 -
 -  assert(pthread_cond_destroy(&cvthing.notbusy) == 0);
 -
 -  assert(cvthing.notbusy == NULL);
 -
 -  return 0;
 -}
 +/* + * File: condvar5.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test pthread_cond_broadcast. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * -  + * + * Features Tested: + * -  + * + * Cases Tested: + * -  + * + * Description: + * - Test broadcast with one waiting CV. + * + * Environment: + * -  + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * -  + * + * Pass Criteria: + * - pthread_cond_timedwait returns 0. + * - Process returns zero exit status. + * + * Fail Criteria: + * - pthread_cond_timedwait returns ETIMEDOUT. + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include <sys/timeb.h> + +typedef struct cvthing_t_ cvthing_t; + +struct cvthing_t_ { +  pthread_cond_t notbusy; +  pthread_mutex_t lock; +  int shared; +}; + +static cvthing_t cvthing = { +  PTHREAD_COND_INITIALIZER, +  PTHREAD_MUTEX_INITIALIZER, +  0 +}; + +enum { +  NUMTHREADS = 2 +}; + +void * +mythread(void * arg) +{ +  assert(pthread_mutex_lock(&cvthing.lock) == 0); +  cvthing.shared++; +  assert(pthread_mutex_unlock(&cvthing.lock) == 0); + +  assert(pthread_cond_broadcast(&cvthing.notbusy) == 0); + +  return (void *) 0; +} + +int +main() +{ +  pthread_t t[NUMTHREADS]; +  struct timespec abstime = { 0, 0 }; +  struct _timeb currSysTime; +  const DWORD NANOSEC_PER_MILLISEC = 1000000; + +  cvthing.shared = 0; + +  assert((t[0] = pthread_self()).p != NULL); + +  assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER); + +  assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER); + +  assert(pthread_mutex_lock(&cvthing.lock) == 0); + +  assert(cvthing.lock != PTHREAD_MUTEX_INITIALIZER); + +  /* get current system time */ +  _ftime(&currSysTime); + +  abstime.tv_sec = currSysTime.time; +  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + +  abstime.tv_sec += 5; + +  assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == ETIMEDOUT); +   +  assert(cvthing.notbusy != PTHREAD_COND_INITIALIZER); + +  assert(pthread_create(&t[1], NULL, mythread, (void *) 1) == 0); + +  _ftime(&currSysTime); + +  abstime.tv_sec = currSysTime.time; +  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + +  abstime.tv_sec += 5; + +  while (! (cvthing.shared > 0)) +    assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0); + +  assert(cvthing.shared > 0); + +  assert(pthread_mutex_unlock(&cvthing.lock) == 0); + +  assert(pthread_join(t[1], NULL) == 0); + +  assert(pthread_mutex_destroy(&cvthing.lock) == 0); + +  assert(cvthing.lock == NULL); + +  assert(pthread_cond_destroy(&cvthing.notbusy) == 0); + +  assert(cvthing.notbusy == NULL); + +  return 0; +} diff --git a/tests/condvar6.c b/tests/condvar6.c index 1cb1d9e..e63132c 100644 --- a/tests/condvar6.c +++ b/tests/condvar6.c @@ -1,242 +1,242 @@ -/*
 - * File: condvar6.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Test Synopsis:
 - * - Test pthread_cond_broadcast.
 - *
 - * Test Method (Validation or Falsification):
 - * - Validation
 - *
 - * Requirements Tested:
 - * - 
 - *
 - * Features Tested:
 - * - 
 - *
 - * Cases Tested:
 - * - 
 - *
 - * Description:
 - * - Test broadcast with NUMTHREADS (=5) waiting CVs.
 - *
 - * Environment:
 - * - 
 - *
 - * Input:
 - * - None.
 - *
 - * Output:
 - * - File name, Line number, and failed expression on failure.
 - * - No output on success.
 - *
 - * Assumptions:
 - * - 
 - *
 - * Pass Criteria:
 - * - Process returns zero exit status.
 - *
 - * Fail Criteria:
 - * - Process returns non-zero exit status.
 - */
 -
 -#include "test.h"
 -#include <sys/timeb.h>
 -
 -/*
 - * Create NUMTHREADS threads in addition to the Main thread.
 - */
 -enum {
 -  NUMTHREADS = 5
 -};
 -
 -typedef struct bag_t_ bag_t;
 -struct bag_t_ {
 -  int threadnum;
 -  int started;
 -  /* Add more per-thread state variables here */
 -};
 -
 -static bag_t threadbag[NUMTHREADS + 1];
 -
 -typedef struct cvthing_t_ cvthing_t;
 -
 -struct cvthing_t_ {
 -  pthread_cond_t notbusy;
 -  pthread_mutex_t lock;
 -  int shared;
 -};
 -
 -static cvthing_t cvthing = {
 -  PTHREAD_COND_INITIALIZER,
 -  PTHREAD_MUTEX_INITIALIZER,
 -  0
 -};
 -
 -static pthread_mutex_t start_flag = PTHREAD_MUTEX_INITIALIZER;
 -
 -static struct timespec abstime = { 0, 0 };
 -
 -static int awoken;
 -
 -void *
 -mythread(void * arg)
 -{
 -  bag_t * bag = (bag_t *) arg;
 -
 -  assert(bag == &threadbag[bag->threadnum]);
 -  assert(bag->started == 0);
 -  bag->started = 1;
 -
 -  /* Wait for the start gun */
 -  assert(pthread_mutex_lock(&start_flag) == 0);
 -  assert(pthread_mutex_unlock(&start_flag) == 0);
 -
 -  assert(pthread_mutex_lock(&cvthing.lock) == 0);
 -
 -  while (! (cvthing.shared > 0))
 -    assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
 -
 -  assert(cvthing.shared > 0);
 -
 -  awoken++;
 -
 -  assert(pthread_mutex_unlock(&cvthing.lock) == 0);
 -
 -  return (void *) 0;
 -}
 -
 -int
 -main()
 -{
 -  int failed = 0;
 -  int i;
 -  pthread_t t[NUMTHREADS + 1];
 -
 -  struct _timeb currSysTime;
 -  const DWORD NANOSEC_PER_MILLISEC = 1000000;
 -
 -  cvthing.shared = 0;
 -
 -  assert((t[0] = pthread_self()).p != NULL);
 -
 -  assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER);
 -
 -  assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER);
 -
 -  assert(pthread_mutex_lock(&start_flag) == 0);
 -
 -  _ftime(&currSysTime);
 -
 -  abstime.tv_sec = currSysTime.time;
 -  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -
 -  abstime.tv_sec += 5;
 -
 -  assert((t[0] = pthread_self()).p != NULL);
 -
 -  awoken = 0;
 -
 -  for (i = 1; i <= NUMTHREADS; i++)
 -    {
 -      threadbag[i].started = 0;
 -      threadbag[i].threadnum = i;
 -      assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0);
 -    }
 -
 -  /*
 -   * Code to control or munipulate child threads should probably go here.
 -   */
 -
 -  assert(pthread_mutex_unlock(&start_flag) == 0);
 -
 -  /*
 -   * Give threads time to start.
 -   */
 -  Sleep(1000);
 -
 -  assert(pthread_mutex_lock(&cvthing.lock) == 0);
 -  cvthing.shared++;
 -  assert(pthread_mutex_unlock(&cvthing.lock) == 0);
 -
 -  assert(pthread_cond_broadcast(&cvthing.notbusy) == 0);
 -
 -  /*
 -   * Give threads time to complete.
 -   */
 -  for (i = 1; i <= NUMTHREADS; i++)
 -    {
 -      assert(pthread_join(t[i], NULL) == 0);
 -    }
 -
 -  /* 
 -   * Cleanup the CV.
 -   */
 -  
 -  assert(pthread_mutex_destroy(&cvthing.lock) == 0);
 -
 -  assert(cvthing.lock == NULL);
 -
 -  assert(pthread_cond_destroy(&cvthing.notbusy) == 0);
 -
 -  assert(cvthing.notbusy == NULL);
 -
 -  /*
 -   * Standard check that all threads started.
 -   */
 -  for (i = 1; i <= NUMTHREADS; i++)
 -    { 
 -      failed = !threadbag[i].started;
 -
 -      if (failed)
 -	{
 -	  fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started);
 -	}
 -    }
 -
 -  assert(!failed);
 -
 -  /*
 -   * Check any results here.
 -   */
 -
 -  assert(awoken == NUMTHREADS);
 -
 -  /*
 -   * Success.
 -   */
 -  return 0;
 -}
 -
 -
 +/* + * File: condvar6.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test pthread_cond_broadcast. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * -  + * + * Features Tested: + * -  + * + * Cases Tested: + * -  + * + * Description: + * - Test broadcast with NUMTHREADS (=5) waiting CVs. + * + * Environment: + * -  + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * -  + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include <sys/timeb.h> + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { +  NUMTHREADS = 5 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { +  int threadnum; +  int started; +  /* Add more per-thread state variables here */ +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +typedef struct cvthing_t_ cvthing_t; + +struct cvthing_t_ { +  pthread_cond_t notbusy; +  pthread_mutex_t lock; +  int shared; +}; + +static cvthing_t cvthing = { +  PTHREAD_COND_INITIALIZER, +  PTHREAD_MUTEX_INITIALIZER, +  0 +}; + +static pthread_mutex_t start_flag = PTHREAD_MUTEX_INITIALIZER; + +static struct timespec abstime = { 0, 0 }; + +static int awoken; + +void * +mythread(void * arg) +{ +  bag_t * bag = (bag_t *) arg; + +  assert(bag == &threadbag[bag->threadnum]); +  assert(bag->started == 0); +  bag->started = 1; + +  /* Wait for the start gun */ +  assert(pthread_mutex_lock(&start_flag) == 0); +  assert(pthread_mutex_unlock(&start_flag) == 0); + +  assert(pthread_mutex_lock(&cvthing.lock) == 0); + +  while (! (cvthing.shared > 0)) +    assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0); + +  assert(cvthing.shared > 0); + +  awoken++; + +  assert(pthread_mutex_unlock(&cvthing.lock) == 0); + +  return (void *) 0; +} + +int +main() +{ +  int failed = 0; +  int i; +  pthread_t t[NUMTHREADS + 1]; + +  struct _timeb currSysTime; +  const DWORD NANOSEC_PER_MILLISEC = 1000000; + +  cvthing.shared = 0; + +  assert((t[0] = pthread_self()).p != NULL); + +  assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER); + +  assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER); + +  assert(pthread_mutex_lock(&start_flag) == 0); + +  _ftime(&currSysTime); + +  abstime.tv_sec = currSysTime.time; +  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + +  abstime.tv_sec += 5; + +  assert((t[0] = pthread_self()).p != NULL); + +  awoken = 0; + +  for (i = 1; i <= NUMTHREADS; i++) +    { +      threadbag[i].started = 0; +      threadbag[i].threadnum = i; +      assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); +    } + +  /* +   * Code to control or munipulate child threads should probably go here. +   */ + +  assert(pthread_mutex_unlock(&start_flag) == 0); + +  /* +   * Give threads time to start. +   */ +  Sleep(1000); + +  assert(pthread_mutex_lock(&cvthing.lock) == 0); +  cvthing.shared++; +  assert(pthread_mutex_unlock(&cvthing.lock) == 0); + +  assert(pthread_cond_broadcast(&cvthing.notbusy) == 0); + +  /* +   * Give threads time to complete. +   */ +  for (i = 1; i <= NUMTHREADS; i++) +    { +      assert(pthread_join(t[i], NULL) == 0); +    } + +  /*  +   * Cleanup the CV. +   */ +   +  assert(pthread_mutex_destroy(&cvthing.lock) == 0); + +  assert(cvthing.lock == NULL); + +  assert(pthread_cond_destroy(&cvthing.notbusy) == 0); + +  assert(cvthing.notbusy == NULL); + +  /* +   * Standard check that all threads started. +   */ +  for (i = 1; i <= NUMTHREADS; i++) +    {  +      failed = !threadbag[i].started; + +      if (failed) +	{ +	  fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); +	} +    } + +  assert(!failed); + +  /* +   * Check any results here. +   */ + +  assert(awoken == NUMTHREADS); + +  /* +   * Success. +   */ +  return 0; +} + + diff --git a/tests/condvar7.c b/tests/condvar7.c index 696a18e..6d89f2e 100644 --- a/tests/condvar7.c +++ b/tests/condvar7.c @@ -1,257 +1,257 @@ -/*
 - * File: condvar7.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Test Synopsis:
 - * - Test pthread_cond_broadcast with thread cancelation.
 - *
 - * Test Method (Validation or Falsification):
 - * - Validation
 - *
 - * Requirements Tested:
 - * - 
 - *
 - * Features Tested:
 - * - 
 - *
 - * Cases Tested:
 - * - 
 - *
 - * Description:
 - * - Test broadcast with NUMTHREADS (=5) waiting CVs, one is canceled while waiting.
 - *
 - * Environment:
 - * - 
 - *
 - * Input:
 - * - None.
 - *
 - * Output:
 - * - File name, Line number, and failed expression on failure.
 - * - No output on success.
 - *
 - * Assumptions:
 - * - 
 - *
 - * Pass Criteria:
 - * - Process returns zero exit status.
 - *
 - * Fail Criteria:
 - * - Process returns non-zero exit status.
 - */
 -
 -#include "test.h"
 -#include <sys/timeb.h>
 -
 -/*
 - * Create NUMTHREADS threads in addition to the Main thread.
 - */
 -enum {
 -  NUMTHREADS = 5
 -};
 -
 -typedef struct bag_t_ bag_t;
 -struct bag_t_ {
 -  int threadnum;
 -  int started;
 -  /* Add more per-thread state variables here */
 -};
 -
 -static bag_t threadbag[NUMTHREADS + 1];
 -
 -typedef struct cvthing_t_ cvthing_t;
 -
 -struct cvthing_t_ {
 -  pthread_cond_t notbusy;
 -  pthread_mutex_t lock;
 -  int shared;
 -};
 -
 -static cvthing_t cvthing = {
 -  PTHREAD_COND_INITIALIZER,
 -  PTHREAD_MUTEX_INITIALIZER,
 -  0
 -};
 -
 -static pthread_mutex_t start_flag = PTHREAD_MUTEX_INITIALIZER;
 -
 -static struct timespec abstime = { 0, 0 };
 -
 -static int awoken;
 -
 -void *
 -mythread(void * arg)
 -{
 -  bag_t * bag = (bag_t *) arg;
 -
 -  assert(bag == &threadbag[bag->threadnum]);
 -  assert(bag->started == 0);
 -  bag->started = 1;
 -
 -  /* Wait for the start gun */
 -  assert(pthread_mutex_lock(&start_flag) == 0);
 -  assert(pthread_mutex_unlock(&start_flag) == 0);
 -
 -  assert(pthread_mutex_lock(&cvthing.lock) == 0);
 -
 -#ifdef _MSC_VER
 -#pragma inline_depth(0)
 -#endif
 -  pthread_cleanup_push(pthread_mutex_unlock, (void *) &cvthing.lock);
 -
 -  while (! (cvthing.shared > 0))
 -    assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
 -
 -  pthread_cleanup_pop(0);
 -#ifdef _MSC_VER
 -#pragma inline_depth()
 -#endif
 -
 -  assert(cvthing.shared > 0);
 -
 -  awoken++;
 -
 -  assert(pthread_mutex_unlock(&cvthing.lock) == 0);
 -
 -  return (void *) 0;
 -}
 -
 -int
 -main()
 -{
 -  int failed = 0;
 -  int i;
 -  pthread_t t[NUMTHREADS + 1];
 -
 -  struct _timeb currSysTime;
 -  const DWORD NANOSEC_PER_MILLISEC = 1000000;
 -
 -  cvthing.shared = 0;
 -
 -  assert((t[0] = pthread_self()).p != NULL);
 -
 -  assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER);
 -
 -  assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER);
 -
 -  assert(pthread_mutex_lock(&start_flag) == 0);
 -
 -  _ftime(&currSysTime);
 -
 -  abstime.tv_sec = currSysTime.time;
 -  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -
 -  abstime.tv_sec += 10;
 -
 -  assert((t[0] = pthread_self()).p != NULL);
 -
 -  awoken = 0;
 -
 -  for (i = 1; i <= NUMTHREADS; i++)
 -    {
 -      threadbag[i].started = 0;
 -      threadbag[i].threadnum = i;
 -      assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0);
 -    }
 -
 -  /*
 -   * Code to control or munipulate child threads should probably go here.
 -   */
 -
 -  assert(pthread_mutex_unlock(&start_flag) == 0);
 -
 -  /*
 -   * Give threads time to start.
 -   */
 -  Sleep(1000);
 -
 -  /*
 -   * Cancel one of the threads.
 -   */
 -  assert(pthread_cancel(t[1]) == 0);
 -  assert(pthread_join(t[1], NULL) == 0);
 -
 -  assert(pthread_mutex_lock(&cvthing.lock) == 0);
 -  cvthing.shared++;
 -  assert(pthread_mutex_unlock(&cvthing.lock) == 0);
 -
 -  /*
 -   * Signal all remaining waiting threads.
 -   */
 -  assert(pthread_cond_broadcast(&cvthing.notbusy) == 0);
 -
 -  /*
 -   * Wait for all threads to complete.
 -   */
 -  for (i = 2; i <= NUMTHREADS; i++)
 -    assert(pthread_join(t[i], NULL) == 0);
 -
 -  /* 
 -   * Cleanup the CV.
 -   */
 -  
 -  assert(pthread_mutex_destroy(&cvthing.lock) == 0);
 -
 -  assert(cvthing.lock == NULL);
 -
 -  assert(pthread_cond_destroy(&cvthing.notbusy) == 0);
 -
 -  assert(cvthing.notbusy == NULL);
 -
 -  /*
 -   * Standard check that all threads started.
 -   */
 -  for (i = 1; i <= NUMTHREADS; i++)
 -    { 
 -      failed = !threadbag[i].started;
 -
 -      if (failed)
 -	{
 -	  fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started);
 -	}
 -    }
 -
 -  assert(!failed);
 -
 -  /*
 -   * Check any results here.
 -   */
 -
 -  assert(awoken == (NUMTHREADS - 1));
 -
 -  /*
 -   * Success.
 -   */
 -  return 0;
 -}
 +/* + * File: condvar7.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test pthread_cond_broadcast with thread cancelation. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * -  + * + * Features Tested: + * -  + * + * Cases Tested: + * -  + * + * Description: + * - Test broadcast with NUMTHREADS (=5) waiting CVs, one is canceled while waiting. + * + * Environment: + * -  + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * -  + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include <sys/timeb.h> + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { +  NUMTHREADS = 5 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { +  int threadnum; +  int started; +  /* Add more per-thread state variables here */ +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +typedef struct cvthing_t_ cvthing_t; + +struct cvthing_t_ { +  pthread_cond_t notbusy; +  pthread_mutex_t lock; +  int shared; +}; + +static cvthing_t cvthing = { +  PTHREAD_COND_INITIALIZER, +  PTHREAD_MUTEX_INITIALIZER, +  0 +}; + +static pthread_mutex_t start_flag = PTHREAD_MUTEX_INITIALIZER; + +static struct timespec abstime = { 0, 0 }; + +static int awoken; + +void * +mythread(void * arg) +{ +  bag_t * bag = (bag_t *) arg; + +  assert(bag == &threadbag[bag->threadnum]); +  assert(bag->started == 0); +  bag->started = 1; + +  /* Wait for the start gun */ +  assert(pthread_mutex_lock(&start_flag) == 0); +  assert(pthread_mutex_unlock(&start_flag) == 0); + +  assert(pthread_mutex_lock(&cvthing.lock) == 0); + +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif +  pthread_cleanup_push(pthread_mutex_unlock, (void *) &cvthing.lock); + +  while (! (cvthing.shared > 0)) +    assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0); + +  pthread_cleanup_pop(0); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + +  assert(cvthing.shared > 0); + +  awoken++; + +  assert(pthread_mutex_unlock(&cvthing.lock) == 0); + +  return (void *) 0; +} + +int +main() +{ +  int failed = 0; +  int i; +  pthread_t t[NUMTHREADS + 1]; + +  struct _timeb currSysTime; +  const DWORD NANOSEC_PER_MILLISEC = 1000000; + +  cvthing.shared = 0; + +  assert((t[0] = pthread_self()).p != NULL); + +  assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER); + +  assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER); + +  assert(pthread_mutex_lock(&start_flag) == 0); + +  _ftime(&currSysTime); + +  abstime.tv_sec = currSysTime.time; +  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + +  abstime.tv_sec += 10; + +  assert((t[0] = pthread_self()).p != NULL); + +  awoken = 0; + +  for (i = 1; i <= NUMTHREADS; i++) +    { +      threadbag[i].started = 0; +      threadbag[i].threadnum = i; +      assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); +    } + +  /* +   * Code to control or munipulate child threads should probably go here. +   */ + +  assert(pthread_mutex_unlock(&start_flag) == 0); + +  /* +   * Give threads time to start. +   */ +  Sleep(1000); + +  /* +   * Cancel one of the threads. +   */ +  assert(pthread_cancel(t[1]) == 0); +  assert(pthread_join(t[1], NULL) == 0); + +  assert(pthread_mutex_lock(&cvthing.lock) == 0); +  cvthing.shared++; +  assert(pthread_mutex_unlock(&cvthing.lock) == 0); + +  /* +   * Signal all remaining waiting threads. +   */ +  assert(pthread_cond_broadcast(&cvthing.notbusy) == 0); + +  /* +   * Wait for all threads to complete. +   */ +  for (i = 2; i <= NUMTHREADS; i++) +    assert(pthread_join(t[i], NULL) == 0); + +  /*  +   * Cleanup the CV. +   */ +   +  assert(pthread_mutex_destroy(&cvthing.lock) == 0); + +  assert(cvthing.lock == NULL); + +  assert(pthread_cond_destroy(&cvthing.notbusy) == 0); + +  assert(cvthing.notbusy == NULL); + +  /* +   * Standard check that all threads started. +   */ +  for (i = 1; i <= NUMTHREADS; i++) +    {  +      failed = !threadbag[i].started; + +      if (failed) +	{ +	  fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); +	} +    } + +  assert(!failed); + +  /* +   * Check any results here. +   */ + +  assert(awoken == (NUMTHREADS - 1)); + +  /* +   * Success. +   */ +  return 0; +} diff --git a/tests/condvar8.c b/tests/condvar8.c index 890970e..e384a1c 100644 --- a/tests/condvar8.c +++ b/tests/condvar8.c @@ -1,258 +1,258 @@ -/*
 - * File: condvar8.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Test Synopsis:
 - * - Test multiple pthread_cond_broadcasts.
 - *
 - * Test Method (Validation or Falsification):
 - * - Validation
 - *
 - * Requirements Tested:
 - * - 
 - *
 - * Features Tested:
 - * - 
 - *
 - * Cases Tested:
 - * - 
 - *
 - * Description:
 - * - Make NUMTHREADS threads wait on CV, broadcast signal them, and then repeat.
 - *
 - * Environment:
 - * - 
 - *
 - * Input:
 - * - None.
 - *
 - * Output:
 - * - File name, Line number, and failed expression on failure.
 - * - No output on success.
 - *
 - * Assumptions:
 - * - 
 - *
 - * Pass Criteria:
 - * - Process returns zero exit status.
 - *
 - * Fail Criteria:
 - * - Process returns non-zero exit status.
 - */
 -
 -#include "test.h"
 -#include <sys/timeb.h>
 -
 -/*
 - * Create NUMTHREADS threads in addition to the Main thread.
 - */
 -enum {
 -  NUMTHREADS = 5
 -};
 -
 -typedef struct bag_t_ bag_t;
 -struct bag_t_ {
 -  int threadnum;
 -  int started;
 -  /* Add more per-thread state variables here */
 -};
 -
 -static bag_t threadbag[NUMTHREADS + 1];
 -
 -typedef struct cvthing_t_ cvthing_t;
 -
 -struct cvthing_t_ {
 -  pthread_cond_t notbusy;
 -  pthread_mutex_t lock;
 -  int shared;
 -};
 -
 -static cvthing_t cvthing = {
 -  PTHREAD_COND_INITIALIZER,
 -  PTHREAD_MUTEX_INITIALIZER,
 -  0
 -};
 -
 -static pthread_mutex_t start_flag = PTHREAD_MUTEX_INITIALIZER;
 -
 -static struct timespec abstime = { 0, 0 };
 -
 -static int awoken;
 -
 -static void *
 -mythread(void * arg)
 -{
 -  bag_t * bag = (bag_t *) arg;
 -
 -  assert(bag == &threadbag[bag->threadnum]);
 -  assert(bag->started == 0);
 -  bag->started = 1;
 -
 -  /* Wait for the start gun */
 -  assert(pthread_mutex_lock(&start_flag) == 0);
 -  assert(pthread_mutex_unlock(&start_flag) == 0);
 -
 -  assert(pthread_mutex_lock(&cvthing.lock) == 0);
 -
 -#ifdef _MSC_VER
 -#pragma inline_depth(0)
 -#endif
 -  pthread_cleanup_push(pthread_mutex_unlock, (void *) &cvthing.lock);
 -
 -  while (! (cvthing.shared > 0))
 -    assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
 -
 -  pthread_cleanup_pop(0);
 -#ifdef _MSC_VER
 -#pragma inline_depth()
 -#endif
 -
 -  assert(cvthing.shared > 0);
 -
 -  awoken++;
 -
 -  assert(pthread_mutex_unlock(&cvthing.lock) == 0);
 -
 -  return (void *) 0;
 -}
 -
 -int
 -main()
 -{
 -  int failed = 0;
 -  int i;
 -  int first, last;
 -  pthread_t t[NUMTHREADS + 1];
 -
 -  struct _timeb currSysTime;
 -  const DWORD NANOSEC_PER_MILLISEC = 1000000;
 -
 -  assert((t[0] = pthread_self()).p != NULL);
 -
 -  assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER);
 -
 -  assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER);
 -
 -  _ftime(&currSysTime);
 -
 -  abstime.tv_sec = currSysTime.time;
 -  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -
 -  abstime.tv_sec += 10;
 -
 -  assert((t[0] = pthread_self()).p != NULL);
 -
 -  awoken = 0;
 -
 -  for (first = 1, last = NUMTHREADS / 2;
 -       first < NUMTHREADS;
 -       first = last + 1, last = NUMTHREADS)
 -    {
 -      assert(pthread_mutex_lock(&start_flag) == 0);
 -
 -      for (i = first; i <= last; i++)
 -	{
 -	  threadbag[i].started = 0;
 -	  threadbag[i].threadnum = i;
 -	  assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0);
 -	}
 -
 -      /*
 -       * Code to control or munipulate child threads should probably go here.
 -       */
 -      cvthing.shared = 0;
 -
 -      assert(pthread_mutex_unlock(&start_flag) == 0);
 -
 -      /*
 -       * Give threads time to start.
 -       */
 -      Sleep(100);
 -
 -      assert(pthread_mutex_lock(&cvthing.lock) == 0);
 -      cvthing.shared++;
 -      assert(pthread_mutex_unlock(&cvthing.lock) == 0);
 -
 -      assert(pthread_cond_broadcast(&cvthing.notbusy) == 0);
 -
 -      /*
 -       * Give threads time to complete.
 -       */
 -      for (i = first; i <= last; i++)
 -	{
 -	  assert(pthread_join(t[i], NULL) == 0);
 -	}
 -
 -      assert(awoken == (i - 1));
 -    }
 -
 -
 -  /*
 -   * Standard check that all threads started.
 -   */
 -  for (i = 1; i <= NUMTHREADS; i++)
 -    { 
 -      failed = !threadbag[i].started;
 -
 -      if (failed)
 -	{
 -	  fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started);
 -	}
 -    }
 -
 -  /* 
 -   * Cleanup the CV.
 -   */
 -  
 -  assert(pthread_mutex_destroy(&cvthing.lock) == 0);
 -
 -  assert(cvthing.lock == NULL);
 -
 -  assert(pthread_cond_destroy(&cvthing.notbusy) == 0);
 -
 -  assert(cvthing.notbusy == NULL);
 -
 -  assert(!failed);
 -
 -  /*
 -   * Check any results here.
 -   */
 -
 -  assert(awoken == NUMTHREADS);
 -
 -  /*
 -   * Success.
 -   */
 -  return 0;
 -}
 +/* + * File: condvar8.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test multiple pthread_cond_broadcasts. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * -  + * + * Features Tested: + * -  + * + * Cases Tested: + * -  + * + * Description: + * - Make NUMTHREADS threads wait on CV, broadcast signal them, and then repeat. + * + * Environment: + * -  + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * -  + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include <sys/timeb.h> + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { +  NUMTHREADS = 5 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { +  int threadnum; +  int started; +  /* Add more per-thread state variables here */ +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +typedef struct cvthing_t_ cvthing_t; + +struct cvthing_t_ { +  pthread_cond_t notbusy; +  pthread_mutex_t lock; +  int shared; +}; + +static cvthing_t cvthing = { +  PTHREAD_COND_INITIALIZER, +  PTHREAD_MUTEX_INITIALIZER, +  0 +}; + +static pthread_mutex_t start_flag = PTHREAD_MUTEX_INITIALIZER; + +static struct timespec abstime = { 0, 0 }; + +static int awoken; + +static void * +mythread(void * arg) +{ +  bag_t * bag = (bag_t *) arg; + +  assert(bag == &threadbag[bag->threadnum]); +  assert(bag->started == 0); +  bag->started = 1; + +  /* Wait for the start gun */ +  assert(pthread_mutex_lock(&start_flag) == 0); +  assert(pthread_mutex_unlock(&start_flag) == 0); + +  assert(pthread_mutex_lock(&cvthing.lock) == 0); + +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif +  pthread_cleanup_push(pthread_mutex_unlock, (void *) &cvthing.lock); + +  while (! (cvthing.shared > 0)) +    assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0); + +  pthread_cleanup_pop(0); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + +  assert(cvthing.shared > 0); + +  awoken++; + +  assert(pthread_mutex_unlock(&cvthing.lock) == 0); + +  return (void *) 0; +} + +int +main() +{ +  int failed = 0; +  int i; +  int first, last; +  pthread_t t[NUMTHREADS + 1]; + +  struct _timeb currSysTime; +  const DWORD NANOSEC_PER_MILLISEC = 1000000; + +  assert((t[0] = pthread_self()).p != NULL); + +  assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER); + +  assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER); + +  _ftime(&currSysTime); + +  abstime.tv_sec = currSysTime.time; +  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + +  abstime.tv_sec += 10; + +  assert((t[0] = pthread_self()).p != NULL); + +  awoken = 0; + +  for (first = 1, last = NUMTHREADS / 2; +       first < NUMTHREADS; +       first = last + 1, last = NUMTHREADS) +    { +      assert(pthread_mutex_lock(&start_flag) == 0); + +      for (i = first; i <= last; i++) +	{ +	  threadbag[i].started = 0; +	  threadbag[i].threadnum = i; +	  assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); +	} + +      /* +       * Code to control or munipulate child threads should probably go here. +       */ +      cvthing.shared = 0; + +      assert(pthread_mutex_unlock(&start_flag) == 0); + +      /* +       * Give threads time to start. +       */ +      Sleep(100); + +      assert(pthread_mutex_lock(&cvthing.lock) == 0); +      cvthing.shared++; +      assert(pthread_mutex_unlock(&cvthing.lock) == 0); + +      assert(pthread_cond_broadcast(&cvthing.notbusy) == 0); + +      /* +       * Give threads time to complete. +       */ +      for (i = first; i <= last; i++) +	{ +	  assert(pthread_join(t[i], NULL) == 0); +	} + +      assert(awoken == (i - 1)); +    } + + +  /* +   * Standard check that all threads started. +   */ +  for (i = 1; i <= NUMTHREADS; i++) +    {  +      failed = !threadbag[i].started; + +      if (failed) +	{ +	  fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); +	} +    } + +  /*  +   * Cleanup the CV. +   */ +   +  assert(pthread_mutex_destroy(&cvthing.lock) == 0); + +  assert(cvthing.lock == NULL); + +  assert(pthread_cond_destroy(&cvthing.notbusy) == 0); + +  assert(cvthing.notbusy == NULL); + +  assert(!failed); + +  /* +   * Check any results here. +   */ + +  assert(awoken == NUMTHREADS); + +  /* +   * Success. +   */ +  return 0; +} diff --git a/tests/condvar9.c b/tests/condvar9.c index 6610af7..c751271 100644 --- a/tests/condvar9.c +++ b/tests/condvar9.c @@ -1,267 +1,267 @@ -/*
 - * File: condvar9.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Test Synopsis:
 - * - Test multiple pthread_cond_broadcasts with thread cancelation.
 - *
 - * Test Method (Validation or Falsification):
 - * - Validation
 - *
 - * Requirements Tested:
 - * - 
 - *
 - * Features Tested:
 - * - 
 - *
 - * Cases Tested:
 - * - 
 - *
 - * Description:
 - * - Make NUMTHREADS threads wait on CV, cancel one, broadcast signal them,
 - *   and then repeat.
 - *
 - * Environment:
 - * - 
 - *
 - * Input:
 - * - None.
 - *
 - * Output:
 - * - File name, Line number, and failed expression on failure.
 - * - No output on success.
 - *
 - * Assumptions:
 - * - 
 - *
 - * Pass Criteria:
 - * - Process returns zero exit status.
 - *
 - * Fail Criteria:
 - * - Process returns non-zero exit status.
 - */
 -
 -#include "test.h"
 -#include <sys/timeb.h>
 -
 -/*
 - * Create NUMTHREADS threads in addition to the Main thread.
 - */
 -enum {
 -  NUMTHREADS = 9
 -};
 -
 -typedef struct bag_t_ bag_t;
 -struct bag_t_ {
 -  int threadnum;
 -  int started;
 -  int finished;
 -  /* Add more per-thread state variables here */
 -};
 -
 -static bag_t threadbag[NUMTHREADS + 1];
 -
 -typedef struct cvthing_t_ cvthing_t;
 -
 -struct cvthing_t_ {
 -  pthread_cond_t notbusy;
 -  pthread_mutex_t lock;
 -  int shared;
 -};
 -
 -static cvthing_t cvthing = {
 -  PTHREAD_COND_INITIALIZER,
 -  PTHREAD_MUTEX_INITIALIZER,
 -  0
 -};
 -
 -static pthread_mutex_t start_flag = PTHREAD_MUTEX_INITIALIZER;
 -
 -static struct timespec abstime = { 0, 0 };
 -
 -static int awoken;
 -
 -static void *
 -mythread(void * arg)
 -{
 -  bag_t * bag = (bag_t *) arg;
 -
 -  assert(bag == &threadbag[bag->threadnum]);
 -  assert(bag->started == 0);
 -  bag->started = 1;
 -
 -  /* Wait for the start gun */
 -  assert(pthread_mutex_lock(&start_flag) == 0);
 -  assert(pthread_mutex_unlock(&start_flag) == 0);
 -
 -  assert(pthread_mutex_lock(&cvthing.lock) == 0);
 -
 -  /*
 -   * pthread_cond_timedwait is a cancelation point and we're
 -   * going to cancel some threads deliberately.
 -   */
 -#ifdef _MSC_VER
 -#pragma inline_depth(0)
 -#endif
 -  pthread_cleanup_push(pthread_mutex_unlock, (void *) &cvthing.lock);
 -
 -  while (! (cvthing.shared > 0))
 -    assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
 -
 -  pthread_cleanup_pop(0);
 -#ifdef _MSC_VER
 -#pragma inline_depth()
 -#endif
 -
 -  assert(cvthing.shared > 0);
 -
 -  awoken++;
 -  bag->finished = 1;
 -
 -  assert(pthread_mutex_unlock(&cvthing.lock) == 0);
 -
 -  return (void *) 0;
 -}
 -
 -int
 -main()
 -{
 -  int failed = 0;
 -  int i;
 -  int first, last;
 -  int canceledThreads = 0;
 -  pthread_t t[NUMTHREADS + 1];
 -
 -  struct _timeb currSysTime;
 -  const DWORD NANOSEC_PER_MILLISEC = 1000000;
 -
 -  assert((t[0] = pthread_self()).p != NULL);
 -
 -  assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER);
 -
 -  assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER);
 -
 -  _ftime(&currSysTime);
 -
 -  abstime.tv_sec = currSysTime.time;
 -  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
 -
 -  abstime.tv_sec += 5;
 -
 -  assert((t[0] = pthread_self()).p != NULL);
 -
 -  awoken = 0;
 -
 -  for (first = 1, last = NUMTHREADS / 2;
 -       first < NUMTHREADS;
 -       first = last + 1, last = NUMTHREADS)
 -    {
 -      int ct;
 -
 -      assert(pthread_mutex_lock(&start_flag) == 0);
 -
 -      for (i = first; i <= last; i++)
 -	{
 -	  threadbag[i].started = threadbag[i].finished = 0;
 -	  threadbag[i].threadnum = i;
 -	  assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0);
 -	}
 -
 -      /*
 -       * Code to control or munipulate child threads should probably go here.
 -       */
 -      cvthing.shared = 0;
 -
 -      assert(pthread_mutex_unlock(&start_flag) == 0);
 -
 -      /*
 -       * Give threads time to start.
 -       */
 -      Sleep(1000);
 -
 -      ct = (first + last) / 2;
 -      assert(pthread_cancel(t[ct]) == 0);
 -      canceledThreads++;
 -      assert(pthread_join(t[ct], NULL) == 0);
 -
 -      assert(pthread_mutex_lock(&cvthing.lock) == 0);
 -      cvthing.shared++;
 -      assert(pthread_mutex_unlock(&cvthing.lock) == 0);
 -
 -      assert(pthread_cond_broadcast(&cvthing.notbusy) == 0);
 -
 -      /*
 -       * Standard check that all threads started - and wait for them to finish.
 -       */
 -      for (i = first; i <= last; i++)
 -	{ 
 -	  failed = !threadbag[i].started;
 -
 -          if (failed)
 -	    {
 -	      fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started);
 -	    }
 -	  else
 -	    {
 -	      assert(pthread_join(t[i], NULL) == 0 || threadbag[i].finished == 0);
 -//	      fprintf(stderr, "Thread %d: finished %d\n", i, threadbag[i].finished);
 -	    }
 -	}
 -    }
 -
 -  /* 
 -   * Cleanup the CV.
 -   */
 -
 -  assert(pthread_mutex_destroy(&cvthing.lock) == 0);
 -
 -  assert(cvthing.lock == NULL);
 -
 -  assert_e(pthread_cond_destroy(&cvthing.notbusy), ==, 0);
 -
 -  assert(cvthing.notbusy == NULL);
 -
 -  assert(!failed);
 -
 -  /*
 -   * Check any results here.
 -   */
 -
 -  assert(awoken == NUMTHREADS - canceledThreads);
 -
 -  /*
 -   * Success.
 -   */
 -  return 0;
 -}
 +/* + * File: condvar9.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: + * - Test multiple pthread_cond_broadcasts with thread cancelation. + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * -  + * + * Features Tested: + * -  + * + * Cases Tested: + * -  + * + * Description: + * - Make NUMTHREADS threads wait on CV, cancel one, broadcast signal them, + *   and then repeat. + * + * Environment: + * -  + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * -  + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" +#include <sys/timeb.h> + +/* + * Create NUMTHREADS threads in addition to the Main thread. + */ +enum { +  NUMTHREADS = 9 +}; + +typedef struct bag_t_ bag_t; +struct bag_t_ { +  int threadnum; +  int started; +  int finished; +  /* Add more per-thread state variables here */ +}; + +static bag_t threadbag[NUMTHREADS + 1]; + +typedef struct cvthing_t_ cvthing_t; + +struct cvthing_t_ { +  pthread_cond_t notbusy; +  pthread_mutex_t lock; +  int shared; +}; + +static cvthing_t cvthing = { +  PTHREAD_COND_INITIALIZER, +  PTHREAD_MUTEX_INITIALIZER, +  0 +}; + +static pthread_mutex_t start_flag = PTHREAD_MUTEX_INITIALIZER; + +static struct timespec abstime = { 0, 0 }; + +static int awoken; + +static void * +mythread(void * arg) +{ +  bag_t * bag = (bag_t *) arg; + +  assert(bag == &threadbag[bag->threadnum]); +  assert(bag->started == 0); +  bag->started = 1; + +  /* Wait for the start gun */ +  assert(pthread_mutex_lock(&start_flag) == 0); +  assert(pthread_mutex_unlock(&start_flag) == 0); + +  assert(pthread_mutex_lock(&cvthing.lock) == 0); + +  /* +   * pthread_cond_timedwait is a cancelation point and we're +   * going to cancel some threads deliberately. +   */ +#ifdef _MSC_VER +#pragma inline_depth(0) +#endif +  pthread_cleanup_push(pthread_mutex_unlock, (void *) &cvthing.lock); + +  while (! (cvthing.shared > 0)) +    assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0); + +  pthread_cleanup_pop(0); +#ifdef _MSC_VER +#pragma inline_depth() +#endif + +  assert(cvthing.shared > 0); + +  awoken++; +  bag->finished = 1; + +  assert(pthread_mutex_unlock(&cvthing.lock) == 0); + +  return (void *) 0; +} + +int +main() +{ +  int failed = 0; +  int i; +  int first, last; +  int canceledThreads = 0; +  pthread_t t[NUMTHREADS + 1]; + +  struct _timeb currSysTime; +  const DWORD NANOSEC_PER_MILLISEC = 1000000; + +  assert((t[0] = pthread_self()).p != NULL); + +  assert(cvthing.notbusy == PTHREAD_COND_INITIALIZER); + +  assert(cvthing.lock == PTHREAD_MUTEX_INITIALIZER); + +  _ftime(&currSysTime); + +  abstime.tv_sec = currSysTime.time; +  abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; + +  abstime.tv_sec += 5; + +  assert((t[0] = pthread_self()).p != NULL); + +  awoken = 0; + +  for (first = 1, last = NUMTHREADS / 2; +       first < NUMTHREADS; +       first = last + 1, last = NUMTHREADS) +    { +      int ct; + +      assert(pthread_mutex_lock(&start_flag) == 0); + +      for (i = first; i <= last; i++) +	{ +	  threadbag[i].started = threadbag[i].finished = 0; +	  threadbag[i].threadnum = i; +	  assert(pthread_create(&t[i], NULL, mythread, (void *) &threadbag[i]) == 0); +	} + +      /* +       * Code to control or munipulate child threads should probably go here. +       */ +      cvthing.shared = 0; + +      assert(pthread_mutex_unlock(&start_flag) == 0); + +      /* +       * Give threads time to start. +       */ +      Sleep(1000); + +      ct = (first + last) / 2; +      assert(pthread_cancel(t[ct]) == 0); +      canceledThreads++; +      assert(pthread_join(t[ct], NULL) == 0); + +      assert(pthread_mutex_lock(&cvthing.lock) == 0); +      cvthing.shared++; +      assert(pthread_mutex_unlock(&cvthing.lock) == 0); + +      assert(pthread_cond_broadcast(&cvthing.notbusy) == 0); + +      /* +       * Standard check that all threads started - and wait for them to finish. +       */ +      for (i = first; i <= last; i++) +	{  +	  failed = !threadbag[i].started; + +          if (failed) +	    { +	      fprintf(stderr, "Thread %d: started %d\n", i, threadbag[i].started); +	    } +	  else +	    { +	      assert(pthread_join(t[i], NULL) == 0 || threadbag[i].finished == 0); +//	      fprintf(stderr, "Thread %d: finished %d\n", i, threadbag[i].finished); +	    } +	} +    } + +  /*  +   * Cleanup the CV. +   */ + +  assert(pthread_mutex_destroy(&cvthing.lock) == 0); + +  assert(cvthing.lock == NULL); + +  assert_e(pthread_cond_destroy(&cvthing.notbusy), ==, 0); + +  assert(cvthing.notbusy == NULL); + +  assert(!failed); + +  /* +   * Check any results here. +   */ + +  assert(awoken == NUMTHREADS - canceledThreads); + +  /* +   * Success. +   */ +  return 0; +} diff --git a/tests/once4.c b/tests/once4.c index 69e9384..f5be644 100644 --- a/tests/once4.c +++ b/tests/once4.c @@ -1,191 +1,191 @@ -/*
 - * once4.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Create several pthread_once objects and channel several threads
 - * through each. Make the init_routine cancelable and cancel them
 - * waiters waiting. Vary the priorities.
 - *
 - * Depends on API functions:
 - *	pthread_once()
 - *	pthread_create()
 - *      pthread_testcancel()
 - *      pthread_cancel()
 - *      pthread_once()
 - */
 -
 -#include "test.h"
 -
 -#define NUM_THREADS 100 /* Targeting each once control */
 -#define NUM_ONCE    10
 -
 -pthread_once_t o = PTHREAD_ONCE_INIT;
 -pthread_once_t once[NUM_ONCE];
 -
 -typedef struct {
 -  int i;
 -  CRITICAL_SECTION cs;
 -} sharedInt_t;
 -
 -static sharedInt_t numOnce = {0, {0}};
 -static sharedInt_t numThreads = {0, {0}};
 -
 -typedef struct {
 -  int threadnum;
 -  int oncenum;
 -  int myPrio;
 -  HANDLE w32Thread;
 -} bag_t;
 -
 -static bag_t threadbag[NUM_THREADS][NUM_ONCE];
 -
 -CRITICAL_SECTION print_lock;
 -
 -void
 -mycleanupfunc(void * arg)
 -{
 -  bag_t * bag = (bag_t *) arg;
 -  EnterCriticalSection(&print_lock);
 -  /*      once thrd  prio error */
 -  printf("%4d %4d %4d %4d\n",
 -	 bag->oncenum,
 -	 bag->threadnum,
 -	 bag->myPrio,
 -	 bag->myPrio - GetThreadPriority(bag->w32Thread));
 -  LeaveCriticalSection(&print_lock);
 -}
 -
 -void
 -myinitfunc(void)
 -{
 -  EnterCriticalSection(&numOnce.cs);
 -  numOnce.i++;
 -  LeaveCriticalSection(&numOnce.cs);
 -  /* Simulate slow once routine so that following threads pile up behind it */
 -  Sleep(10);
 -  /* test for cancelation late so we're sure to have waiters. */
 -  pthread_testcancel();
 -}
 -
 -void *
 -mythread(void * arg)
 -{
 -  bag_t * bag = (bag_t *) arg;
 -  struct sched_param param;
 -
 -  /*
 -   * Cancel every thread. These threads are deferred cancelable only, so
 -   * only the thread performing the init_routine will see it (there are
 -   * no other cancelation points here). The result will be that every thread
 -   * eventually cancels only when it becomes the new initter.
 -   */
 -  pthread_t self = pthread_self();
 -  bag->w32Thread = pthread_getw32threadhandle_np(self);
 -  /*
 -   * Set priority between -2 and 2 inclusive.
 -   */
 -  bag->myPrio = (bag->threadnum % 5) - 2;
 -  param.sched_priority = bag->myPrio;
 -  pthread_setschedparam(self, SCHED_OTHER, ¶m);
 -
 -  /* Trigger a cancellation at the next cancellation point in this thread */
 -  pthread_cancel(self);
 -#if 0
 -  pthread_cleanup_push(mycleanupfunc, arg);
 -  assert(pthread_once(&once[bag->oncenum], myinitfunc) == 0);
 -  pthread_cleanup_pop(1);
 -#else
 -  assert(pthread_once(&once[bag->oncenum], myinitfunc) == 0);
 -#endif
 -  EnterCriticalSection(&numThreads.cs);
 -  numThreads.i++;
 -  LeaveCriticalSection(&numThreads.cs);
 -  return 0;
 -}
 -
 -int
 -main()
 -{
 -  pthread_t t[NUM_THREADS][NUM_ONCE];
 -  int i, j;
 -  
 -  InitializeCriticalSection(&print_lock);
 -  InitializeCriticalSection(&numThreads.cs);
 -  InitializeCriticalSection(&numOnce.cs);
 -
 -#if 0
 -  /*       once thrd  prio change */
 -  printf("once thrd  prio  error\n");
 -#endif
 -
 -  /*
 -   * Set the priority class to realtime - otherwise normal
 -   * Windows random priority boosting will obscure any problems.
 -   */
 -  SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
 -  /* Set main thread to lower prio than threads */
 -  SetThreadPriority(GetCurrentThread(), -2);
 -
 -  for (j = 0; j < NUM_ONCE; j++)
 -    {
 -      once[j] = o;
 -
 -      for (i = 0; i < NUM_THREADS; i++)
 -        {
 -	  bag_t * bag = &threadbag[i][j];
 -	  bag->threadnum = i;
 -	  bag->oncenum = j;
 -          assert(pthread_create(&t[i][j], NULL, mythread, (void *) bag) == 0);
 -        }
 -    }
 -
 -  for (j = 0; j < NUM_ONCE; j++)
 -    for (i = 0; i < NUM_THREADS; i++)
 -      if (pthread_join(t[i][j], NULL) != 0)
 -        printf("Join failed for [thread,once] = [%d,%d]\n", i, j);
 -
 -  /*
 -   * All threads will cancel, none will return normally from
 -   * pthread_once and so numThreads should never be incremented. However,
 -   * numOnce should be incremented by every thread (NUM_THREADS*NUM_ONCE).
 -   */
 -  assert(numOnce.i == NUM_ONCE * NUM_THREADS);
 -  assert(numThreads.i == 0);
 -
 -  DeleteCriticalSection(&numOnce.cs);
 -  DeleteCriticalSection(&numThreads.cs);
 -  DeleteCriticalSection(&print_lock);
 -
 -  return 0;
 -}
 +/* + * once4.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Create several pthread_once objects and channel several threads + * through each. Make the init_routine cancelable and cancel them + * waiters waiting. Vary the priorities. + * + * Depends on API functions: + *	pthread_once() + *	pthread_create() + *      pthread_testcancel() + *      pthread_cancel() + *      pthread_once() + */ + +#include "test.h" + +#define NUM_THREADS 100 /* Targeting each once control */ +#define NUM_ONCE    10 + +pthread_once_t o = PTHREAD_ONCE_INIT; +pthread_once_t once[NUM_ONCE]; + +typedef struct { +  int i; +  CRITICAL_SECTION cs; +} sharedInt_t; + +static sharedInt_t numOnce = {0, {0}}; +static sharedInt_t numThreads = {0, {0}}; + +typedef struct { +  int threadnum; +  int oncenum; +  int myPrio; +  HANDLE w32Thread; +} bag_t; + +static bag_t threadbag[NUM_THREADS][NUM_ONCE]; + +CRITICAL_SECTION print_lock; + +void +mycleanupfunc(void * arg) +{ +  bag_t * bag = (bag_t *) arg; +  EnterCriticalSection(&print_lock); +  /*      once thrd  prio error */ +  printf("%4d %4d %4d %4d\n", +	 bag->oncenum, +	 bag->threadnum, +	 bag->myPrio, +	 bag->myPrio - GetThreadPriority(bag->w32Thread)); +  LeaveCriticalSection(&print_lock); +} + +void +myinitfunc(void) +{ +  EnterCriticalSection(&numOnce.cs); +  numOnce.i++; +  LeaveCriticalSection(&numOnce.cs); +  /* Simulate slow once routine so that following threads pile up behind it */ +  Sleep(10); +  /* test for cancelation late so we're sure to have waiters. */ +  pthread_testcancel(); +} + +void * +mythread(void * arg) +{ +  bag_t * bag = (bag_t *) arg; +  struct sched_param param; + +  /* +   * Cancel every thread. These threads are deferred cancelable only, so +   * only the thread performing the init_routine will see it (there are +   * no other cancelation points here). The result will be that every thread +   * eventually cancels only when it becomes the new initter. +   */ +  pthread_t self = pthread_self(); +  bag->w32Thread = pthread_getw32threadhandle_np(self); +  /* +   * Set priority between -2 and 2 inclusive. +   */ +  bag->myPrio = (bag->threadnum % 5) - 2; +  param.sched_priority = bag->myPrio; +  pthread_setschedparam(self, SCHED_OTHER, ¶m); + +  /* Trigger a cancellation at the next cancellation point in this thread */ +  pthread_cancel(self); +#if 0 +  pthread_cleanup_push(mycleanupfunc, arg); +  assert(pthread_once(&once[bag->oncenum], myinitfunc) == 0); +  pthread_cleanup_pop(1); +#else +  assert(pthread_once(&once[bag->oncenum], myinitfunc) == 0); +#endif +  EnterCriticalSection(&numThreads.cs); +  numThreads.i++; +  LeaveCriticalSection(&numThreads.cs); +  return 0; +} + +int +main() +{ +  pthread_t t[NUM_THREADS][NUM_ONCE]; +  int i, j; +   +  InitializeCriticalSection(&print_lock); +  InitializeCriticalSection(&numThreads.cs); +  InitializeCriticalSection(&numOnce.cs); + +#if 0 +  /*       once thrd  prio change */ +  printf("once thrd  prio  error\n"); +#endif + +  /* +   * Set the priority class to realtime - otherwise normal +   * Windows random priority boosting will obscure any problems. +   */ +  SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); +  /* Set main thread to lower prio than threads */ +  SetThreadPriority(GetCurrentThread(), -2); + +  for (j = 0; j < NUM_ONCE; j++) +    { +      once[j] = o; + +      for (i = 0; i < NUM_THREADS; i++) +        { +	  bag_t * bag = &threadbag[i][j]; +	  bag->threadnum = i; +	  bag->oncenum = j; +          assert(pthread_create(&t[i][j], NULL, mythread, (void *) bag) == 0); +        } +    } + +  for (j = 0; j < NUM_ONCE; j++) +    for (i = 0; i < NUM_THREADS; i++) +      if (pthread_join(t[i][j], NULL) != 0) +        printf("Join failed for [thread,once] = [%d,%d]\n", i, j); + +  /* +   * All threads will cancel, none will return normally from +   * pthread_once and so numThreads should never be incremented. However, +   * numOnce should be incremented by every thread (NUM_THREADS*NUM_ONCE). +   */ +  assert(numOnce.i == NUM_ONCE * NUM_THREADS); +  assert(numThreads.i == 0); + +  DeleteCriticalSection(&numOnce.cs); +  DeleteCriticalSection(&numThreads.cs); +  DeleteCriticalSection(&print_lock); + +  return 0; +} diff --git a/tests/semaphore1.c b/tests/semaphore1.c index 8ebf365..b5b2050 100644 --- a/tests/semaphore1.c +++ b/tests/semaphore1.c @@ -1,159 +1,159 @@ -/*
 - * File: semaphore1.c
 - *
 - *
 - * --------------------------------------------------------------------------
 - *
 - *      Pthreads-win32 - POSIX Threads Library for Win32
 - *      Copyright(C) 1998 John E. Bossom
 - *      Copyright(C) 1999,2005 Pthreads-win32 contributors
 - * 
 - *      Contact Email: rpj@callisto.canberra.edu.au
 - * 
 - *      The current list of contributors is contained
 - *      in the file CONTRIBUTORS included with the source
 - *      code distribution. The list can also be seen at the
 - *      following World Wide Web location:
 - *      http://sources.redhat.com/pthreads-win32/contributors.html
 - * 
 - *      This library is free software; you can redistribute it and/or
 - *      modify it under the terms of the GNU Lesser General Public
 - *      License as published by the Free Software Foundation; either
 - *      version 2 of the License, or (at your option) any later version.
 - * 
 - *      This library is distributed in the hope that it will be useful,
 - *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 - *      Lesser General Public License for more details.
 - * 
 - *      You should have received a copy of the GNU Lesser General Public
 - *      License along with this library in the file COPYING.LIB;
 - *      if not, write to the Free Software Foundation, Inc.,
 - *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
 - *
 - * --------------------------------------------------------------------------
 - *
 - * Test Synopsis: Verify trywait() returns -1 and sets EAGAIN.
 - * - 
 - *
 - * Test Method (Validation or Falsification):
 - * - Validation
 - *
 - * Requirements Tested:
 - * - 
 - *
 - * Features Tested:
 - * - 
 - *
 - * Cases Tested:
 - * - 
 - *
 - * Description:
 - * - 
 - *
 - * Environment:
 - * - 
 - *
 - * Input:
 - * - None.
 - *
 - * Output:
 - * - File name, Line number, and failed expression on failure.
 - * - No output on success.
 - *
 - * Assumptions:
 - * - 
 - *
 - * Pass Criteria:
 - * - Process returns zero exit status.
 - *
 - * Fail Criteria:
 - * - Process returns non-zero exit status.
 - */
 -
 -#include "test.h"
 -
 -void *
 -thr(void * arg)
 -{
 -  sem_t s;
 -  int result;
 -
 -  assert(sem_init(&s, PTHREAD_PROCESS_PRIVATE, 0) == 0);
 -
 -  assert((result = sem_trywait(&s)) == -1);
 -
 -  if ( result == -1 )
 -  {
 -    int err = errno;
 -    perror("thread: sem_trywait 1: expected error"); // No error
 -    assert(err == EAGAIN);
 -  }
 -  else
 -  {
 -    printf("thread: ok 1\n");
 -  }
 -
 -  assert((result = sem_post(&s)) == 0);
 -
 -  assert((result = sem_trywait(&s)) == 0);
 -
 -  if ( result == -1 )
 -  {
 -    perror("thread: sem_trywait 2");
 -  }
 -  else
 -  {
 -    printf("thread: ok 2\n");
 -  }
 -
 -  assert(sem_post(&s) == 0);
 -
 -  return 0;
 -}
 -
 -
 -int
 -main()
 -{
 -  pthread_t t;
 -  sem_t s;
 -  int result;
 -
 -  assert(pthread_create(&t, NULL, thr, NULL) == 0);
 -  assert(pthread_join(t, (void **)&result) == 0);
 -  assert(result == 0);
 -
 -  assert(sem_init(&s, PTHREAD_PROCESS_PRIVATE, 0) == 0);
 -
 -  assert((result = sem_trywait(&s)) == -1);
 -
 -  if ( result == -1 )
 -  {
 -    int err = errno;
 -    perror("main: sem_trywait 1: expected error"); // No error
 -    assert(err == EAGAIN);
 -  }
 -  else
 -  {
 -    printf("main: ok 1\n");
 -  }
 -
 -  assert((result = sem_post(&s)) == 0);
 -
 -  assert((result = sem_trywait(&s)) == 0);
 -
 -  if ( result == -1 )
 -  {
 -    perror("main: sem_trywait 2");
 -  }
 -  else
 -  {
 -    printf("main: ok 2\n");
 -  }
 -
 -  assert(sem_post(&s) == 0);
 -
 -  return 0;
 -}
 -
 +/* + * File: semaphore1.c + * + * + * -------------------------------------------------------------------------- + * + *      Pthreads-win32 - POSIX Threads Library for Win32 + *      Copyright(C) 1998 John E. Bossom + *      Copyright(C) 1999,2005 Pthreads-win32 contributors + *  + *      Contact Email: rpj@callisto.canberra.edu.au + *  + *      The current list of contributors is contained + *      in the file CONTRIBUTORS included with the source + *      code distribution. The list can also be seen at the + *      following World Wide Web location: + *      http://sources.redhat.com/pthreads-win32/contributors.html + *  + *      This library is free software; you can redistribute it and/or + *      modify it under the terms of the GNU Lesser General Public + *      License as published by the Free Software Foundation; either + *      version 2 of the License, or (at your option) any later version. + *  + *      This library is distributed in the hope that it will be useful, + *      but WITHOUT ANY WARRANTY; without even the implied warranty of + *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + *      Lesser General Public License for more details. + *  + *      You should have received a copy of the GNU Lesser General Public + *      License along with this library in the file COPYING.LIB; + *      if not, write to the Free Software Foundation, Inc., + *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * -------------------------------------------------------------------------- + * + * Test Synopsis: Verify trywait() returns -1 and sets EAGAIN. + * -  + * + * Test Method (Validation or Falsification): + * - Validation + * + * Requirements Tested: + * -  + * + * Features Tested: + * -  + * + * Cases Tested: + * -  + * + * Description: + * -  + * + * Environment: + * -  + * + * Input: + * - None. + * + * Output: + * - File name, Line number, and failed expression on failure. + * - No output on success. + * + * Assumptions: + * -  + * + * Pass Criteria: + * - Process returns zero exit status. + * + * Fail Criteria: + * - Process returns non-zero exit status. + */ + +#include "test.h" + +void * +thr(void * arg) +{ +  sem_t s; +  int result; + +  assert(sem_init(&s, PTHREAD_PROCESS_PRIVATE, 0) == 0); + +  assert((result = sem_trywait(&s)) == -1); + +  if ( result == -1 ) +  { +    int err = errno; +    perror("thread: sem_trywait 1: expected error"); // No error +    assert(err == EAGAIN); +  } +  else +  { +    printf("thread: ok 1\n"); +  } + +  assert((result = sem_post(&s)) == 0); + +  assert((result = sem_trywait(&s)) == 0); + +  if ( result == -1 ) +  { +    perror("thread: sem_trywait 2"); +  } +  else +  { +    printf("thread: ok 2\n"); +  } + +  assert(sem_post(&s) == 0); + +  return 0; +} + + +int +main() +{ +  pthread_t t; +  sem_t s; +  int result; + +  assert(pthread_create(&t, NULL, thr, NULL) == 0); +  assert(pthread_join(t, (void **)&result) == 0); +  assert(result == 0); + +  assert(sem_init(&s, PTHREAD_PROCESS_PRIVATE, 0) == 0); + +  assert((result = sem_trywait(&s)) == -1); + +  if ( result == -1 ) +  { +    int err = errno; +    perror("main: sem_trywait 1: expected error"); // No error +    assert(err == EAGAIN); +  } +  else +  { +    printf("main: ok 1\n"); +  } + +  assert((result = sem_post(&s)) == 0); + +  assert((result = sem_trywait(&s)) == 0); + +  if ( result == -1 ) +  { +    perror("main: sem_trywait 2"); +  } +  else +  { +    printf("main: ok 2\n"); +  } + +  assert(sem_post(&s) == 0); + +  return 0; +} + | 
