bdb_env->set_verbose(bdb_env, DB_VERB_DEADLOCK, 1);
bdb_env->set_verbose(bdb_env, DB_VERB_RECOVERY, 1);
- flags = DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | DB_RECOVER | DB_THREAD;
+ flags = DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL | DB_INIT_TXN | DB_RECOVER | DB_THREAD ;
syslog(LOG_DEBUG, "bdb: bdb_env->open(bdb_env, %s, %d, 0)", ctdl_db_dir, flags);
ret = bdb_env->open(bdb_env, ctdl_db_dir, flags, 0); // try opening the database cleanly
if (ret) {
}
else if (rejected) {
syslog(LOG_DEBUG, "bdb: rejected lock %d", rejected);
- bdb_abort(); // FIXME remove this, we want to unlock, not abort
}
-
- syslog(LOG_DEBUG, "bdb: tick...");
}
}
time(&last_purge);
- if (try_critical_section(S_SESSION_TABLE))
- return;
+ //if (try_critical_section(S_SESSION_TABLE))
+ //return;
+ //
+ begin_critical_section(S_SESSION_TABLE);
ptr = ContextList;
while (ptr) {
/* Directory room */
extract_token(buf, args, 2, '|', sizeof buf);
buf[15] = 0;
- safestrncpy(CC->room.QRdirname, buf,
- sizeof CC->room.QRdirname);
+ safestrncpy(CC->room.QRdirname, buf, sizeof CC->room.QRdirname);
/* Default view */
if (num_parms(args) >= 8) {
* guess-name or passworded, ensure that the private flag is
* also set.
*/
- if ((CC->room.QRflags & QR_GUESSNAME)
- || (CC->room.QRflags & QR_PASSWORDED))
- CC->room.QRflags |= QR_PRIVATE;
+ if ((CC->room.QRflags & QR_GUESSNAME) || (CC->room.QRflags & QR_PASSWORDED)) CC->room.QRflags |= QR_PRIVATE;
/* Some changes can't apply to BASEROOM */
if (!strncasecmp(CC->room.QRname, CtdlGetConfigStr("c_baseroom"), ROOMNAMELEN)) {
CC->room.QRorder = 0;
CC->room.QRpasswd[0] = '\0';
- CC->room.QRflags &= ~(QR_PRIVATE & QR_PASSWORDED &
- QR_GUESSNAME & QR_PREFONLY & QR_MAILBOX);
+ CC->room.QRflags &= ~(QR_PRIVATE & QR_PASSWORDED & QR_GUESSNAME & QR_PREFONLY & QR_MAILBOX);
CC->room.QRflags |= QR_PERMANENT;
}
else {
syslog(LOG_DEBUG, "extensions: init %s", ctdl_module_init_syscmd());
syslog(LOG_DEBUG, "extensions: init %s", ctdl_module_init_serv_user());
syslog(LOG_DEBUG, "extensions: init %s", ctdl_module_init_expire());
- syslog(LOG_DEBUG, "extensions: init %s", ctdl_module_init_fulltext());
+ //syslog(LOG_DEBUG, "extensions: init %s", ctdl_module_init_fulltext()); // FIXME trying this
syslog(LOG_DEBUG, "extensions: init %s", ctdl_module_init_image());
syslog(LOG_DEBUG, "extensions: init %s", ctdl_module_init_imap());
syslog(LOG_DEBUG, "extensions: init %s", ctdl_module_init_sieve());
if (num_newmsgs > 1) supplied_msg = NULL;
/* Now the regular stuff */
- if (CtdlGetRoomLock(&CC->room,
- ((roomname != NULL) ? roomname : CC->room.QRname) )
- != 0) {
+ if (CtdlGetRoomLock(&CC->room, ((roomname != NULL) ? roomname : CC->room.QRname) ) != 0) {
syslog(LOG_ERR, "msgbase: no such room <%s>", roomname);
return(ERROR + ROOM_NOT_FOUND);
}
if (msglist == NULL) {
syslog(LOG_ALERT, "msgbase: ERROR; can't realloc message list!");
free(msgs_to_be_merged);
+ abort(); // FIXME FIXME FOOFOO
return (ERROR + INTERNAL_ERROR);
}
memcpy(&msglist[num_msgs], msgs_to_be_merged, (sizeof(long) * num_msgs_to_be_merged) );
int CtdlGetRoomLock(struct ctdlroom *qrbuf, const char *room_name) {
register int retval;
retval = CtdlGetRoom(qrbuf, room_name);
- if (retval == 0) begin_critical_section(S_ROOMS);
+ if (retval == 0) {
+ //syslog(LOG_ERR, "\033[33mCtdlGetRoomLock(%p) requested\033[0m", pthread_self());
+ begin_critical_section(S_ROOMS);
+ //syslog(LOG_ERR, "\033[31mCtdlGetRoomLock(%p) acquired\033[0m", pthread_self());
+ }
return(retval);
}
void CtdlPutRoomLock(struct ctdlroom *qrbuf) {
CtdlPutRoom(qrbuf);
end_critical_section(S_ROOMS);
+ //syslog(LOG_ERR, "\033[32mCtdlGetRoomLock(%p) released\033[0m", CC);
}
pthread_mutex_lock(&ThreadCountMutex);
--active_workers;
- if ( (active_workers + CtdlGetConfigInt("c_min_workers") < num_workers)
- && (num_workers > CtdlGetConfigInt("c_min_workers"))
- ) {
- num_workers--;
- pthread_mutex_unlock(&ThreadCountMutex);
- return (NULL);
- }
pthread_mutex_unlock(&ThreadCountMutex);
}
// If control reaches this point, the server is shutting down
- pthread_mutex_lock(&ThreadCountMutex);
- --num_workers;
- pthread_mutex_unlock(&ThreadCountMutex);
- return(NULL);
+ while(1) {
+ sleep(1); // wait to die
+ }
+ //pthread_mutex_lock(&ThreadCountMutex);
+ //--num_workers;
+ //pthread_mutex_unlock(&ThreadCountMutex);
+ //return(NULL);
}
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);
+ //syslog(LOG_ERR, "\033[3%dm lock(%14p, %2d, %s)\033[0m", (which_one%6)+1, pthread_self(), 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();
- }
+ //if (locks[which_one] != 'X') {
+ //syslog(LOG_ERR, "\033[31mThread %p had to wait to get a lock on %d\033[0m", pthread_self(), which_one);
+ //}
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);
+ //syslog(LOG_ERR, "\033[3%dmunlock(%14p, %2d, %s)\033[0m", (which_one%6)+1, pthread_self(), which_one, locks);
pthread_mutex_unlock(&Critters[which_one]);
}