*
*/
+#define _LOCKMGR_COMPLIANT
#include "bacula.h"
/*
pthread_mutex_unlock(&rwl->mutex);
return 0;
}
+ lmgr_pre_lock(rwl, __FILE__, __LINE__);
if (rwl->w_active || rwl->r_active > 0) {
rwl->w_wait++; /* indicate that we are waiting */
pthread_cleanup_push(rwl_write_release, (void *)rwl);
while (rwl->w_active || rwl->r_active > 0) {
if ((stat = pthread_cond_wait(&rwl->write, &rwl->mutex)) != 0) {
+ lmgr_do_unlock(rwl);
break; /* error, bail out */
}
}
if (stat == 0) {
rwl->w_active++; /* we are running */
rwl->writer_id = pthread_self(); /* save writer thread's id */
- }
+ lmgr_post_lock();
+ }
pthread_mutex_unlock(&rwl->mutex);
return stat;
}
} else {
rwl->w_active = 1; /* we are running */
rwl->writer_id = pthread_self(); /* save writer thread's id */
+ lmgr_do_lock(rwl, __FILE__, __LINE__);
}
stat2 = pthread_mutex_unlock(&rwl->mutex);
return (stat == 0 ? stat2 : stat);
if (rwl->w_active > 0) {
stat = 0; /* writers still active */
} else {
+ lmgr_do_unlock(rwl);
/* No more writers, awaken someone */
if (rwl->r_wait > 0) { /* if readers waiting */
stat = pthread_cond_broadcast(&rwl->read);
int iteration;
int element;
int status;
-
+ lmgr_init_thread();
element = 0; /* Current data element */
for (iteration = 0; iteration < ITERATIONS; iteration++) {
if (element >= DATASIZE)
element = 0;
}
+ lmgr_cleanup_thread();
return NULL;
}