#include <MonitorTable.h>
Public Member Functions | |
MonitorTable () | |
void | getData (vector< ClientData > &clientTable, vector< StorageData > &storageTable) |
void | putMonitorEvent (MonitorEvent *event) |
void | Monitor () |
void | Stop () |
Nova funcao para parar a thread de monitoramento. | |
Private Attributes | |
vector< ClientData > | client_data |
vector< StorageData > | storage_data |
queue< MonitorEvent * > | event_queue |
pthread_mutex_t | table_access |
sem_t | event_queue_semaphore |
bool | stopThread |
Definition at line 136 of file MonitorTable.h.
MonitorTable::MonitorTable | ( | ) |
Definition at line 204 of file MonitorTable.cpp.
00205 { 00206 pthread_mutex_init( &table_access, NULL ); 00207 sem_init( &event_queue_semaphore, 0, 0 ); 00208 // Inicializa a variavel que informa se a thread de monitoramento deve ser 00209 // finalizada. 00210 stopThread = false; 00211 }
void MonitorTable::getData | ( | vector< ClientData > & | clientTable, | |
vector< StorageData > & | storageTable | |||
) |
Definition at line 213 of file MonitorTable.cpp.
00215 { 00216 pthread_mutex_lock( &table_access ); 00217 clientTable.insert( clientTable.begin(), client_data.begin(), client_data.end() ); 00218 storageTable.insert( storageTable.begin(), storage_data.begin(), storage_data.end() ); 00219 pthread_mutex_unlock( &table_access ); 00220 }
void MonitorTable::Monitor | ( | ) |
Definition at line 230 of file MonitorTable.cpp.
00231 { 00232 00233 RioErr << "MONITORTHREADID " << syscall( SYS_gettid ) << endl; 00234 00235 while( true ) 00236 { 00237 sem_wait( &event_queue_semaphore ); 00238 pthread_mutex_lock( &table_access ); 00239 00240 // Verifica se devemos terminar a thread. 00241 if( stopThread ) 00242 { 00243 RioErr << "MonitorTable::Monitor thread terminada!" << endl; 00244 pthread_mutex_unlock( &table_access ); 00245 pthread_exit( NULL ); 00246 00247 } 00248 if( event_queue.empty() ) 00249 { 00250 pthread_mutex_unlock( &table_access ); 00251 continue; 00252 } 00253 00254 MonitorEvent *event = event_queue.front(); 00255 switch( event->getType() ) 00256 { 00257 case CLIENT_LIST_EVENT + CONNECT_EVENT: 00258 { 00259 ConnectEvent *c_event = (ConnectEvent *)event; 00260 ClientData data; 00261 data.m_ip = c_event->getIP(); 00262 data.m_port = c_event->getPort(); 00263 data.m_video = c_event->getVideo(); 00264 time( &(data.m_time) ); 00265 data.m_queue = 0; 00266 client_data.push_back( data ); 00267 break; 00268 } 00269 case CLIENT_LIST_EVENT + UPDATE_QUEUE_EVENT: 00270 { 00271 UpdateQueueEvent *uq_event = (UpdateQueueEvent *)event; 00272 vector<ClientData>::iterator it; 00273 for( it = client_data.begin(); it != client_data.end(); it++ ) 00274 { 00275 if( (*it).m_ip != uq_event->getIP() ) 00276 continue; 00277 if( (*it).m_port != uq_event->getPort() ) 00278 continue; 00279 (*it).m_queue = uq_event->getQueue(); 00280 } 00281 break; 00282 } 00283 case CLIENT_LIST_EVENT + DISCONNECT_EVENT: 00284 { 00285 DisconnectEvent *d_event = (DisconnectEvent *)event; 00286 vector<ClientData>::iterator it; 00287 for( it = client_data.begin(); it != client_data.end(); it++ ) 00288 { 00289 if( (*it).m_ip != d_event->getIP() ) 00290 continue; 00291 if( (*it).m_port != d_event->getPort() ) 00292 continue; 00293 if( (*it).m_video != d_event->getVideo() ) 00294 continue; 00295 client_data.erase( it ); 00296 it--; 00297 break; 00298 } 00299 break; 00300 } 00301 case STORAGE_LIST_EVENT + ADD_NODE_EVENT: 00302 { 00303 AddNodeEvent *an_event = (AddNodeEvent *)event; 00304 StorageData data; 00305 data.m_hostname = an_event->getHostName(); 00306 data.m_ip = an_event->getIP(); 00307 data.m_diskname = ALL_DISKS; 00308 data.m_queue = 0; 00309 storage_data.push_back( data ); 00310 break; 00311 } 00312 case STORAGE_LIST_EVENT + ADD_DISK_EVENT: 00313 { 00314 AddDiskEvent *ad_event = (AddDiskEvent *)event; 00315 vector<StorageData>::iterator it; 00316 for( it = storage_data.begin(); it != storage_data.end(); it++ ) 00317 { 00318 if( (*it).m_hostname == ad_event->getHostName() ) 00319 { 00320 StorageData data; 00321 data.m_ip = ""; 00322 data.m_hostname = ad_event->getHostName(); 00323 data.m_diskname = ad_event->getDiskName(); 00324 data.m_queue = 0; 00325 00326 it++; 00327 storage_data.insert( it, data ); 00328 break; 00329 } 00330 } 00331 break; 00332 } 00333 case STORAGE_LIST_EVENT + UPDATE_DISK_QUEUE_EVENT: 00334 { 00335 UpdateDiskQueueEvent *udq_event = (UpdateDiskQueueEvent *)event; 00336 vector<StorageData>::iterator it, disk_it; 00337 for( it = storage_data.begin(); it != storage_data.end(); it++ ) 00338 { 00339 if( (*it).m_hostname == udq_event->getHostName() ) 00340 break; 00341 } 00342 (*it).m_queue = 0; 00343 for( disk_it = it + 1; disk_it != storage_data.end(); disk_it++ ) 00344 { 00345 if( (*disk_it).m_hostname != udq_event->getHostName() ) 00346 break; 00347 00348 if( (*disk_it).m_diskname == udq_event->getDiskName() ) 00349 (*disk_it).m_queue = udq_event->getQueue(); 00350 00351 (*it).m_queue += (*disk_it).m_queue; 00352 } 00353 break; 00354 } 00355 } 00356 event_queue.pop(); 00357 delete event; 00358 pthread_mutex_unlock( &table_access ); 00359 } 00360 }
void MonitorTable::putMonitorEvent | ( | MonitorEvent * | event | ) |
Definition at line 222 of file MonitorTable.cpp.
00223 { 00224 pthread_mutex_lock( &table_access ); 00225 event_queue.push( event ); 00226 sem_post( &event_queue_semaphore ); 00227 pthread_mutex_unlock( &table_access ); 00228 }
void MonitorTable::Stop | ( | void | ) |
Nova funcao para parar a thread de monitoramento.
Definition at line 363 of file MonitorTable.cpp.
00364 { 00365 pthread_mutex_lock( &table_access ); 00366 // Informa que a thread deve ser finalizada. 00367 stopThread = true; 00368 // Desbloquea a thread caso ela esteja bloqueada no semaforo. 00369 sem_post( &event_queue_semaphore ); 00370 pthread_mutex_unlock( &table_access ); 00371 }
vector<ClientData> MonitorTable::client_data [private] |
Definition at line 138 of file MonitorTable.h.
queue<MonitorEvent *> MonitorTable::event_queue [private] |
Definition at line 140 of file MonitorTable.h.
sem_t MonitorTable::event_queue_semaphore [private] |
Definition at line 143 of file MonitorTable.h.
bool MonitorTable::stopThread [private] |
Definition at line 145 of file MonitorTable.h.
vector<StorageData> MonitorTable::storage_data [private] |
Definition at line 139 of file MonitorTable.h.
pthread_mutex_t MonitorTable::table_access [private] |
Definition at line 142 of file MonitorTable.h.