summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorrpj <rpj>2000-08-14 03:43:09 +0000
committerrpj <rpj>2000-08-14 03:43:09 +0000
commit16cb1bf22f72db0ac47080e364ffbc79a3ec174a (patch)
tree694bb9faa936d287344b3cf467539f1e0b85ac05 /tests
parent8fac2c3753ca6c92cfa30b72431a6da46e48fa7f (diff)
2000-08-13 Ross Johnson <rpj@special.ise.canberra.edu.au>
* errno.c: Add _MD precompile condition; thus far had no effect when using /MD compile option but I thnk it should be there. * exit.c: Add __cplusplus to various #if lines; was compiling SEH code even when VC++ had C++ compile options. * private.c: ditto. * create.c (pthread_create): Add PT_STDCALL macro to function pointer arg in _beginthread(). * pthread.h: PT_STDCALL really does need to be defined in both this and impliment.h; don't set it to __cdecl - this macro is only used to extend function pointer casting for functions that will be passed as parameters. (~PThreadCleanup): add cast and group expression. (_errno): Add _MD compile conditional. (PtW32NoCatchWarn): Change pragma message. * implement.h: Move and change PT_STDCALL define. * need_errno.h: Add _MD to compilation conditional. * GNUmakefile: Substantial rewrite for new naming convention; set for nil optimisation (turn it up when we have a working library build; add target "fake.a" to build a libpthreadw32.a from the VC++ built DLL pthreadVCE.dll. * pthread.def (LIBRARY): Don't specify in the .def file - it is specified on the linker command line since we now use the same .def file for variously named .dlls. * Makefile: Substantial rewrite for new naming convention; default nmake target only issues a help message; run nmake with specific target corresponding to the EH scheme being used. * README: Update information; add naming convention explanation. * ANNOUNCE: Update information. 2000-08-12 Ross Johnson <rpj@special.ise.canberra.edu.au> * pthread.h: Add compile-time message when using MSC_VER compiler and C++ EH to warn application programmers to use PtW32Catch instead of catch(...) if they want cancelation and pthread_exit to work. * implement.h: Remove #include <semaphore.h>; we use our own local semaphore.h. tests/ChangeLog: 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.
Diffstat (limited to 'tests')
-rw-r--r--tests/ChangeLog43
-rw-r--r--tests/GNUmakefile22
-rw-r--r--tests/Makefile142
-rw-r--r--tests/README28
-rw-r--r--tests/cancel3.c2
-rw-r--r--tests/cleanup1.c3
-rw-r--r--tests/cleanup2.c2
-rw-r--r--tests/cleanup3.c2
-rw-r--r--tests/condvar3.c2
-rw-r--r--tests/condvar4.c2
-rw-r--r--tests/condvar5.c2
-rw-r--r--tests/condvar6.c2
-rw-r--r--tests/condvar7.c2
-rw-r--r--tests/condvar8.c2
-rw-r--r--tests/condvar9.c2
-rw-r--r--tests/exception1.c8
-rw-r--r--tests/exit1.c1
-rw-r--r--tests/rwlock6.c6
18 files changed, 184 insertions, 89 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 7d7cd4a..412c09c 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,46 @@
+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
diff --git a/tests/GNUmakefile b/tests/GNUmakefile
index 3d86a0f..e8438e2 100644
--- a/tests/GNUmakefile
+++ b/tests/GNUmakefile
@@ -13,14 +13,14 @@ ECHO = @echo
#
GLANG = c++
CC = gcc
-CFLAGS = -g -O2 -mthreads -UNDEBUG -Wall -x $(GLANG)
+CFLAGS = -g -O0 -mthreads -UNDEBUG -Wall -x $(GLANG)
BUILD_DIR = ..
INCLUDES = -I.
-LIBS = -L. -lpthread32
+LIBS = -L. -lpthreadw32
HDR = pthread.h semaphore.h sched.h
-LIB = libpthread32.a
-DLL = pthread.dll
+LIB = libpthreadw32.a
+DLL = pthreadGCE.dll
COPYFILES = $(HDR) $(LIB) $(DLL)
@@ -35,7 +35,8 @@ TESTS = loadfree \
condvar3 condvar4 condvar5 condvar6 condvar7 condvar8 condvar9 \
errno1 \
rwlock1 rwlock2 rwlock3 rwlock4 rwlock5 rwlock6 \
- context1 cancel3 cancel4 cleanup1 cleanup2 cleanup3 \
+ context1 cancel3 cancel4 \
+ cleanup0 cleanup1 cleanup2 cleanup3 \
exception1
PASSES = $(TESTS:%=%.pass)
@@ -43,7 +44,7 @@ PASSES = $(TESTS:%=%.pass)
all: $(PASSES)
@ $(ECHO) ALL TESTS PASSED! Congratulations!
-loadfree.pass:
+loadfree.pass: pthread.dll
mutex1.pass:
mutex2.pass:
exit1.pass:
@@ -82,7 +83,8 @@ rwlock6.pass: rwlock5.pass
context1.pass: cancel2.pass
cancel3.pass: context1.pass
cancel4.pass: cancel3.pass
-cleanup1.pass: cancel4.pass
+cleanup0.pass: cancel4.pass
+cleanup1.pass: cleanup0.pass
cleanup2.pass: cleanup1.pass
cleanup3.pass: cleanup2.pass
exception1.pass: cancel4.pass
@@ -105,13 +107,19 @@ $(COPYFILES):
@ $(ECHO) Copying $@
@ $(CP) $(BUILD_DIR)\$@ .
+pthread.dll:
+ @ $(CP) $(DLL) $@
+
clean:
- $(RM) *.dll
+ - $(RM) *.lib
- $(RM) pthread.h
- $(RM) semaphore.h
- $(RM) sched.h
- $(RM) *.a
- $(RM) *.e
+ - $(RM) *.obj
+ - $(RM) *.pdb
- $(RM) *.exe
- $(RM) *.pass
diff --git a/tests/Makefile b/tests/Makefile
index 8143b46..08cfcce 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -9,26 +9,35 @@ TOUCH = echo Passed >
ECHO = @echo
CPHDR = pthread.h semaphore.h sched.h
-CPLIB = pthread.lib
-CPDLL = pthread.dll
-CFLAGS= /W3 /MT /nologo /Yd /Zi -D_WIN32_WINNT=0x400 -DSTDCALL=_stdcall
+# C++ Exceptions
+VCEFLAGS = /GX /TP /DPtW32NoCatchWarn
+VCELIB = pthreadVCE.lib
+VCEDLL = pthreadVCE.dll
+# Structured Exceptions
+VSEFLAGS =
+VSELIB = pthreadVSE.lib
+VSEDLL = pthreadVSE.dll
+
+CFLAGS= /W3 /WX /MT /nologo /Yd /Zi -D_WIN32_WINNT=0x400
LFLAGS= /INCREMENTAL:NO
-LIBS = .\pthread.lib
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= loadfree.pass \
- mutex1.pass condvar1.pass condvar2.pass \
+ mutex1.pass mutex2.pass mutex3.pass \
+ condvar1.pass condvar2.pass \
exit1.pass create1.pass equal1.pass \
exit2.pass exit3.pass \
join0.pass join1.pass join2.pass \
- mutex2.pass mutex3.pass \
count1.pass once1.pass tsd1.pass \
self1.pass self2.pass \
cancel1.pass cancel2.pass \
@@ -38,78 +47,53 @@ PASSES= loadfree.pass \
errno1.pass \
rwlock1.pass rwlock2.pass rwlock3.pass rwlock4.pass rwlock5.pass rwlock6.pass \
context1.pass \
- cancel3.pass cancel4.pass cleanup1.pass \
- cleanup2.pass cleanup3.pass \
+ cancel3.pass cancel4.pass \
+ cleanup0.pass cleanup1.pass cleanup2.pass cleanup3.pass \
exception1.pass
-all: $(CPLIB) $(CPDLL) $(CPHDR) $(PASSES)
- @ $(ECHO) ALL TESTS PASSED! Congratulations!
+all:
+ @ $(ECHO) Run one of the following command lines:
+ @ $(ECHO) nmake clean VCE (to test using dll with C++ exception handling)
+ @ $(ECHO) nmake clean VSE (to test using dll with structured exception handling)
-loadfree.pass: loadfree.exe
-mutex1.pass: mutex1.exe
-mutex2.pass: mutex2.exe
-exit1.pass: exit1.exe
-condvar1.pass: condvar1.exe
-self1.pass: self1.exe
-condvar2.pass: condvar2.exe condvar1.pass
-create1.pass: create1.exe mutex2.pass
-cancel1.pass: cancel1.exe create1.pass
-cancel2.pass: cancel2.exe cancel1.pass
-mutex3.pass: mutex3.exe create1.pass
-equal1.pass: equal1.exe create1.pass
-exit2.pass: exit2.exe create1.pass
-exit3.pass: exit3.exe create1.pass
-join0.pass: join0.exe create1.pass
-join1.pass: join1.exe create1.pass
-join2.pass: join2.exe create1.pass
-count1.pass: count1.exe join1.pass
-once1.pass: once1.exe create1.pass
-tsd1.pass: tsd1.exe join1.pass
-self2.pass: self2.exe create1.pass
-eyal1.pass: eyal1.exe tsd1.pass
-condvar3.pass: condvar3.exe create1.pass
-condvar4.pass: condvar4.exe create1.pass
-condvar5.pass: condvar5.exe condvar4.pass
-condvar6.pass: condvar6.exe condvar5.pass
-condvar7.pass: condvar7.exe condvar6.pass cleanup1.pass
-condvar8.pass: condvar8.exe condvar7.pass
-condvar9.pass: condvar9.exe condvar8.pass
-errno1.pass: errno1.exe mutex3.pass
-rwlock1.pass: rwlock1.exe condvar6.pass
-rwlock2.pass: rwlock2.exe rwlock1.pass
-rwlock3.pass: rwlock3.exe rwlock2.pass
-rwlock4.pass: rwlock4.exe rwlock3.pass
-rwlock5.pass: rwlock5.exe rwlock4.pass
-rwlock6.pass: rwlock6.exe rwlock5.pass
-context1.pass: context1.exe cancel2.pass
-cancel3.pass: cancel3.exe context1.pass
-cancel4.pass: cancel4.exe cancel3.pass
-cleanup1.pass: cleanup1.exe cancel4.pass
-cleanup2.pass: cleanup2.exe cleanup1.pass
-cleanup3.pass: cleanup3.exe cleanup2.pass
-exception1.pass: exception1.exe cancel4.pass
+auto: clean VCE clean VSE
+
+tests: $(CPLIB) $(CPDLL) $(CPHDR) $(PASSES)
+ @ $(ECHO) ALL TESTS PASSED! Congratulations!
$(PASSES): $*.exe
+ @ $(ECHO) ... Running $(TEST) test: $*.exe
@ .\$*.exe
- @ $(ECHO) Passed
+ @ $(ECHO) ...... Passed
@ $(TOUCH) $*.pass
+VCE:
+ @ nmake TEST="$@" CPLIB="$(VCELIB)" CPDLL="$(VCEDLL)" EHFLAGS="$(VCEFLAGS)" tests
+
+VSE:
+ @ nmake TEST="$@" CPLIB="$(VSELIB)" CPDLL="$(VSEDLL)" EHFLAGS="$(VSEFLAGS)" tests
+
.c.exe:
- @ $(CC) $(CFLAGS) $(INCLUDES) $< /Fe$@ /link $(LFLAGS) $(LIBS)
+ @ $(ECHO) Compiling $@
+ @ $(CC) $(EHFLAGS) $(CFLAGS) $(INCLUDES) $< /Fe$@ /link $(LFLAGS) $(CPLIB)
.c.pre:
- @ $(CC) /E $(CFLAGS) $(INCLUDES) /Fe$@ $<
+ @ $(CC) /E $(EHFLAGS) $(CFLAGS) $(INCLUDES) /Fe$@ $<
$(COPYFILES):
@ $(ECHO) Copying $@
@ $(CP) $(BUILD_DIR)\$@ .
+pthread.dll:
+ @ $(CP) $(CPDLL) $*.dll
+ @ $(CP) $(CPLIB) $*.lib
+
clean:
- $(RM) *.dll
+ - $(RM) *.lib
- $(RM) pthread.h
- $(RM) semaphore.h
- $(RM) sched.h
- - $(RM) *.lib
- $(RM) *.e
- $(RM) *.obj
- $(RM) *.pdb
@@ -117,3 +101,47 @@ clean:
- $(RM) *.exe
- $(RM) *.pass
+loadfree.pass: pthread.dll
+mutex1.pass:
+mutex2.pass:
+exit1.pass:
+condvar1.pass:
+self1.pass:
+condvar2.pass: condvar1.pass
+create1.pass: mutex2.pass
+cancel1.pass: create1.pass
+cancel2.pass: cancel1.pass
+mutex3.pass: create1.pass
+equal1.pass: create1.pass
+exit2.pass: create1.pass
+exit3.pass: create1.pass
+join0.pass: create1.pass
+join1.pass: create1.pass
+join2.pass: create1.pass
+count1.pass: join1.pass
+once1.pass: create1.pass
+tsd1.pass: join1.pass
+self2.pass: create1.pass
+eyal1.pass: tsd1.pass
+condvar3.pass: create1.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
+errno1.pass: mutex3.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
+context1.pass: cancel2.pass
+cancel3.pass: context1.pass
+cancel4.pass: cancel3.pass
+cleanup0.pass: cancel4.pass
+cleanup1.pass: cleanup0.pass
+cleanup2.pass: cleanup1.pass
+cleanup3.pass: cleanup2.pass
+exception1.pass: cancel4.pass
diff --git a/tests/README b/tests/README
index fa3c0bf..b767f89 100644
--- a/tests/README
+++ b/tests/README
@@ -1,13 +1,31 @@
Running test cases in this directory
------------------------------------
-runtest.bat is included for compiling and running tests.
+These make scripts expect to be able to copy the dll, libarary
+and header files from this directory's parent directory,
+which should be the pthreads-win32 source directory.
-Usage: runtest cl|gcc testname
+MS VC++ nmake
+-------------
- "cl" calls the VC++ cl compiler/linker
- "gcc" calls the GNU gcc compiler/linker
- "testname" is the name of the C source file without the .c
+Run the target corresponding to the DLL version being tested:
+
+nmake clean VCE
+
+or:
+
+nmake clean VSE
+
+
+GNU G++ make
+------------
+
+Run "make clean" and then "make". See the "Known bugs" section
+in ..\README.
+
+
+Writing Test Cases
+------------------
Tests written in this test suite should behave in the following manner:
diff --git a/tests/cancel3.c b/tests/cancel3.c
index e2ffc2b..1a39ecb 100644
--- a/tests/cancel3.c
+++ b/tests/cancel3.c
@@ -60,8 +60,6 @@ struct bag_t_ {
static bag_t threadbag[NUMTHREADS + 1];
-static pthread_mutex_t waitLock = PTHREAD_MUTEX_INITIALIZER;
-
void *
mythread(void * arg)
{
diff --git a/tests/cleanup1.c b/tests/cleanup1.c
index 2c8e9a6..68478fa 100644
--- a/tests/cleanup1.c
+++ b/tests/cleanup1.c
@@ -159,10 +159,9 @@ main()
if (fail)
{
- fprintf(stderr, "Thread %d: started %d: count %d: result %d\n",
+ fprintf(stderr, "Thread %d: started %d: result %d\n",
i,
threadbag[i].started,
- threadbag[i].count,
result);
}
failed = (failed || fail);
diff --git a/tests/cleanup2.c b/tests/cleanup2.c
index 515f676..6d07d53 100644
--- a/tests/cleanup2.c
+++ b/tests/cleanup2.c
@@ -135,7 +135,7 @@ main()
int fail = 0;
int result = 0;
- assert(pthread_join(t[i], (void *) &result) == 0);
+ assert(pthread_join(t[i], (void **) &result) == 0);
fail = (result != 0);
diff --git a/tests/cleanup3.c b/tests/cleanup3.c
index 4f05eea..56b1a8f 100644
--- a/tests/cleanup3.c
+++ b/tests/cleanup3.c
@@ -138,7 +138,7 @@ main()
int fail = 0;
int result = 0;
- assert(pthread_join(t[i], (void *) &result) == 0);
+ assert(pthread_join(t[i], (void **) &result) == 0);
fail = (result != 0);
diff --git a/tests/condvar3.c b/tests/condvar3.c
index a25c15a..673feb5 100644
--- a/tests/condvar3.c
+++ b/tests/condvar3.c
@@ -96,7 +96,7 @@ main()
abstime.tv_sec += 5;
- while (! shared > 0)
+ while (! (shared > 0))
assert(pthread_cond_timedwait(&cv, &mutex, &abstime) == 0);
assert(shared > 0);
diff --git a/tests/condvar4.c b/tests/condvar4.c
index 4729063..2ef1d79 100644
--- a/tests/condvar4.c
+++ b/tests/condvar4.c
@@ -118,7 +118,7 @@ main()
abstime.tv_sec += 5;
- while (! cvthing.shared > 0)
+ while (! (cvthing.shared > 0))
assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
assert(cvthing.shared > 0);
diff --git a/tests/condvar5.c b/tests/condvar5.c
index d0d15a1..56510c5 100644
--- a/tests/condvar5.c
+++ b/tests/condvar5.c
@@ -117,7 +117,7 @@ main()
abstime.tv_sec += 5;
- while (! cvthing.shared > 0)
+ while (! (cvthing.shared > 0))
assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
assert(cvthing.shared > 0);
diff --git a/tests/condvar6.c b/tests/condvar6.c
index 7348346..dc29f48 100644
--- a/tests/condvar6.c
+++ b/tests/condvar6.c
@@ -93,7 +93,7 @@ mythread(void * arg)
assert(pthread_mutex_lock(&cvthing.lock) == 0);
- while (! cvthing.shared > 0)
+ while (! (cvthing.shared > 0))
assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
assert(cvthing.shared > 0);
diff --git a/tests/condvar7.c b/tests/condvar7.c
index 3745f02..23e2441 100644
--- a/tests/condvar7.c
+++ b/tests/condvar7.c
@@ -95,7 +95,7 @@ mythread(void * arg)
pthread_cleanup_push(pthread_mutex_unlock, (void *) &cvthing.lock);
- while (! cvthing.shared > 0)
+ while (! (cvthing.shared > 0))
assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
pthread_cleanup_pop(0);
diff --git a/tests/condvar8.c b/tests/condvar8.c
index d1076e3..9e63b79 100644
--- a/tests/condvar8.c
+++ b/tests/condvar8.c
@@ -99,7 +99,7 @@ mythread(void * arg)
*/
pthread_cleanup_push(pthread_mutex_unlock, (void *) &cvthing.lock);
- while (! cvthing.shared > 0)
+ while (! (cvthing.shared > 0))
assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
pthread_cleanup_pop(0);
diff --git a/tests/condvar9.c b/tests/condvar9.c
index 7d24d09..6591554 100644
--- a/tests/condvar9.c
+++ b/tests/condvar9.c
@@ -100,7 +100,7 @@ mythread(void * arg)
*/
pthread_cleanup_push(pthread_mutex_unlock, (void *) &cvthing.lock);
- while (! cvthing.shared > 0)
+ while (! (cvthing.shared > 0))
assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
pthread_cleanup_pop(0);
diff --git a/tests/exception1.c b/tests/exception1.c
index eddd8fb..609e5ed 100644
--- a/tests/exception1.c
+++ b/tests/exception1.c
@@ -136,8 +136,8 @@ canceledThread(void * arg)
for (count = 0; count < 100; count++)
Sleep(100);
}
-#if defined(_MSC_VER)
- AltCatchAll
+#if defined(PtW32CatchAll)
+ PtW32CatchAll
#else
catch (...)
#endif
@@ -192,13 +192,13 @@ main()
int result = 0;
/* Canceled thread */
- assert(pthread_join(ct[i], (void *) &result) == 0);
+ assert(pthread_join(ct[i], (void **) &result) == 0);
fail = (result != (int) PTHREAD_CANCELED);
failed = (failed || fail);
/* Exception thread */
- assert(pthread_join(et[i], (void *) &result) == 0);
+ assert(pthread_join(et[i], (void **) &result) == 0);
fail = (result != ((int) PTHREAD_CANCELED + 2));
failed = (failed || fail);
diff --git a/tests/exit1.c b/tests/exit1.c
index 251a46c..06b7692 100644
--- a/tests/exit1.c
+++ b/tests/exit1.c
@@ -14,4 +14,5 @@ main(int argc, char * argv[])
/* Not reached */
assert(0);
+ return 0;
}
diff --git a/tests/rwlock6.c b/tests/rwlock6.c
index 38bc419..7daccd7 100644
--- a/tests/rwlock6.c
+++ b/tests/rwlock6.c
@@ -53,9 +53,9 @@ main()
Sleep(200);
assert(pthread_create(&wrt2, NULL, wrfunc, NULL) == 0);
- assert(pthread_join(wrt1, (void *) &wr1Result) == 0);
- assert(pthread_join(wrt2, (void *) &wr2Result) == 0);
- assert(pthread_join(rdt, (void *) &rdResult) == 0);
+ assert(pthread_join(wrt1, (void **) &wr1Result) == 0);
+ assert(pthread_join(wrt2, (void **) &wr2Result) == 0);
+ assert(pthread_join(rdt, (void **) &rdResult) == 0);
assert(wr1Result == 10);
assert(wr2Result == 20);