version 1.68, 2003/11/05 00:49:40
|
version 1.69, 2003/11/05 06:29:36
|
|
|
#include "Socket.h" | #include "Socket.h" |
#include <Pegasus/Common/Tracer.h> | #include <Pegasus/Common/Tracer.h> |
#include <Pegasus/Common/HTTPConnection.h> | #include <Pegasus/Common/HTTPConnection.h> |
|
#include <Pegasus/Common/MessageQueueService.h> |
| |
#ifdef PEGASUS_OS_TYPE_WINDOWS | #ifdef PEGASUS_OS_TYPE_WINDOWS |
# if defined(FD_SETSIZE) && FD_SETSIZE != 1024 | # if defined(FD_SETSIZE) && FD_SETSIZE != 1024 |
|
|
_MonitorEntry entry(0, 0, 0); | _MonitorEntry entry(0, 0, 0); |
_entries.append(entry); | _entries.append(entry); |
} | } |
if( _async == true ) |
|
{ |
|
_thread_pool = new ThreadPool(0, |
|
"Monitor", |
|
0, |
|
0, |
|
create_time, |
|
destroy_time, |
|
deadlock_time); |
|
} |
|
else |
|
_thread_pool = 0; |
|
} | } |
| |
Monitor::~Monitor() | Monitor::~Monitor() |
|
|
Socket::uninitializeInterface(); | Socket::uninitializeInterface(); |
Tracer::trace(TRC_HTTP, Tracer::LEVEL4, | Tracer::trace(TRC_HTTP, Tracer::LEVEL4, |
"returning from monitor destructor"); | "returning from monitor destructor"); |
if(_async == true) |
|
delete _thread_pool; |
|
} | } |
| |
|
|
int Monitor::kill_idle_threads() |
|
{ |
|
static struct timeval now, last; |
|
gettimeofday(&now, NULL); |
|
int dead_threads = 0; |
|
|
|
if( now.tv_sec - last.tv_sec > 120 ) |
|
{ |
|
gettimeofday(&last, NULL); |
|
try |
|
{ |
|
dead_threads = _thread_pool->kill_dead_threads(); |
|
} |
|
catch(IPCException& ) |
|
{ |
|
} |
|
|
|
} |
|
return dead_threads; |
|
} |
|
|
|
|
|
Boolean Monitor::run(Uint32 milliseconds) | Boolean Monitor::run(Uint32 milliseconds) |
{ | { |
| |
|
|
static_cast<HTTPConnection *>(q)->_entry_index = indx; | static_cast<HTTPConnection *>(q)->_entry_index = indx; |
_entries[indx]._status = _MonitorEntry::BUSY; | _entries[indx]._status = _MonitorEntry::BUSY; |
// If allocate_and_awaken failure, retry on next iteration | // If allocate_and_awaken failure, retry on next iteration |
if (!_thread_pool->allocate_and_awaken((void *)q, _dispatch)) |
if (!MessageQueueService::get_thread_pool()->allocate_and_awaken( |
|
(void *)q, _dispatch)) |
{ | { |
Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2, | Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
"Monitor::run: Insufficient resources to process request."); | "Monitor::run: Insufficient resources to process request."); |