|  | /* | 
|  | * mutex8e.c | 
|  | * | 
|  | * | 
|  | * Pthreads-win32 - POSIX Threads Library for Win32 | 
|  | * Copyright (C) 1998 Ben Elliston and Ross Johnson | 
|  | * Copyright (C) 1999,2000,2001 Ross Johnson | 
|  | * | 
|  | * Contact Email: rpj@ise.canberra.edu.au | 
|  | * | 
|  | * This library is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU Lesser General Public | 
|  | * License as published by the Free Software Foundation; either | 
|  | * version 2.1 of the License, or (at your option) any later version. | 
|  | * | 
|  | * This library is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | * Lesser General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU Lesser General Public | 
|  | * License along with this library; if not, write to the Free Software | 
|  | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
|  | * | 
|  | * -------------------------------------------------------------------------- | 
|  | * | 
|  | * Tests PTHREAD_MUTEX_ERRORCHECK mutex type exercising timedlock. | 
|  | * Thread locks mutex, another thread timedlocks the mutex. | 
|  | * Timed thread should timeout. | 
|  | * | 
|  | * Depends on API functions: | 
|  | *	pthread_create() | 
|  | *	pthread_mutexattr_init() | 
|  | *	pthread_mutexattr_destroy() | 
|  | *	pthread_mutexattr_settype() | 
|  | *	pthread_mutexattr_gettype() | 
|  | *	pthread_mutex_init() | 
|  | *	pthread_mutex_destroy() | 
|  | *	pthread_mutex_lock() | 
|  | *	pthread_mutex_timedlock() | 
|  | *	pthread_mutex_unlock() | 
|  | */ | 
|  |  | 
|  | #include "test.h" | 
|  | #include <sys/timeb.h> | 
|  |  | 
|  | static int lockCount = 0; | 
|  |  | 
|  | static pthread_mutex_t mutex; | 
|  | static pthread_mutexattr_t mxAttr; | 
|  |  | 
|  | void * locker(void * arg) | 
|  | { | 
|  | struct timespec abstime = { 0, 0 }; | 
|  | struct _timeb currSysTime; | 
|  | const DWORD NANOSEC_PER_MILLISEC = 1000000; | 
|  |  | 
|  | _ftime(&currSysTime); | 
|  |  | 
|  | abstime.tv_sec = currSysTime.time; | 
|  | abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm; | 
|  |  | 
|  | abstime.tv_sec += 1; | 
|  |  | 
|  | assert(pthread_mutex_timedlock(&mutex, &abstime) == ETIMEDOUT); | 
|  |  | 
|  | lockCount++; | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int | 
|  | main() | 
|  | { | 
|  | pthread_t t; | 
|  | int mxType = -1; | 
|  |  | 
|  | assert(pthread_mutexattr_init(&mxAttr) == 0); | 
|  | assert(pthread_mutexattr_settype(&mxAttr, PTHREAD_MUTEX_ERRORCHECK) == 0); | 
|  | assert(pthread_mutexattr_gettype(&mxAttr, &mxType) == 0); | 
|  | assert(mxType == PTHREAD_MUTEX_ERRORCHECK); | 
|  |  | 
|  | assert(pthread_mutex_init(&mutex, &mxAttr) == 0); | 
|  |  | 
|  | assert(pthread_mutex_lock(&mutex) == 0); | 
|  |  | 
|  | assert(pthread_create(&t, NULL, locker, NULL) == 0); | 
|  |  | 
|  | Sleep(2000); | 
|  |  | 
|  | assert(lockCount == 1); | 
|  |  | 
|  | assert(pthread_mutex_unlock(&mutex) == 0); | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  |