mariadb/mit-pthreads/tests/test_pthread_mutex.c
bk@work.mysql.com f4c589ff6c Import changeset
2000-07-31 21:29:14 +02:00

221 lines
4.6 KiB
C

/* ==== test_pthread_cond.c =========================================
* Copyright (c) 1993 by Chris Provenzano, proven@athena.mit.edu
*
* Description : Test pthread_cond(). Run this after test_create()
*
* 1.23 94/05/04 proven
* -Started coding this file.
*/
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#define OK 0
#define NOTOK -1
int contention_variable;
void * thread_contention(void * arg)
{
pthread_mutex_t * mutex = arg;
if (pthread_mutex_lock(mutex)) {
printf("pthread_mutex_lock() ERROR\n");
pthread_exit(NULL);
}
if (contention_variable != 1) {
printf("contention_variable != 1 ERROR\n");
pthread_exit(NULL);
}
contention_variable = 2;
if (pthread_mutex_unlock(mutex)) {
printf("pthread_mutex_unlock() ERROR\n");
pthread_exit(NULL);
}
pthread_exit(NULL);
}
int test_contention_lock(pthread_mutex_t * mutex)
{
pthread_t thread;
printf("test_contention_lock()\n");
if (pthread_mutex_lock(mutex)) {
printf("pthread_mutex_lock() ERROR\n");
return(NOTOK);
}
contention_variable = 0;
if (pthread_create(&thread, NULL, thread_contention, mutex)) {
printf("pthread_create() FAILED\n");
exit(2);
}
pthread_yield();
contention_variable = 1;
if (pthread_mutex_unlock(mutex)) {
printf("pthread_mutex_unlock() ERROR\n");
return(NOTOK);
}
if (pthread_mutex_lock(mutex)) {
printf("pthread_mutex_lock() ERROR\n");
return(NOTOK);
}
if (contention_variable != 2) {
printf("contention_variable != 2 ERROR\n");
return(NOTOK);
}
if (pthread_mutex_unlock(mutex)) {
printf("pthread_mutex_unlock() ERROR\n");
return(NOTOK);
}
return(OK);
}
int test_nocontention_lock(pthread_mutex_t * mutex)
{
printf("test_nocontention_lock()\n");
if (pthread_mutex_lock(mutex)) {
printf("pthread_mutex_lock() ERROR\n");
return(NOTOK);
}
if (pthread_mutex_unlock(mutex)) {
printf("pthread_mutex_unlock() ERROR\n");
return(NOTOK);
}
return(OK);
}
int test_debug_double_lock(pthread_mutex_t * mutex)
{
printf("test_debug_double_lock()\n");
if (pthread_mutex_lock(mutex)) {
printf("pthread_mutex_lock() ERROR\n");
return(NOTOK);
}
if (pthread_mutex_lock(mutex) != EDEADLK) {
printf("double lock error not detected ERROR\n");
return(NOTOK);
}
if (pthread_mutex_unlock(mutex)) {
printf("pthread_mutex_unlock() ERROR\n");
return(NOTOK);
}
return(OK);
}
int test_debug_double_unlock(pthread_mutex_t * mutex)
{
printf("test_debug_double_unlock()\n");
if (pthread_mutex_lock(mutex)) {
printf("pthread_mutex_lock() ERROR\n");
return(NOTOK);
}
if (pthread_mutex_unlock(mutex)) {
printf("pthread_mutex_unlock() ERROR\n");
return(NOTOK);
}
if (pthread_mutex_unlock(mutex) != EPERM) {
printf("double unlock error not detected ERROR\n");
return(NOTOK);
}
return(OK);
}
int test_nocontention_trylock(pthread_mutex_t * mutex)
{
printf("test_nocontention_trylock()\n");
if (pthread_mutex_trylock(mutex)) {
printf("pthread_mutex_trylock() ERROR\n");
return(NOTOK);
}
if (pthread_mutex_unlock(mutex)) {
printf("pthread_mutex_unlock() ERROR\n");
return(NOTOK);
}
return(OK);
}
int test_mutex_static(void)
{
pthread_mutex_t mutex_static = PTHREAD_MUTEX_INITIALIZER;
printf("test_mutex_static()\n");
if (test_nocontention_lock(&mutex_static) ||
test_contention_lock(&mutex_static)) {
return(NOTOK);
}
return(OK);
}
int test_mutex_fast(void)
{
pthread_mutex_t mutex_fast;
printf("test_mutex_fast()\n");
if (pthread_mutex_init(&mutex_fast, NULL)) {
printf("pthread_mutex_init() ERROR\n");
return(NOTOK);
}
if (test_nocontention_lock(&mutex_fast) ||
test_contention_lock(&mutex_fast)) {
return(NOTOK);
}
if (pthread_mutex_destroy(&mutex_fast)) {
printf("pthread_mutex_destroy() ERROR\n");
return(NOTOK);
}
return(OK);
}
int test_mutex_debug()
{
pthread_mutexattr_t mutex_debug_attr;
pthread_mutex_t mutex_debug;
printf("test_mutex_debug()\n");
pthread_mutexattr_init(&mutex_debug_attr);
pthread_mutexattr_settype(&mutex_debug_attr, PTHREAD_MUTEXTYPE_DEBUG);
if (pthread_mutex_init(&mutex_debug, &mutex_debug_attr)) {
printf("pthread_mutex_init() ERROR\n");
return(NOTOK);
}
if (test_nocontention_lock(&mutex_debug) ||
test_contention_lock(&mutex_debug) ||
test_debug_double_lock(&mutex_debug) ||
test_debug_double_unlock(&mutex_debug)) {
return(NOTOK);
}
if (pthread_mutex_destroy(&mutex_debug)) {
printf("pthread_mutex_destroy() ERROR\n");
return(NOTOK);
}
return(OK);
}
main()
{
pthread_init();
printf("test_pthread_mutex START\n");
if (test_mutex_static() || test_mutex_fast() || test_mutex_debug()) {
printf("test_pthread_mutex FAILED\n");
exit(1);
}
printf("test_pthread_mutex PASSED\n");
exit(0);
}