1 /*
2 * rwlock4_t.c
3 *
4 *
5 * --------------------------------------------------------------------------
6 *
7 * Pthreads-embedded (PTE) - POSIX Threads Library for embedded systems
8 * Copyright(C) 2008 Jason Schmidlapp
9 *
10 * Contact Email: jschmidlapp@users.sourceforge.net
11 *
12 *
13 * Based upon Pthreads-win32 - POSIX Threads Library for Win32
14 * Copyright(C) 1998 John E. Bossom
15 * Copyright(C) 1999,2005 Pthreads-win32 contributors
16 *
17 * Contact Email: rpj@callisto.canberra.edu.au
18 *
19 * The original list of contributors to the Pthreads-win32 project
20 * is contained in the file CONTRIBUTORS.ptw32 included with the
21 * source code distribution. The list can also be seen at the
22 * following World Wide Web location:
23 * http://sources.redhat.com/pthreads-win32/contributors.html
24 *
25 * This library is free software; you can redistribute it and/or
26 * modify it under the terms of the GNU Lesser General Public
27 * License as published by the Free Software Foundation; either
28 * version 2 of the License, or (at your option) any later version.
29 *
30 * This library is distributed in the hope that it will be useful,
31 * but WITHOUT ANY WARRANTY; without even the implied warranty of
32 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
33 * Lesser General Public License for more details.
34 *
35 * You should have received a copy of the GNU Lesser General Public
36 * License along with this library in the file COPYING.LIB;
37 * if not, write to the Free Software Foundation, Inc.,
38 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
39 *
40 * --------------------------------------------------------------------------
41 *
42 * Declare a static rwlock object, timed-rdlock it, trywrlock it,
43 * and then unlock it again.
44 *
45 * Depends on API functions:
46 * pthread_rwlock_timedrdlock()
47 * pthread_rwlock_trywrlock()
48 * pthread_rwlock_unlock()
49 */
50
51 #include "test.h"
52
53 pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER;
54
55 static int washere = 0;
56
func(void * arg)57 static void * func(void * arg)
58 {
59 assert(pthread_rwlock_trywrlock(&rwlock1) == EBUSY);
60
61 washere = 1;
62
63 return 0;
64 }
65
pthread_test_rwlock4t()66 int pthread_test_rwlock4t()
67 {
68 pthread_t t;
69 struct timespec abstime =
70 {
71 0, 0
72 };
73 struct _timeb currSysTime;
74 const long long NANOSEC_PER_MILLISEC = 1000000;
75
76 rwlock1 = PTHREAD_RWLOCK_INITIALIZER;
77
78 _ftime(&currSysTime);
79
80 abstime.tv_sec = currSysTime.time;
81 abstime.tv_nsec = NANOSEC_PER_MILLISEC * currSysTime.millitm;
82
83 abstime.tv_sec += 1;
84
85 assert(pthread_rwlock_timedrdlock(&rwlock1, &abstime) == 0);
86
87 assert(pthread_create(&t, NULL, func, NULL) == 0);
88
89 pte_osThreadSleep(2000);
90
91 assert(pthread_rwlock_unlock(&rwlock1) == 0);
92
93 assert(washere == 1);
94
95 assert(pthread_join(t,NULL) == 0);
96
97 assert(pthread_rwlock_destroy(&rwlock1) == 0);
98
99 return 0;
100 }
101