]> code.citadel.org Git - citadel.git/blobdiff - citadel/server/threads.c
cdb_tick() called periodically
[citadel.git] / citadel / server / threads.c
index 8c186649832d50fc0849d020ee8537268638bc1c..78ded25def7c1c46543eb2bd6e0037951413256e 100644 (file)
@@ -21,6 +21,7 @@ int active_workers = 0;                               // Number of ACTIVE worker threads
 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;
@@ -28,7 +29,9 @@ void InitializeSemaphores(void) {
        // 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;
 }
 
 
@@ -57,12 +60,20 @@ void begin_critical_section(int which_one) {
                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]);
 }