version 1.72.2.2, 2004/08/07 21:01:29
|
version 1.82, 2004/12/15 14:12:42
|
|
|
//%2003//////////////////////////////////////////////////////////////////////// |
//%2004//////////////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Development |
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development |
// Company, L. P., IBM Corp., The Open Group, Tivoli Systems. |
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. |
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.; | // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.; |
// IBM Corp.; EMC Corporation, The Open Group. | // IBM Corp.; EMC Corporation, The Open Group. |
|
// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.; |
|
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. |
// | // |
// Permission is hereby granted, free of charge, to any person obtaining a copy | // Permission is hereby granted, free of charge, to any person obtaining a copy |
// of this software and associated documentation files (the "Software"), to | // of this software and associated documentation files (the "Software"), to |
|
|
// | // |
// Modified By: Mike Day (monitor_2) mdday@us.ibm.com | // Modified By: Mike Day (monitor_2) mdday@us.ibm.com |
// Amit K Arora (Bug#1153) amita@in.ibm.com | // Amit K Arora (Bug#1153) amita@in.ibm.com |
|
// Alagaraja Ramasubramanian (alags_raj@in.ibm.com) for Bug#1090 |
|
// Sushma Fernandes (sushma@hp.com) for Bug#2057 |
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
|
|
_async(false), | _async(false), |
_stopConnections(0), | _stopConnections(0), |
_stopConnectionsSem(0), | _stopConnectionsSem(0), |
_solicitSocketCount(0) |
_solicitSocketCount(0), |
|
_tickle_client_socket(-1), |
|
_tickle_server_socket(-1), |
|
_tickle_peer_socket(-1) |
{ | { |
int numberOfMonitorEntriesToAllocate = MAX_NUMBER_OF_MONITOR_ENTRIES; | int numberOfMonitorEntriesToAllocate = MAX_NUMBER_OF_MONITOR_ENTRIES; |
Socket::initializeInterface(); | Socket::initializeInterface(); |
|
|
_async(async), | _async(async), |
_stopConnections(0), | _stopConnections(0), |
_stopConnectionsSem(0), | _stopConnectionsSem(0), |
_solicitSocketCount(0) |
_solicitSocketCount(0), |
|
_tickle_client_socket(-1), |
|
_tickle_server_socket(-1), |
|
_tickle_peer_socket(-1) |
{ | { |
int numberOfMonitorEntriesToAllocate = MAX_NUMBER_OF_MONITOR_ENTRIES; | int numberOfMonitorEntriesToAllocate = MAX_NUMBER_OF_MONITOR_ENTRIES; |
Socket::initializeInterface(); | Socket::initializeInterface(); |
|
|
Tracer::trace(TRC_HTTP, Tracer::LEVEL4, "deleting rep"); | Tracer::trace(TRC_HTTP, Tracer::LEVEL4, "deleting rep"); |
| |
Tracer::trace(TRC_HTTP, Tracer::LEVEL4, "uninitializing interface"); | Tracer::trace(TRC_HTTP, Tracer::LEVEL4, "uninitializing interface"); |
|
|
|
try{ |
|
if(_tickle_peer_socket >= 0) |
|
{ |
|
Socket::close(_tickle_peer_socket); |
|
} |
|
if(_tickle_client_socket >= 0) |
|
{ |
|
Socket::close(_tickle_client_socket); |
|
} |
|
if(_tickle_server_socket >= 0) |
|
{ |
|
Socket::close(_tickle_server_socket); |
|
} |
|
} |
|
catch(...) |
|
{ |
|
Tracer::trace(TRC_HTTP, Tracer::LEVEL4, |
|
"Failed to close tickle sockets"); |
|
} |
|
|
Socket::uninitializeInterface(); | Socket::uninitializeInterface(); |
Tracer::trace(TRC_HTTP, Tracer::LEVEL4, | Tracer::trace(TRC_HTTP, Tracer::LEVEL4, |
"returning from monitor destructor"); | "returning from monitor destructor"); |
|
|
// get a socket for the server side | // get a socket for the server side |
if((_tickle_server_socket = ::socket(PF_INET, SOCK_STREAM, 0)) < 0){ | if((_tickle_server_socket = ::socket(PF_INET, SOCK_STREAM, 0)) < 0){ |
//handle error | //handle error |
throw Exception("Monitor::initializeTickler(), create socket failed on tickle server."); |
MessageLoaderParms parms("Common.Monitor.TICKLE_CREATE", |
|
"Received error number $0 while creating the internal socket.", |
|
#if !defined(PEGASUS_OS_TYPE_WINDOWS) |
|
errno); |
|
#else |
|
WSAGetLastError()); |
|
#endif |
|
throw Exception(parms); |
} | } |
| |
// initialize the address | // initialize the address |
|
|
PEGASUS_SOCKLEN_SIZE _addr_size = sizeof(_tickle_server_addr); | PEGASUS_SOCKLEN_SIZE _addr_size = sizeof(_tickle_server_addr); |
| |
// bind server side to socket | // bind server side to socket |
if((::bind(_tickle_server_socket,(struct sockaddr *)&_tickle_server_addr, sizeof(_tickle_server_addr))) < 0){ |
if((::bind(_tickle_server_socket, |
|
(struct sockaddr *)&_tickle_server_addr, |
|
sizeof(_tickle_server_addr))) < 0){ |
// handle error | // handle error |
throw Exception("Monitor::initializeTickler(), bind failed on tickle server socket."); |
MessageLoaderParms parms("Common.Monitor.TICKLE_BIND", |
|
"Received error number $0 while binding the internal socket.", |
|
#if !defined(PEGASUS_OS_TYPE_WINDOWS) |
|
errno); |
|
#else |
|
WSAGetLastError()); |
|
#endif |
|
throw Exception(parms); |
} | } |
| |
// tell the kernel we are a server | // tell the kernel we are a server |
if((::listen(_tickle_server_socket,3)) < 0){ | if((::listen(_tickle_server_socket,3)) < 0){ |
// handle error | // handle error |
throw Exception("Monitor::initializeTickler(), listen failed on tickle server socket"); |
MessageLoaderParms parms("Common.Monitor.TICKLE_LISTEN", |
|
"Received error number $0 while listening to the internal socket.", |
|
#if !defined(PEGASUS_OS_TYPE_WINDOWS) |
|
errno); |
|
#else |
|
WSAGetLastError()); |
|
#endif |
|
throw Exception(parms); |
} | } |
| |
// make sure we have the correct socket for our server | // make sure we have the correct socket for our server |
int sock = ::getsockname(_tickle_server_socket,(struct sockaddr*)&_tickle_server_addr, &_addr_size); |
int sock = ::getsockname(_tickle_server_socket, |
|
(struct sockaddr*)&_tickle_server_addr, |
|
&_addr_size); |
if(sock < 0){ | if(sock < 0){ |
// handle error | // handle error |
throw Exception("Monitor::initializeTickler(), getsockname failed on tickle server socket"); |
MessageLoaderParms parms("Common.Monitor.TICKLE_SOCKNAME", |
|
"Received error number $0 while getting the internal socket name.", |
|
#if !defined(PEGASUS_OS_TYPE_WINDOWS) |
|
errno); |
|
#else |
|
WSAGetLastError()); |
|
#endif |
|
throw Exception(parms); |
} | } |
| |
/* set up the tickle client/connector */ | /* set up the tickle client/connector */ |
|
|
// get a socket for our tickle client | // get a socket for our tickle client |
if((_tickle_client_socket = ::socket(PF_INET, SOCK_STREAM, 0)) < 0){ | if((_tickle_client_socket = ::socket(PF_INET, SOCK_STREAM, 0)) < 0){ |
// handle error | // handle error |
throw Exception("Monitor::initializeTickler(), create socket failed on tickle client."); |
MessageLoaderParms parms("Common.Monitor.TICKLE_CLIENT_CREATE", |
|
"Received error number $0 while creating the internal client socket.", |
|
#if !defined(PEGASUS_OS_TYPE_WINDOWS) |
|
errno); |
|
#else |
|
WSAGetLastError()); |
|
#endif |
|
throw Exception(parms); |
} | } |
| |
// setup the address of the client | // setup the address of the client |
|
|
_tickle_client_addr.sin_port = 0; | _tickle_client_addr.sin_port = 0; |
| |
// bind socket to client side | // bind socket to client side |
if((::bind(_tickle_client_socket,(struct sockaddr*)&_tickle_client_addr, sizeof(_tickle_client_addr))) < 0){ |
if((::bind(_tickle_client_socket, |
|
(struct sockaddr*)&_tickle_client_addr, |
|
sizeof(_tickle_client_addr))) < 0){ |
// handle error | // handle error |
throw Exception("Monitor::initializeTickler(), bind failed on tickle client socket."); |
MessageLoaderParms parms("Common.Monitor.TICKLE_CLIENT_BIND", |
|
"Received error number $0 while binding the internal client socket.", |
|
#if !defined(PEGASUS_OS_TYPE_WINDOWS) |
|
errno); |
|
#else |
|
WSAGetLastError()); |
|
#endif |
|
throw Exception(parms); |
} | } |
| |
// connect to server side | // connect to server side |
if((::connect(_tickle_client_socket,(struct sockaddr*)&_tickle_server_addr, sizeof(_tickle_server_addr))) < 0){ |
if((::connect(_tickle_client_socket, |
|
(struct sockaddr*)&_tickle_server_addr, |
|
sizeof(_tickle_server_addr))) < 0){ |
// handle error | // handle error |
throw Exception("Monitor::initializeTickler(), connect failed between tickle client and tickle server."); |
MessageLoaderParms parms("Common.Monitor.TICKLE_CLIENT_CONNECT", |
|
"Received error number $0 while connecting the internal client socket.", |
|
#if !defined(PEGASUS_OS_TYPE_WINDOWS) |
|
errno); |
|
#else |
|
WSAGetLastError()); |
|
#endif |
|
throw Exception(parms); |
} | } |
| |
/* set up the slave connection */ | /* set up the slave connection */ |
|
|
pegasus_sleep(1); | pegasus_sleep(1); |
| |
// this call may fail, we will try a max of 20 times to establish this peer connection | // this call may fail, we will try a max of 20 times to establish this peer connection |
if((_tickle_peer_socket = ::accept(_tickle_server_socket,(struct sockaddr*)&_tickle_peer_addr, &peer_size)) < 0){ |
if((_tickle_peer_socket = ::accept(_tickle_server_socket, |
|
(struct sockaddr*)&_tickle_peer_addr, |
|
&peer_size)) < 0){ |
|
#if !defined(PEGASUS_OS_TYPE_WINDOWS) |
|
// Only retry on non-windows platforms. |
if(_tickle_peer_socket == -1 && errno == EAGAIN) | if(_tickle_peer_socket == -1 && errno == EAGAIN) |
{ | { |
int retries = 0; | int retries = 0; |
do | do |
{ | { |
pegasus_sleep(1); | pegasus_sleep(1); |
_tickle_peer_socket = ::accept(_tickle_server_socket,(struct sockaddr*)&_tickle_peer_addr, &peer_size); |
_tickle_peer_socket = ::accept(_tickle_server_socket, |
|
(struct sockaddr*)&_tickle_peer_addr, |
|
&peer_size); |
retries++; | retries++; |
} while(_tickle_peer_socket == -1 && errno == EAGAIN && retries < 20); | } while(_tickle_peer_socket == -1 && errno == EAGAIN && retries < 20); |
} | } |
|
#endif |
} | } |
if(_tickle_peer_socket == -1){ | if(_tickle_peer_socket == -1){ |
// handle error | // handle error |
throw Exception("Monitor::initializeTickler(), accept failed, peer socket connection not established."); |
MessageLoaderParms parms("Common.Monitor.TICKLE_ACCEPT", |
|
"Received error number $0 while accepting the internal socket connection.", |
|
#if !defined(PEGASUS_OS_TYPE_WINDOWS) |
|
errno); |
|
#else |
|
WSAGetLastError()); |
|
#endif |
|
throw Exception(parms); |
} | } |
// add the tickler to the list of entries to be monitored and set to IDLE because Monitor only | // add the tickler to the list of entries to be monitored and set to IDLE because Monitor only |
// checks entries with IDLE state for events | // checks entries with IDLE state for events |
|
|
'0','0' | '0','0' |
}; | }; |
| |
|
AutoMutex autoMutex(_tickle_mutex); |
Socket::disableBlocking(_tickle_client_socket); | Socket::disableBlocking(_tickle_client_socket); |
Socket::write(_tickle_client_socket,&_buffer, 2); | Socket::write(_tickle_client_socket,&_buffer, 2); |
Socket::enableBlocking(_tickle_client_socket); | Socket::enableBlocking(_tickle_client_socket); |
} | } |
| |
|
void Monitor::setState( Uint32 index, _MonitorEntry::entry_status status ) |
|
{ |
|
// Set the state to requested state |
|
_entries[index]._status = status; |
|
} |
|
|
Boolean Monitor::run(Uint32 milliseconds) | Boolean Monitor::run(Uint32 milliseconds) |
{ | { |
| |
Boolean handled_events = false; | Boolean handled_events = false; |
int i = 0; | int i = 0; |
// #if defined(PEGASUS_OS_OS400) || defined(PEGASUS_OS_HPUX) |
|
struct timeval tv = {milliseconds/1000, milliseconds%1000*1000}; | struct timeval tv = {milliseconds/1000, milliseconds%1000*1000}; |
//#else |
|
// struct timeval tv = {0, 1}; |
|
//#endif |
|
fd_set fdread; | fd_set fdread; |
FD_ZERO(&fdread); | FD_ZERO(&fdread); |
|
|
_entry_mut.lock(pegasus_thread_self()); | _entry_mut.lock(pegasus_thread_self()); |
| |
// Check the stopConnections flag. If set, clear the Acceptor monitor entries | // Check the stopConnections flag. If set, clear the Acceptor monitor entries |
|
|
| |
for( int indx = 0; indx < (int)_entries.size(); indx++) | for( int indx = 0; indx < (int)_entries.size(); indx++) |
{ | { |
if ((_entries[indx]._status.value() == _MonitorEntry::DYING) && |
const _MonitorEntry &entry = _entries[indx]; |
(_entries[indx]._type == Monitor::CONNECTION)) |
if ((entry._status.value() == _MonitorEntry::DYING) && |
|
(entry._type == Monitor::CONNECTION)) |
{ | { |
MessageQueue *q = MessageQueue::lookup(_entries[indx].queueId); |
MessageQueue *q = MessageQueue::lookup(entry.queueId); |
PEGASUS_ASSERT(q != 0); | PEGASUS_ASSERT(q != 0); |
MessageQueue & o = static_cast<HTTPConnection *>(q)->get_owner(); |
HTTPConnection &h = *static_cast<HTTPConnection *>(q); |
Message* message= new CloseConnectionMessage(_entries[indx].socket); |
|
|
if (h._connectionClosePending == false) |
|
continue; |
|
|
|
// NOTE: do not attempt to delete while there are pending responses |
|
// coming thru. The last response to come thru after a |
|
// _connectionClosePending will reset _responsePending to false |
|
// and then cause the monitor to rerun this code and clean up. |
|
// (see HTTPConnection.cpp) |
|
|
|
if (h._responsePending == true) |
|
{ |
|
Tracer::trace(TRC_HTTP, Tracer::LEVEL4, "Monitor::run - " |
|
"Ignoring connection delete request because " |
|
"responses are still pending. " |
|
"connection=0x%p, socket=%d\n", |
|
(void *)&h, h.getSocket()); |
|
continue; |
|
} |
|
h._connectionClosePending = false; |
|
MessageQueue &o = h.get_owner(); |
|
Message* message= new CloseConnectionMessage(entry.socket); |
message->dest = o.getQueueId(); | message->dest = o.getQueueId(); |
| |
// HTTPAcceptor is responsible for closing the connection. | // HTTPAcceptor is responsible for closing the connection. |
|
|
*/ | */ |
maxSocketCurrentPass++; | maxSocketCurrentPass++; |
| |
// Fixed in monitor_2 but added because Monitor is still the default monitor. |
|
// When _idleEntries is 0 don't immediately return, otherwise this loops out of control |
|
// kicking off kill idle thread threads. E.g. There is nothing to select on when the cimserver |
|
// is shutting down. |
|
/*if( _idleEntries == 0 ) |
|
{ |
|
Thread::sleep( milliseconds ); |
|
_entry_mut.unlock(); |
|
return false; |
|
}*/ |
|
|
|
_entry_mut.unlock(); | _entry_mut.unlock(); |
//int events = select(FD_SETSIZE, &fdread, NULL, NULL, &tv); |
|
int events = select(maxSocketCurrentPass, &fdread, NULL, NULL, &tv); | int events = select(maxSocketCurrentPass, &fdread, NULL, NULL, &tv); |
_entry_mut.lock(pegasus_thread_self()); | _entry_mut.lock(pegasus_thread_self()); |
| |
|
|
Tracer::trace(TRC_HTTP, Tracer::LEVEL4, | Tracer::trace(TRC_HTTP, Tracer::LEVEL4, |
"_entries[indx].type for indx = %d is Monitor::CONNECTION", indx); | "_entries[indx].type for indx = %d is Monitor::CONNECTION", indx); |
static_cast<HTTPConnection *>(q)->_entry_index = indx; | static_cast<HTTPConnection *>(q)->_entry_index = indx; |
_entries[indx]._status = _MonitorEntry::BUSY; |
|
|
// Do not update the entry just yet. The entry gets updated once |
|
// the request has been read. |
|
//_entries[indx]._status = _MonitorEntry::BUSY; |
|
|
// If allocate_and_awaken failure, retry on next iteration | // If allocate_and_awaken failure, retry on next iteration |
/* |
/* Removed for PEP 183. |
if (!MessageQueueService::get_thread_pool()->allocate_and_awaken( | if (!MessageQueueService::get_thread_pool()->allocate_and_awaken( |
(void *)q, _dispatch)) | (void *)q, _dispatch)) |
{ | { |
|
|
return true; | return true; |
} | } |
*/ | */ |
// begin hack |
// Added for PEP 183 |
HTTPConnection *dst = reinterpret_cast<HTTPConnection *>(q); | HTTPConnection *dst = reinterpret_cast<HTTPConnection *>(q); |
Tracer::trace(TRC_HTTP, Tracer::LEVEL4, | Tracer::trace(TRC_HTTP, Tracer::LEVEL4, |
"Monitor::_dispatch: entering run() for indx = %d, queueId = %d, q = %p", | "Monitor::_dispatch: entering run() for indx = %d, queueId = %d, q = %p", |
|
|
Tracer::trace(TRC_HTTP, Tracer::LEVEL4, | Tracer::trace(TRC_HTTP, Tracer::LEVEL4, |
"Monitor::_dispatch: exited run() for index %d", dst->_entry_index); | "Monitor::_dispatch: exited run() for index %d", dst->_entry_index); |
| |
PEGASUS_ASSERT(dst->_monitor->_entries[dst->_entry_index]._status.value() == _MonitorEntry::BUSY); |
// It is possible the entry status may not be set to busy. |
|
// The following will fail in that case. |
|
// PEGASUS_ASSERT(dst->_monitor->_entries[dst->_entry_index]._status.value() == _MonitorEntry::BUSY); |
// Once the HTTPConnection thread has set the status value to either | // Once the HTTPConnection thread has set the status value to either |
// Monitor::DYING or Monitor::IDLE, it has returned control of the connection | // Monitor::DYING or Monitor::IDLE, it has returned control of the connection |
// to the Monitor. It is no longer permissible to access the connection | // to the Monitor. It is no longer permissible to access the connection |
// or the entry in the _entries table. | // or the entry in the _entries table. |
if (dst->_connectionClosePending) |
|
{ |
|
dst->_monitor->_entries[dst->_entry_index]._status = _MonitorEntry::DYING; |
|
} |
|
else |
|
{ |
|
dst->_monitor->_entries[dst->_entry_index]._status = _MonitorEntry::IDLE; |
|
} |
|
| |
// end hack |
// The following is not relevant as the worker thread or the |
|
// reader thread will update the status of the entry. |
|
//if (dst->_connectionClosePending) |
|
//{ |
|
// dst->_monitor->_entries[dst->_entry_index]._status = _MonitorEntry::DYING; |
|
//} |
|
//else |
|
//{ |
|
// dst->_monitor->_entries[dst->_entry_index]._status = _MonitorEntry::IDLE; |
|
//} |
|
// end Added for PEP 183 |
} | } |
else if( _entries[indx]._type == Monitor::INTERNAL){ | else if( _entries[indx]._type == Monitor::INTERNAL){ |
// set ourself to BUSY, | // set ourself to BUSY, |
|
|
return(handled_events); | return(handled_events); |
} | } |
| |
void Monitor::stopListeningForConnections() |
void Monitor::stopListeningForConnections(Boolean wait) |
{ | { |
PEG_METHOD_ENTER(TRC_HTTP, "Monitor::stopListeningForConnections()"); | PEG_METHOD_ENTER(TRC_HTTP, "Monitor::stopListeningForConnections()"); |
// set boolean then tickle the server to recognize _stopConnections | // set boolean then tickle the server to recognize _stopConnections |
_stopConnections = 1; | _stopConnections = 1; |
tickle(); | tickle(); |
| |
|
if (wait) |
|
{ |
// Wait for the monitor to notice _stopConnections. Otherwise the | // Wait for the monitor to notice _stopConnections. Otherwise the |
// caller of this function may unbind the ports while the monitor | // caller of this function may unbind the ports while the monitor |
// is still accepting connections on them. | // is still accepting connections on them. |
|
|
// The monitor is probably busy processng a very long request, and is | // The monitor is probably busy processng a very long request, and is |
// not accepting connections. Let the caller unbind the ports. | // not accepting connections. Let the caller unbind the ports. |
} | } |
|
} |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
} | } |
|
|
int type) | int type) |
{ | { |
PEG_METHOD_ENTER(TRC_HTTP, "Monitor::solicitSocketMessages"); | PEG_METHOD_ENTER(TRC_HTTP, "Monitor::solicitSocketMessages"); |
|
AutoMutex autoMut(_entry_mut); |
_entry_mut.lock(pegasus_thread_self()); |
|
// Check to see if we need to dynamically grow the _entries array | // Check to see if we need to dynamically grow the _entries array |
// We always want the _entries array to 2 bigger than the | // We always want the _entries array to 2 bigger than the |
// current connections requested | // current connections requested |
|
|
_entries[index].queueId = queueId; | _entries[index].queueId = queueId; |
_entries[index]._type = type; | _entries[index]._type = type; |
_entries[index]._status = _MonitorEntry::IDLE; | _entries[index]._status = _MonitorEntry::IDLE; |
_entry_mut.unlock(); |
|
| |
return index; | return index; |
} | } |
|
|
catch(...) | catch(...) |
{ | { |
} | } |
|
|
} | } |
_solicitSocketCount--; // decrease the count, if we are here we didnt do anything meaningful | _solicitSocketCount--; // decrease the count, if we are here we didnt do anything meaningful |
_entry_mut.unlock(); |
|
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
return -1; | return -1; |
| |
|
|
{ | { |
| |
PEG_METHOD_ENTER(TRC_HTTP, "Monitor::unsolicitSocketMessages"); | PEG_METHOD_ENTER(TRC_HTTP, "Monitor::unsolicitSocketMessages"); |
_entry_mut.lock(pegasus_thread_self()); |
AutoMutex autoMut(_entry_mut); |
| |
/* | /* |
Start at index = 1 because _entries[0] is the tickle entry which never needs | Start at index = 1 because _entries[0] is the tickle entry which never needs |
|
|
index--; | index--; |
} | } |
| |
_entry_mut.unlock(); |
|
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
} | } |
| |
|
// Note: this is no longer called with PEP 183. |
PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL Monitor::_dispatch(void *parm) | PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL Monitor::_dispatch(void *parm) |
{ | { |
HTTPConnection *dst = reinterpret_cast<HTTPConnection *>(parm); | HTTPConnection *dst = reinterpret_cast<HTTPConnection *>(parm); |
|
|
| |
PEG_METHOD_ENTER(TRC_HTTP, "monitor_2::solicitSocketMessages"); | PEG_METHOD_ENTER(TRC_HTTP, "monitor_2::solicitSocketMessages"); |
| |
_entry_mut.lock(pegasus_thread_self()); |
AutoMutex autoMut(_entry_mut); |
| |
for(int index = 0; index < (int)_entries.size(); index++) | for(int index = 0; index < (int)_entries.size(); index++) |
{ | { |
|
|
//_entries[index].queueId = queueId; | //_entries[index].queueId = queueId; |
//_entries[index]._type = type; | //_entries[index]._type = type; |
_entries[index]._status = IDLE; | _entries[index]._status = IDLE; |
_entry_mut.unlock(); |
|
| |
return index; | return index; |
} | } |
|
|
} | } |
| |
} | } |
_entry_mut.unlock(); |
|
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
return -1; | return -1; |
} | } |
|
|
{ | { |
| |
PEG_METHOD_ENTER(TRC_HTTP, "monitor_2::unsolicitSocketMessages"); | PEG_METHOD_ENTER(TRC_HTTP, "monitor_2::unsolicitSocketMessages"); |
_entry2_mut.lock(pegasus_thread_self()); |
AutoMutex autoMut(_entry2_mut); |
| |
for(int index = 0; index < (int)_entries2.size(); index++) | for(int index = 0; index < (int)_entries2.size(); index++) |
{ | { |
|
|
break; | break; |
} | } |
} | } |
_entry2_mut.unlock(); |
|
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
} | } |
| |