27#include <pedigree/log.h>
42pthread_spinlock_t spinlock;
47void* consumer(
void* ptr) {
50 printf(
"Consumer TID %lu\n", (
unsigned long)ptr);
54 pthread_spin_lock(&spinlock);
56 pthread_mutex_lock(&mutex);
59 if (the_list.empty()) {
61 pthread_spin_unlock(&spinlock);
63 pthread_mutex_unlock(&mutex);
72 pthread_spin_unlock(&spinlock);
74 pthread_mutex_unlock(&mutex);
84 struct timeval tv1, tv2;
87 pthread_spin_init(&spinlock, 0);
89 pthread_mutex_init(&mutex, NULL);
93 pedigree_log(LOG_INFO,
"TEST 0");
95 printf(
"Locking without any contention...\n");
96 pthread_mutex_t contention_mutex;
97 pthread_mutex_init(&contention_mutex, 0);
98 pthread_mutex_lock(&contention_mutex);
100 pthread_mutex_unlock(&contention_mutex);
101 printf(
"Released!\n");
103 pedigree_log(LOG_INFO,
"TEST 1");
105 printf(
"Creating a recursive lock!\n");
106 pthread_mutex_t recursive;
107 pthread_mutexattr_t attr;
108 pthread_mutexattr_init(&attr);
109 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
110 pthread_mutex_init(&recursive, &attr);
111 printf(
"Testing recursion...\n");
112 pthread_mutex_lock(&recursive);
113 pthread_mutex_lock(&recursive);
114 pthread_mutex_lock(&recursive);
115 printf(
"Locked OK, testing unlock...\n");
116 pthread_mutex_unlock(&recursive);
117 pthread_mutex_unlock(&recursive);
118 pthread_mutex_unlock(&recursive);
119 printf(
"Testing re-acquire...\n");
120 pthread_mutex_lock(&recursive);
123 pedigree_log(LOG_INFO,
"TEST 2");
124 printf(
"Locking with deadlock\n");
125 pthread_mutex_t deadlock_mutex;
126 pthread_mutexattr_t deadlock_attr;
127 pthread_mutexattr_init(&deadlock_attr);
128 pthread_mutexattr_settype(&deadlock_attr, PTHREAD_MUTEX_ERRORCHECK);
129 pthread_mutex_init(&deadlock_mutex, &deadlock_attr);
130 pthread_mutexattr_destroy(&deadlock_attr);
131 i = pthread_mutex_lock(&deadlock_mutex);
132 printf(
"First lock: %d (%s)\n", i, strerror(i));
133 i = pthread_mutex_lock(&deadlock_mutex);
135 printf(
"Didn't get EDEADLK!\n");
136 printf(
"Second lock: %d (%s)\n", i, strerror(i));
137 pthread_mutex_unlock(&deadlock_mutex);
138 pthread_mutex_destroy(&deadlock_mutex);
141 for (i = 0; i < LOOPS; i++)
142 the_list.push_back(i);
145 gettimeofday(&tv1, NULL);
147 pedigree_log(LOG_INFO,
"TEST 3");
148 pthread_create(&thr1, NULL, consumer, (
void*)1);
149 pthread_create(&thr2, NULL, consumer, (
void*)2);
151 pthread_join(thr1, NULL);
152 pthread_join(thr2, NULL);
153 pedigree_log(LOG_INFO,
"TEST 4");
156 gettimeofday(&tv2, NULL);
158 if (tv1.tv_usec > tv2.tv_usec) {
160 tv2.tv_usec += 1000000;
163 printf(
"Result - %ld.%ld\n", tv2.tv_sec - tv1.tv_sec, tv2.tv_usec - tv1.tv_usec);
166 pthread_spin_destroy(&spinlock);
168 pthread_mutex_destroy(&mutex);