Renamed the LOCKing macros and added assert debugging code. Also, moved
the mutex initialization into a function call so that I can use an error checking mutex once I figure out how to get it to work on my computer.
This commit is contained in:
parent
c648ed1bc5
commit
c5b9ec889e
@ -1,5 +1,11 @@
|
||||
2002-04-22 Robert James Kaes <rjkaes@flarenet.com>
|
||||
|
||||
* src/thread.c: Renamed the LOCKing macros and added debugging
|
||||
asserts to them. Also, moved the mutex initialization into the
|
||||
thread_pool_create() function since I would like to use an error
|
||||
checking mutex, but my machine doesn't seem to work with it. I
|
||||
left the code there in case I can get it to work later.
|
||||
|
||||
* src/log.c (send_stored_logs): Added this function since the
|
||||
log_message() function will now stored the messages if the config
|
||||
file has not been processed yet. This function is called from
|
||||
|
63
src/thread.c
63
src/thread.c
@ -1,4 +1,4 @@
|
||||
/* $Id: thread.c,v 1.25 2002-04-18 16:57:06 rjkaes Exp $
|
||||
/* $Id: thread.c,v 1.26 2002-04-22 19:41:17 rjkaes Exp $
|
||||
*
|
||||
* Handles the creation/destruction of the various threads required for
|
||||
* processing incoming connections.
|
||||
@ -47,7 +47,16 @@ struct thread_s {
|
||||
* created when the program is started.
|
||||
*/
|
||||
static struct thread_s *thread_ptr;
|
||||
static pthread_mutex_t mlock = PTHREAD_MUTEX_INITIALIZER;
|
||||
static pthread_mutex_t mlock;
|
||||
|
||||
#define ACCEPT_LOCK() do { \
|
||||
int accept_lock_ret = pthread_mutex_lock(&mlock); \
|
||||
assert(accept_lock_ret == 0); \
|
||||
} while (0)
|
||||
#define ACCEPT_UNLOCK() do { \
|
||||
int accept_lock_ret = pthread_mutex_unlock(&mlock); \
|
||||
assert(accept_lock_ret == 0); \
|
||||
} while (0)
|
||||
|
||||
/* Used to override the default statck size. */
|
||||
static pthread_attr_t thread_attr;
|
||||
@ -58,23 +67,29 @@ static struct thread_config_s {
|
||||
} thread_config;
|
||||
|
||||
static unsigned int servers_waiting; /* servers waiting for a connection */
|
||||
static pthread_mutex_t servers_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
static pthread_mutex_t servers_mutex;
|
||||
|
||||
#define SERVER_LOCK() pthread_mutex_lock(&servers_mutex)
|
||||
#define SERVER_UNLOCK() pthread_mutex_unlock(&servers_mutex)
|
||||
#define SERVER_COUNT_LOCK() do { \
|
||||
int servers_mutex_ret = pthread_mutex_lock(&servers_mutex); \
|
||||
assert(servers_mutex_ret == 0); \
|
||||
} while (0)
|
||||
#define SERVER_COUNT_UNLOCK() do { \
|
||||
int servers_mutex_ret = pthread_mutex_unlock(&servers_mutex); \
|
||||
assert(servers_mutex_ret == 0); \
|
||||
} while (0)
|
||||
|
||||
#define SERVER_INC() do { \
|
||||
SERVER_LOCK(); \
|
||||
SERVER_COUNT_LOCK(); \
|
||||
DEBUG2("INC: servers_waiting: %u", servers_waiting); \
|
||||
servers_waiting++; \
|
||||
SERVER_UNLOCK(); \
|
||||
++servers_waiting; \
|
||||
SERVER_COUNT_UNLOCK(); \
|
||||
} while (0)
|
||||
|
||||
#define SERVER_DEC() do { \
|
||||
SERVER_LOCK(); \
|
||||
servers_waiting--; \
|
||||
SERVER_COUNT_LOCK(); \
|
||||
--servers_waiting; \
|
||||
DEBUG2("DEC: servers_waiting: %u", servers_waiting); \
|
||||
SERVER_UNLOCK(); \
|
||||
SERVER_COUNT_UNLOCK(); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
@ -132,18 +147,15 @@ thread_main(void *arg)
|
||||
while (!config.quit) {
|
||||
clilen = addrlen;
|
||||
|
||||
pthread_mutex_lock(&mlock);
|
||||
|
||||
/*
|
||||
* Check to see if the program is shutting down.
|
||||
*/
|
||||
if (config.quit) {
|
||||
pthread_mutex_unlock(&mlock);
|
||||
if (config.quit)
|
||||
break;
|
||||
}
|
||||
|
||||
ACCEPT_LOCK();
|
||||
connfd = accept(listenfd, cliaddr, &clilen);
|
||||
pthread_mutex_unlock(&mlock);
|
||||
ACCEPT_UNLOCK();
|
||||
|
||||
/*
|
||||
* Make sure no error occurred...
|
||||
@ -184,13 +196,13 @@ thread_main(void *arg)
|
||||
}
|
||||
}
|
||||
|
||||
SERVER_LOCK();
|
||||
SERVER_COUNT_LOCK();
|
||||
if (servers_waiting >= thread_config.maxspareservers) {
|
||||
/*
|
||||
* There are too many spare threads, kill ourself
|
||||
* off.
|
||||
*/
|
||||
SERVER_UNLOCK();
|
||||
SERVER_COUNT_UNLOCK();
|
||||
|
||||
log_message(LOG_NOTICE,
|
||||
"Waiting servers exceeds MaxSpareServers. Killing thread.");
|
||||
@ -199,7 +211,7 @@ thread_main(void *arg)
|
||||
|
||||
break;
|
||||
}
|
||||
SERVER_UNLOCK();
|
||||
SERVER_COUNT_UNLOCK();
|
||||
|
||||
ptr->status = T_WAITING;
|
||||
|
||||
@ -218,6 +230,7 @@ thread_pool_create(void)
|
||||
{
|
||||
unsigned int i;
|
||||
int pthread_ret;
|
||||
// pthread_mutexattr_t mutexattr;
|
||||
|
||||
/*
|
||||
* Initialize thread_attr to contain a non-default stack size
|
||||
@ -229,6 +242,10 @@ thread_pool_create(void)
|
||||
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
|
||||
pthread_attr_setstacksize(&thread_attr, THREAD_STACK_SIZE);
|
||||
|
||||
// pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_ERRORCHECK);
|
||||
pthread_mutex_init(&mlock, NULL);
|
||||
pthread_mutex_init(&servers_mutex, NULL);
|
||||
|
||||
if (thread_config.maxclients == 0) {
|
||||
log_message(LOG_ERR,
|
||||
"thread_pool_create: \"MaxClients\" must be greater than zero.");
|
||||
@ -289,9 +306,9 @@ thread_main_loop(void)
|
||||
return;
|
||||
|
||||
/* If there are not enough spare servers, create more */
|
||||
SERVER_LOCK();
|
||||
SERVER_COUNT_LOCK();
|
||||
if (servers_waiting < thread_config.minspareservers) {
|
||||
SERVER_UNLOCK();
|
||||
SERVER_COUNT_UNLOCK();
|
||||
|
||||
for (i = 0; i < thread_config.maxclients; i++) {
|
||||
if (thread_ptr[i].status == T_EMPTY) {
|
||||
@ -318,7 +335,7 @@ thread_main_loop(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
SERVER_UNLOCK();
|
||||
SERVER_COUNT_UNLOCK();
|
||||
|
||||
sleep(5);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user