MonitorTable Class Reference

#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< ClientDataclient_data
vector< StorageDatastorage_data
queue< MonitorEvent * > event_queue
pthread_mutex_t table_access
sem_t event_queue_semaphore
bool stopThread

Detailed Description

Definition at line 136 of file MonitorTable.h.


Constructor & Destructor Documentation

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 }


Member Function Documentation

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 }


Field Documentation

Definition at line 138 of file MonitorTable.h.

Definition at line 140 of file MonitorTable.h.

Definition at line 143 of file MonitorTable.h.

bool MonitorTable::stopThread [private]

Definition at line 145 of file MonitorTable.h.

Definition at line 139 of file MonitorTable.h.

pthread_mutex_t MonitorTable::table_access [private]

Definition at line 142 of file MonitorTable.h.


The documentation for this class was generated from the following files:
Generated on Wed Jul 4 16:03:35 2012 for RIO by  doxygen 1.6.3