summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrpj <rpj>1999-09-16 15:04:39 +0000
committerrpj <rpj>1999-09-16 15:04:39 +0000
commit99bf48ba0f224f965c99e632656190a86ad099b9 (patch)
tree85593be83a4ec1542b7af58507f449459b063457
parentf20ec5ec3497e7d1a8301d3c7ec6652dab1c3247 (diff)
Sep 16 1999 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* rwlock6.c: New test.
-rw-r--r--tests/ChangeLog4
-rw-r--r--tests/runall.bat1
-rw-r--r--tests/rwlock6.c65
3 files changed, 70 insertions, 0 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 7150435..2283e3a 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,7 @@
+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.
diff --git a/tests/runall.bat b/tests/runall.bat
index daa6c7b..a1e3862 100644
--- a/tests/runall.bat
+++ b/tests/runall.bat
@@ -30,3 +30,4 @@ call runtest cl rwlock2
call runtest cl rwlock3
call runtest cl rwlock4
call runtest cl rwlock5
+call runtest cl rwlock6
diff --git a/tests/rwlock6.c b/tests/rwlock6.c
new file mode 100644
index 0000000..38bc419
--- /dev/null
+++ b/tests/rwlock6.c
@@ -0,0 +1,65 @@
+/*
+ * rwlock6.c
+ *
+ * Check that writer locks have priority.
+ *
+ * Depends on API functions:
+ * pthread_rwlock_rdlock()
+ * pthread_rwlock_wrlock()
+ * pthread_rwlock_unlock()
+ */
+
+#include "test.h"
+
+static pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER;
+
+static int bankAccount;
+
+void * wrfunc(void * arg)
+{
+ assert(pthread_rwlock_wrlock(&rwlock1) == 0);
+ Sleep(1000);
+ bankAccount += 10;
+ assert(pthread_rwlock_unlock(&rwlock1) == 0);
+
+ return((void *) bankAccount);
+}
+
+void * rdfunc(void * arg)
+{
+ int ba = 0;
+
+ assert(pthread_rwlock_rdlock(&rwlock1) == 0);
+ ba = bankAccount;
+ assert(pthread_rwlock_unlock(&rwlock1) == 0);
+
+ ba += 10;
+ return((void *) ba);
+}
+
+int
+main()
+{
+ pthread_t wrt1;
+ pthread_t wrt2;
+ pthread_t rdt;
+ int wr1Result = 0;
+ int wr2Result = 0;
+ int rdResult = 0;
+
+ assert(pthread_create(&wrt1, NULL, wrfunc, NULL) == 0);
+ Sleep(200);
+ assert(pthread_create(&rdt, NULL, rdfunc, NULL) == 0);
+ 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(wr1Result == 10);
+ assert(wr2Result == 20);
+ assert(rdResult == 30);
+
+ return 0;
+}