diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/ChangeLog | 5 | ||||
| -rw-r--r-- | tests/condvar3.c | 218 | ||||
| -rw-r--r-- | tests/condvar4.c | 239 | ||||
| -rw-r--r-- | tests/eyal1.c | 394 | ||||
| -rw-r--r-- | tests/mutex2.c | 6 | ||||
| -rw-r--r-- | tests/tsd1.c | 4 | 
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);  } | 
