pthread_mutex_t Critters[MAX_SEMAPHORES]; // Things needing locking
int server_shutting_down = 0; // set to nonzero during shutdown
pthread_mutex_t ThreadCountMutex;
+char locks[MAX_SEMAPHORES+1];
void InitializeSemaphores(void) {
int i;
// Set up a bunch of semaphores to be used for critical sections
for (i=0; i<MAX_SEMAPHORES; ++i) {
pthread_mutex_init(&Critters[i], NULL);
+ locks[i] = ' ';
}
+ locks[MAX_SEMAPHORES] = 0;
}
cdb_check_handles();
}
+ syslog(LOG_ERR, "\033[3%dm lock(%14p, %2d, %s)\033[0m", (which_one%6)+1, (CC==&masterCC ? 0 : CC), which_one, locks);
pthread_mutex_lock(&Critters[which_one]);
+ if (locks[which_one] == 'X') {
+ syslog(LOG_ERR, "\033[7mHOLY SHIT, Thread %p sees double lock %d!!!!111\033[0m", CC, which_one);
+ abort();
+ }
+ locks[which_one] = 'X';
}
// Release a semaphore lock to end a critical section.
void end_critical_section(int which_one) {
+ locks[which_one] = '_';
+ syslog(LOG_ERR, "\033[3%dmunlock(%14p, %2d, %s)\033[0m", (which_one%6)+1, (CC==&masterCC ? 0 : CC), which_one, locks);
pthread_mutex_unlock(&Critters[which_one]);
}