summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorrpj <rpj>1999-03-11 15:06:20 +0000
committerrpj <rpj>1999-03-11 15:06:20 +0000
commitb14e60afab45a7bc5eff231f408505a1bec6b436 (patch)
tree4f9980eea7b03957476af05736a2c8364027d9c3 /tests
parent52f7c3f5ef6d9b70ec385fb390bf27962e68ee3d (diff)
Thu Mar 11 09:01:48 1999 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* pthread.h (pthread_mutex_t): revert to (pthread_mutex_t *); define a value to serve as PTHREAD_MUTEX_INITIALIZER. (pthread_mutex_t_): remove staticinit and valid elements. (pthread_cond_t): revert to (pthread_cond_t_ *); define a value to serve as PTHREAD_COND_INITIALIZER. (pthread_cond_t_): remove staticinit and valid elements. * mutex.c (pthread_mutex_t args): adjust indirection of references. (all functions): check for PTHREAD_MUTEX_INITIALIZER value; check for NULL (invalid). * condvar.c (pthread_cond_t args): adjust indirection of references. (all functions): check for PTHREAD_COND_INITIALIZER value; check for NULL (invalid). Wed Mar 10 17:18:12 1999 Ross Johnson <rpj@ixobrychus.canberra.edu.au> * misc.c (CancelableWait): Undo changes from Mar 8 and 7. tests/ChangeLog Fri Mar 12 08:34:15 1999 Ross Johnson <rpj@ixobrychus.canberra.edu.au> * eyal1.c (main): Fix trylock loop; was not waiting for thread to lock the "started" mutex.
Diffstat (limited to 'tests')
-rw-r--r--tests/ChangeLog5
-rw-r--r--tests/condvar3.c218
-rw-r--r--tests/condvar4.c239
-rw-r--r--tests/eyal1.c394
-rw-r--r--tests/mutex2.c6
-rw-r--r--tests/tsd1.c4
6 files changed, 448 insertions, 418 deletions
diff --git a/tests/ChangeLog b/tests/ChangeLog
index aef418f..0304802 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,3 +1,8 @@
+Fri Mar 12 08:34:15 1999 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
+
+ * eyal1.c (main): Fix trylock loop; was not waiting for thread to lock
+ the "started" mutex.
+
Sun Mar 7 10:41:52 1999 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* Makefile (condvar3, condvar4): Add tests.
diff --git a/tests/condvar3.c b/tests/condvar3.c
index 8dc56af..27223ab 100644
--- a/tests/condvar3.c
+++ b/tests/condvar3.c
@@ -1,109 +1,109 @@
-/*
- * File: condvar3.c
- *
- * 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>
-
-pthread_cond_t cv;
-pthread_mutex_t mutex;
-
-enum {
- NUMTHREADS = 2 /* Including the primary thread. */
-};
-
-void *
-mythread(void * arg)
-{
- Sleep(1);
-
- assert(pthread_mutex_lock(&mutex) == 0);
-
- assert(pthread_cond_signal(&cv) == 0);
-
- assert(pthread_mutex_unlock(&mutex) == 0);
-
- return 0;
-}
-
-int
-main()
-{
- pthread_t t[NUMTHREADS];
- struct timespec abstime = { 0, 0 };
-#if defined(__MINGW32__)
- struct timeb currSysTime;
-#else
- struct _timeb currSysTime;
-#endif
- const DWORD NANOSEC_PER_MILLISEC = 1000000;
-
- assert((t[0] = pthread_self()) != 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;
-
- assert(pthread_cond_timedwait(&cv, &mutex, &abstime) == 0);
-
- assert(pthread_mutex_unlock(&mutex) == 0);
-
- assert(pthread_cond_destroy(&cv) == 0);
-
- return 0;
-}
+/*
+ * File: condvar3.c
+ *
+ * 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>
+
+pthread_cond_t cv;
+pthread_mutex_t mutex;
+
+enum {
+ NUMTHREADS = 2 /* Including the primary thread. */
+};
+
+void *
+mythread(void * arg)
+{
+ Sleep(1);
+
+ assert(pthread_mutex_lock(&mutex) == 0);
+
+ assert(pthread_cond_signal(&cv) == 0);
+
+ assert(pthread_mutex_unlock(&mutex) == 0);
+
+ return 0;
+}
+
+int
+main()
+{
+ pthread_t t[NUMTHREADS];
+ struct timespec abstime = { 0, 0 };
+#if defined(__MINGW32__)
+ struct timeb currSysTime;
+#else
+ struct _timeb currSysTime;
+#endif
+ const DWORD NANOSEC_PER_MILLISEC = 1000000;
+
+ assert((t[0] = pthread_self()) != 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;
+
+ assert(pthread_cond_timedwait(&cv, &mutex, &abstime) == 0);
+
+ assert(pthread_mutex_unlock(&mutex) == 0);
+
+ assert(pthread_cond_destroy(&cv) == 0);
+
+ return 0;
+}
diff --git a/tests/condvar4.c b/tests/condvar4.c
index 4c5fc38..f93db27 100644
--- a/tests/condvar4.c
+++ b/tests/condvar4.c
@@ -1,121 +1,118 @@
-/*
- * File: condvar1.c
- *
- * 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;
-};
-
-static cvthing_t cvthing = {
- PTHREAD_MUTEX_INITIALIZER,
- PTHREAD_COND_INITIALIZER,
-};
-
-enum {
- NUMTHREADS = 2
-};
-
-void *
-mythread(void * arg)
-{
- assert(pthread_mutex_lock(&cvthing.lock) == 0);
-
- assert(pthread_cond_signal(&cvthing.notbusy) == 0);
-
- assert(pthread_mutex_unlock(&cvthing.lock) == 0);
-
- return 0;
-}
-
-int
-main()
-{
- pthread_t t[NUMTHREADS];
- struct timespec abstime = { 0, 0 };
-#if defined(__MINGW32__)
- struct timeb currSysTime;
-#else
- struct _timeb currSysTime;
-#endif
- const DWORD NANOSEC_PER_MILLISEC = 1000000;
-
- assert(cvthing.notbusy.staticinit == 1);
- assert(cvthing.notbusy.valid == 1);
-
- assert((t[0] = pthread_self()) != NULL);
-
- assert(pthread_mutex_lock(&cvthing.lock) == 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_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == ETIMEDOUT);
-
- 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;
-
- assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
-
- assert(pthread_mutex_unlock(&cvthing.lock) == 0);
-
- assert(pthread_cond_destroy(&cvthing.notbusy) == 0);
-
- return 0;
-}
+/*
+ * File: condvar1.c
+ *
+ * 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;
+};
+
+static cvthing_t cvthing = {
+ PTHREAD_MUTEX_INITIALIZER,
+ PTHREAD_COND_INITIALIZER,
+};
+
+enum {
+ NUMTHREADS = 2
+};
+
+void *
+mythread(void * arg)
+{
+ assert(pthread_mutex_lock(&cvthing.lock) == 0);
+
+ assert(pthread_cond_signal(&cvthing.notbusy) == 0);
+
+ assert(pthread_mutex_unlock(&cvthing.lock) == 0);
+
+ return 0;
+}
+
+int
+main()
+{
+ pthread_t t[NUMTHREADS];
+ struct timespec abstime = { 0, 0 };
+#if defined(__MINGW32__)
+ struct timeb currSysTime;
+#else
+ struct _timeb currSysTime;
+#endif
+ const DWORD NANOSEC_PER_MILLISEC = 1000000;
+
+ assert((t[0] = pthread_self()) != NULL);
+
+ assert(pthread_mutex_lock(&cvthing.lock) == 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_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == ETIMEDOUT);
+
+ 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;
+
+ assert(pthread_cond_timedwait(&cvthing.notbusy, &cvthing.lock, &abstime) == 0);
+
+ assert(pthread_mutex_unlock(&cvthing.lock) == 0);
+
+ assert(pthread_cond_destroy(&cvthing.notbusy) == 0);
+
+ return 0;
+}
diff --git a/tests/eyal1.c b/tests/eyal1.c
index 4345452..533822d 100644
--- a/tests/eyal1.c
+++ b/tests/eyal1.c
@@ -49,15 +49,16 @@
#include <math.h>
struct thread_control {
- int id;
- pthread_t thread; /* thread id */
- pthread_mutex_t mutex_start;
- pthread_mutex_t mutex_started;
- pthread_mutex_t mutex_end;
- pthread_mutex_t mutex_ended;
- long work; /* work done */
- int stat; /* pthread_init status */
+ int id;
+ pthread_t thread; /* thread id */
+ pthread_mutex_t mutex_start;
+ pthread_mutex_t mutex_started;
+ pthread_mutex_t mutex_end;
+ pthread_mutex_t mutex_ended;
+ long work; /* work done */
+ int stat; /* pthread_init status */
};
+
typedef struct thread_control TC;
static TC *tcs = NULL;
@@ -70,229 +71,250 @@ static int todo = -1;
static pthread_mutex_t mutex_todo = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t mutex_stdout = PTHREAD_MUTEX_INITIALIZER;
-/*static pthread_attr_t pthread_attr_default;*/
-
static void
die (int ret)
{
- if (NULL != tcs) {
- free (tcs);
- tcs = NULL;
- }
-
- if (ret)
- exit (ret);
+ if (NULL != tcs)
+ {
+ free (tcs);
+ tcs = NULL;
+ }
+
+ if (ret)
+ exit (ret);
}
static void
waste_time (int n)
{
- int i;
- double f;
+ int i;
+ double f;
- f = rand ();
+ f = rand ();
- for (i = n*100; i > 0; --i) {
- f = sqrt (f) * f + 10000.0;
- }
+ for (i = n*100; i > 0; --i)
+ {
+ f = sqrt (f) * f + 10000.0;
+ }
}
static int
do_work_unit (int who, int n)
{
- int i;
- static int nchars = 0;
+ int i;
+ static int nchars = 0;
- if (quiet)
- i = 0;
- else {
-/* get lock on stdout
-*/
- assert(pthread_mutex_lock (&mutex_stdout) == 0);
+ if (quiet)
+ i = 0;
+ else {
+ /*
+ * get lock on stdout
+ */
+ assert(pthread_mutex_lock (&mutex_stdout) == 0);
-/* do our job
-*/
- i = printf ("%c",
- "0123456789abcdefghijklmnopqrstuvwxyz"[who]);
- if (!(++nchars % 50))
- printf ("\n");
- fflush (stdout);
+ /*
+ * do our job
+ */
+ i = printf ("%c", "0123456789abcdefghijklmnopqrstuvwxyz"[who]);
-/* release lock on stdout
-*/
- assert(pthread_mutex_unlock (&mutex_stdout) == 0);
- }
+ if (!(++nchars % 50))
+ printf ("\n");
- n = rand () % 10000; /* ignore incoming 'n' */
- waste_time (n);
+ fflush (stdout);
- return (n);
+ /*
+ * release lock on stdout
+ */
+ assert(pthread_mutex_unlock (&mutex_stdout) == 0);
+ }
+
+ n = rand () % 10000; /* ignore incoming 'n' */
+ waste_time (n);
+
+ return (n);
}
static int
print_server (void *ptr)
{
- int mywork;
- int n;
- TC *tc = (TC *)ptr;
-
- assert(pthread_mutex_lock (&tc->mutex_started) == 0);
-
- for (;;) {
- assert(pthread_mutex_lock (&tc->mutex_start) == 0);
- assert(pthread_mutex_unlock (&tc->mutex_start) == 0);
- assert(pthread_mutex_lock (&tc->mutex_ended) == 0);
- assert(pthread_mutex_unlock (&tc->mutex_started) == 0);
+ int mywork;
+ int n;
+ TC *tc = (TC *)ptr;
+
+ assert(pthread_mutex_lock (&tc->mutex_started) == 0);
+
+ for (;;)
+ {
+ assert(pthread_mutex_lock (&tc->mutex_start) == 0);
+ assert(pthread_mutex_unlock (&tc->mutex_start) == 0);
+ assert(pthread_mutex_lock (&tc->mutex_ended) == 0);
+ assert(pthread_mutex_unlock (&tc->mutex_started) == 0);
+
+ for (;;)
+ {
+
+ /*
+ * get lock on todo list
+ */
+ assert(pthread_mutex_lock (&mutex_todo) == 0);
+
+ mywork = todo;
+ if (todo >= 0)
+ {
+ ++todo;
+ if (todo >= nwork)
+ todo = -1;
+ }
+ assert(pthread_mutex_unlock (&mutex_todo) == 0);
+
+ if (mywork < 0)
+ break;
+
+ assert((n = do_work_unit (tc->id, mywork)) >= 0);
+ tc->work += n;
+ }
- for (;;) {
+ assert(pthread_mutex_lock (&tc->mutex_end) == 0);
+ assert(pthread_mutex_unlock (&tc->mutex_end) == 0);
+ assert(pthread_mutex_lock (&tc->mutex_started) == 0);
+ assert(pthread_mutex_unlock (&tc->mutex_ended) == 0);
-/* get lock on todo list
-*/
- assert(pthread_mutex_lock (&mutex_todo) == 0);
-
- mywork = todo;
- if (todo >= 0) {
- ++todo;
- if (todo >= nwork)
- todo = -1;
- }
- assert(pthread_mutex_unlock (&mutex_todo) == 0);
-
- if (mywork < 0)
- break;
-
- assert((n = do_work_unit (tc->id, mywork)) >= 0);
- tc->work += n;
- }
-
- assert(pthread_mutex_lock (&tc->mutex_end) == 0);
- assert(pthread_mutex_unlock (&tc->mutex_end) == 0);
- assert(pthread_mutex_lock (&tc->mutex_started) == 0);
- assert(pthread_mutex_unlock (&tc->mutex_ended) == 0);
-
- if (-2 == mywork)
- break;
- }
+ if (-2 == mywork)
+ break;
+ }
- assert(pthread_mutex_unlock (&tc->mutex_started) == 0);
+ assert(pthread_mutex_unlock (&tc->mutex_started) == 0);
- return (0);
+ return (0);
}
static void
dosync (void)
{
- int i;
-
- for (i = 0; i < nthreads; ++i) {
- assert(pthread_mutex_lock (&tcs[i].mutex_end) == 0);
- assert(pthread_mutex_unlock (&tcs[i].mutex_start) == 0);
- assert(pthread_mutex_lock (&tcs[i].mutex_started) == 0);
- assert(pthread_mutex_unlock (&tcs[i].mutex_started) == 0);
- }
-
-/* Now threads do their work
-*/
- for (i = 0; i < nthreads; ++i) {
- assert(pthread_mutex_lock (&tcs[i].mutex_start) == 0);
- assert(pthread_mutex_unlock (&tcs[i].mutex_end) == 0);
- assert(pthread_mutex_lock (&tcs[i].mutex_ended) == 0);
- assert(pthread_mutex_unlock (&tcs[i].mutex_ended) == 0);
- }
+ int i;
+
+ for (i = 0; i < nthreads; ++i)
+ {
+ assert(pthread_mutex_lock (&tcs[i].mutex_end) == 0);
+ assert(pthread_mutex_unlock (&tcs[i].mutex_start) == 0);
+ assert(pthread_mutex_lock (&tcs[i].mutex_started) == 0);
+ assert(pthread_mutex_unlock (&tcs[i].mutex_started) == 0);
+ }
+
+ /*
+ * Now threads do their work
+ */
+ for (i = 0; i < nthreads; ++i)
+ {
+ assert(pthread_mutex_lock (&tcs[i].mutex_start) == 0);
+ assert(pthread_mutex_unlock (&tcs[i].mutex_end) == 0);
+ assert(pthread_mutex_lock (&tcs[i].mutex_ended) == 0);
+ assert(pthread_mutex_unlock (&tcs[i].mutex_ended) == 0);
+ }
}
static void
dowork (void)
{
- todo = 0;
- dosync();
+ todo = 0;
+ dosync();
- todo = 0;
- dosync();
+ todo = 0;
+ dosync();
}
int
main (int argc, char *argv[])
{
- int i;
-
- assert(NULL != (tcs = calloc (nthreads, sizeof (*tcs))));
-
-/* Launch threads
-*/
- for (i = 0; i < nthreads; ++i) {
- tcs[i].id = i;
-
- assert(pthread_mutex_init (&tcs[i].mutex_start, NULL) == 0);
- assert(pthread_mutex_init (&tcs[i].mutex_started, NULL) == 0);
- assert(pthread_mutex_init (&tcs[i].mutex_end, NULL) == 0);
- assert(pthread_mutex_init (&tcs[i].mutex_ended, NULL) == 0);
-
- tcs[i].work = 0;
-
- assert(pthread_mutex_lock (&tcs[i].mutex_start) == 0);
- assert((tcs[i].stat =
- pthread_create (&tcs[i].thread,
- NULL,
- (void*)&print_server, (void *)&tcs[i])
- ) == 0);
-
-/* Wait for thread initialisation
-*/
- while (1)
- {
- int trylock;
-
- trylock = pthread_mutex_trylock(&tcs[i].mutex_started);
- assert(trylock == 0 || trylock == EBUSY);
-
- if (trylock == 0)
- {
- assert(pthread_mutex_unlock (&tcs[i].mutex_started) == 0);
- break;
- }
- }
- }
-
- dowork ();
-
-/* Terminate threads
-*/
- todo = -2; /* please terminate */
- dosync();
-
- for (i = 0; i < nthreads; ++i) {
- if (0 == tcs[i].stat)
- assert(pthread_join (tcs[i].thread, NULL) == 0);
- }
-
-/* destroy locks
-*/
- assert(pthread_mutex_destroy (&mutex_stdout) == 0);
- assert(pthread_mutex_destroy (&mutex_todo) == 0);
-
-/* Cleanup
-*/
- printf ("\n");
-
-/* Show results
-*/
- for (i = 0; i < nthreads; ++i) {
- printf ("%2d ", i);
- if (0 == tcs[i].stat)
- printf ("%10ld\n", tcs[i].work);
- else
- printf ("failed %d\n", tcs[i].stat);
-
- assert(pthread_mutex_destroy (&tcs[i].mutex_start) == 0);
- assert(pthread_mutex_destroy (&tcs[i].mutex_started) == 0);
- assert(pthread_mutex_destroy (&tcs[i].mutex_end) == 0);
- assert(pthread_mutex_destroy (&tcs[i].mutex_ended) == 0);
- }
-
- die (0);
-
- return (0);
+ int i;
+
+ assert(NULL != (tcs = calloc (nthreads, sizeof (*tcs))));
+
+ /*
+ * Launch threads
+ */
+ for (i = 0; i < nthreads; ++i)
+ {
+ tcs[i].id = i;
+
+ assert(pthread_mutex_init (&tcs[i].mutex_start, NULL) == 0);
+ assert(pthread_mutex_init (&tcs[i].mutex_started, NULL) == 0);
+ assert(pthread_mutex_init (&tcs[i].mutex_end, NULL) == 0);
+ assert(pthread_mutex_init (&tcs[i].mutex_ended, NULL) == 0);
+
+ tcs[i].work = 0;
+
+ assert(pthread_mutex_lock (&tcs[i].mutex_start) == 0);
+ assert((tcs[i].stat =
+ pthread_create (&tcs[i].thread,
+ NULL,
+ (void*)&print_server, (void *)&tcs[i])
+ ) == 0);
+
+ /*
+ * Wait for thread initialisation
+ */
+ {
+ int trylock = 0;
+
+ while (trylock == 0)
+ {
+ trylock = pthread_mutex_trylock(&tcs[i].mutex_started);
+ assert(trylock == 0 || trylock == EBUSY);
+
+ if (trylock == 0)
+ {
+ assert(pthread_mutex_unlock (&tcs[i].mutex_started) == 0);
+ }
+ }
+ }
+ }
+
+ dowork ();
+
+ /*
+ * Terminate threads
+ */
+ todo = -2; /* please terminate */
+ dosync();
+
+ for (i = 0; i < nthreads; ++i)
+ {
+ if (0 == tcs[i].stat)
+ assert(pthread_join (tcs[i].thread, NULL) == 0);
+ }
+
+ /*
+ * destroy locks
+ */
+ assert(pthread_mutex_destroy (&mutex_stdout) == 0);
+ assert(pthread_mutex_destroy (&mutex_todo) == 0);
+
+ /*
+ * Cleanup
+ */
+ printf ("\n");
+
+ /*
+ * Show results
+ */
+ for (i = 0; i < nthreads; ++i)
+ {
+ printf ("%2d ", i);
+ if (0 == tcs[i].stat)
+ printf ("%10ld\n", tcs[i].work);
+ else
+ printf ("failed %d\n", tcs[i].stat);
+
+ assert(pthread_mutex_destroy (&tcs[i].mutex_start) == 0);
+ assert(pthread_mutex_destroy (&tcs[i].mutex_started) == 0);
+ assert(pthread_mutex_destroy (&tcs[i].mutex_end) == 0);
+ assert(pthread_mutex_destroy (&tcs[i].mutex_ended) == 0);
+ }
+
+ die (0);
+
+ return (0);
}
diff --git a/tests/mutex2.c b/tests/mutex2.c
index 7956f14..b161899 100644
--- a/tests/mutex2.c
+++ b/tests/mutex2.c
@@ -16,8 +16,14 @@ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int
main()
{
+ assert(mutex == PTHREAD_MUTEX_INITIALIZER);
+
assert(pthread_mutex_lock(&mutex) == 0);
+ assert(mutex != PTHREAD_MUTEX_INITIALIZER);
+
+ assert(mutex != NULL);
+
assert(pthread_mutex_unlock(&mutex) == 0);
return 0;
diff --git a/tests/tsd1.c b/tests/tsd1.c
index 93403b1..9448c10 100644
--- a/tests/tsd1.c
+++ b/tests/tsd1.c
@@ -146,7 +146,7 @@ main()
assert(pthread_key_delete(key) == 0);
- for (i = 0; i < 10; i++)
+ for (i = 1; i < 10; i++)
{
/*
* The counter is incremented once when the key is set to
@@ -165,5 +165,5 @@ main()
fflush(stderr);
- return (fail) ? 1 : 0;
+ return (fail);
}