Classe para implementar a estrutura de dados usada pelo Leak Bucket. More...
#include <StreamControl.h>
Inherits CFragmentQueue.
Inherited by CClientInfo, and CSendData.
Public Member Functions | |
CLeakBucket (unsigned int MaxCredits, unsigned long long int TimeBetweenCredits) | |
CLeakBucket construtor da classe, chamado quando um novo objeto e criado com o comando new. | |
virtual | ~CLeakBucket () |
~CLeakBucket destrutor da classe, chamado quando um objeto e removido com o comando delete. | |
virtual bool | VerifyCredits () |
VerifyCredits verifica se um objeto da classe possui creditos. | |
virtual FragmentInfo * | Remove () |
Remove remove um dos elementos do inicio da fila FIFO de um objeto da classe, se a fila nao estiver vazia e se este objeto possuir creditos. | |
virtual void | UpdateCredits () |
UpdateCredits atualiza, se necessario, o numero de creditos de um objeto da classe. | |
virtual unsigned long long int | NextTimeToUpdateCredits () |
NextTimeToUpdateCredits retorna o tempo, em microsegundos, da proxima atualizacao do credito. | |
Protected Member Functions | |
unsigned int | GetCredits () |
GetCredits retorna o numero de creditos de um objeto da classe. | |
unsigned int | GetMaxCredits () |
GetMaxCredits retorna o numero maximo de creditos de um objeto da classe. | |
virtual void | AddCredits (unsigned int Value) |
AddCredits adiciona creditos ao numero de creditos de um objeto da classe. | |
virtual void | DecCredits () |
DecCredits decrementa o numero de creditos de um objeto da classe em 1 unidade. | |
Private Member Functions | |
void | SetMaxCredits (unsigned int Value) |
SetMaxCredits altera o numero maximo de creditos a serem contabilizados por um objeto da classe. | |
void | SetTimeBetweenCredits (unsigned long long int Value) |
SetTimeBetweenCredits altera o tempo (em microsegundos) entre duas atualizacoes do credito de um objeto da classe. | |
Private Attributes | |
unsigned int | m_MaxCredits |
Numero maximo de creditos. | |
unsigned int | m_Credits |
Numero de creditos atual. | |
unsigned long long int | m_LastUpdateCredits |
Tempo da ultima atualizacao dos creditos (em microsegundos). | |
unsigned long long int | m_TimeBetweenCredits |
Tempo que deve ser passado entre as atualizacoes (em microsegundos). |
Classe para implementar a estrutura de dados usada pelo Leak Bucket.
Esta estrutura sera uma fila FIFO. Logo, a funcao de insercao colocara um objeto no final da lista e a funcao de remocao retirara o objeto do inicio da fila. A classe tambem ira implementar um mutex para acessar a classe, pois as funcoes Insert e Remove serao usadas por threads diferentes, assim como as funcoes que gerenciam os creditos (AddCredits, MaxCredits, AvaliableCredits e VerifyCredits).
Definition at line 154 of file StreamControl.h.
CLeakBucket::CLeakBucket | ( | unsigned int | MaxCredits, | |
unsigned long long int | TimeBetweenCredits | |||
) |
CLeakBucket construtor da classe, chamado quando um novo objeto e criado com o comando new.
MaxCredits | valor inteiro (nao sinalizado), definindo o numero maximo de creditos a serem contabilizados pelo objeto criado. | |
TimeBetweenCredits | tempo em microsegundos entre duas atualizacoes do credito do objeto. |
Definition at line 277 of file StreamControl.cpp.
00279 { 00280 struct timeval CreateTime; 00281 00282 #ifdef RIO_DEBUG1 00283 RioErr << "[CLeakBucket - Construtor] Start" << endl; 00284 #endif 00285 00286 // Inicializa as variaveis da classe. 00287 SetMaxCredits( MaxCredits ); 00288 SetTimeBetweenCredits( TimeBetweenCredits ); 00289 m_Credits = 1; //MaxCredits; 00290 gettimeofday( &CreateTime, NULL ); 00291 m_LastUpdateCredits = ( ( unsigned long long int ) CreateTime.tv_sec ) 00292 * 1000000ull + 00293 ( ( unsigned long long int ) CreateTime.tv_usec ); 00294 #ifdef RIO_DEBUG2 00295 PrintLeakBucketInfo( "Construtor da classe" ); 00296 #endif 00297 00298 #ifdef RIO_DEBUG1 00299 RioErr << "[CLeakBucket - Construtor] Finish" << endl; 00300 #endif 00301 }
CLeakBucket::~CLeakBucket | ( | ) | [virtual] |
~CLeakBucket destrutor da classe, chamado quando um objeto e removido com o comando delete.
Definition at line 304 of file StreamControl.cpp.
00305 { 00306 #ifdef RIO_DEBUG1 00307 RioErr << "[CLeakBucket - Destrutor] Single" << endl; 00308 #endif 00309 }
void CLeakBucket::AddCredits | ( | unsigned int | Value | ) | [protected, virtual] |
AddCredits adiciona creditos ao numero de creditos de um objeto da classe.
Value | numero de creditos a serem adicionados ao credito do objeto. |
Definition at line 378 of file StreamControl.cpp.
00379 { 00380 #ifdef RIO_DEBUG1 00381 RioErr << "[CLeakBucket - AddCredits] Start" << endl; 00382 #endif 00383 00384 if( m_Credits < m_MaxCredits ) 00385 { 00386 // Soma Value a m_Credits. 00387 m_Credits = m_Credits + Value; 00388 // Garante que o valor de m_Credits nao e maior do que m_MaxCredits. 00389 if( m_Credits > m_MaxCredits ) 00390 m_Credits = m_MaxCredits; 00391 #ifdef RIO_DEBUG2 00392 // Imprime as informacoes do LeakBucket, apos a atualizacao. 00393 PrintLeakBucketInfo( "Ao adicionar creditos" ); 00394 #endif 00395 } 00396 00397 #ifdef RIO_DEBUG1 00398 RioErr << "[CLeakBucket - AddCredits] Finish" << endl; 00399 #endif 00400 }
void CLeakBucket::DecCredits | ( | ) | [protected, virtual] |
DecCredits decrementa o numero de creditos de um objeto da classe em 1 unidade.
Reimplemented in CSendData.
Definition at line 403 of file StreamControl.cpp.
00404 { 00405 #ifdef RIO_DEBUG1 00406 RioErr << "[CLeakBucket - DecCredits] Start" << endl; 00407 #endif 00408 00409 // Subtrai um credito de m_Credits 00410 if( m_Credits > 0 ) 00411 { 00412 m_Credits = m_Credits - 1; 00413 #ifdef RIO_DEBUG2 00414 // Imprime as informacoes do LeakBucket, apos a atualizacao. 00415 PrintLeakBucketInfo( "Ao decrementar creditos" ); 00416 #endif 00417 } 00418 00419 #ifdef RIO_DEBUG1 00420 RioErr << "[CLeakBucket - DecCredits] Finish" << endl; 00421 #endif 00422 }
unsigned int CLeakBucket::GetCredits | ( | ) | [protected] |
GetCredits retorna o numero de creditos de um objeto da classe.
Definition at line 358 of file StreamControl.cpp.
unsigned int CLeakBucket::GetMaxCredits | ( | ) | [protected] |
GetMaxCredits retorna o numero maximo de creditos de um objeto da classe.
Definition at line 368 of file StreamControl.cpp.
00369 { 00370 #ifdef RIO_DEBUG1 00371 RioErr << "[CLeakBucket - GetMaxCredits] Single" << endl; 00372 #endif 00373 00374 return m_MaxCredits; 00375 }
unsigned long long int CLeakBucket::NextTimeToUpdateCredits | ( | ) | [virtual] |
NextTimeToUpdateCredits retorna o tempo, em microsegundos, da proxima atualizacao do credito.
Este tempo e o mesmo dado pela funcao gettimeofday da biblioteca C do Linux, isto e, o numero de segundos decorridos desde 0 horas 0 minutos e 0 segundos de 1 de janeiro de 1970 (isso e chamado de "Epoch" no Linux, e e formalmente definido como "00:00:00 UTC, January 1, 1970").
Definition at line 518 of file StreamControl.cpp.
00519 { 00520 #ifdef RIO_DEBUG1 00521 RioErr << "[CLeakBucket - NextTimeToUpdateCredits] Single" << endl; 00522 #endif 00523 00524 return m_LastUpdateCredits + m_TimeBetweenCredits; 00525 }
FragmentInfo * CLeakBucket::Remove | ( | void | ) | [virtual] |
Remove remove um dos elementos do inicio da fila FIFO de um objeto da classe, se a fila nao estiver vazia e se este objeto possuir creditos.
Depois da remocao do elemento do inicio da fila, o numero de creditos do objeto sera decrementado em 1 unidade.
Reimplemented from CFragmentQueue.
Reimplemented in CSendData, and CClientInfo.
Definition at line 438 of file StreamControl.cpp.
00439 { 00440 #ifdef RIO_DEBUG1 00441 RioErr << "[CLeakBucket - Remove] Start" << endl; 00442 #endif 00443 00444 if( ( !IsEmpty() ) && ( VerifyCredits() ) ) 00445 { 00446 // Se existe um objeto FragmentInfo no LeakBucket e o cliente possuir 00447 // mais de um credito para envia-lo. 00448 DecCredits(); 00449 00450 #ifdef RIO_DEBUG1 00451 RioErr << "[CLeakBucket - Remove] Finish1" << endl; 00452 #endif 00453 00454 // Remove o fragmento da fila FIFO, usando a funcao da classe pai. 00455 return CFragmentQueue::Remove(); 00456 } 00457 else 00458 { 00459 00460 #ifdef RIO_DEBUG1 00461 RioErr << "[CLeakBucket - Remove] Finish2" << endl; 00462 #endif 00463 00464 // Se nao existirem objetos FragmentInfo no LeakBucket ou se o cliente 00465 // nao possuir creditos. 00466 return NULL; 00467 } 00468 }
void CLeakBucket::SetMaxCredits | ( | unsigned int | Value | ) | [private] |
SetMaxCredits altera o numero maximo de creditos a serem contabilizados por um objeto da classe.
Value | novo valor para o numero maximo de creditos. |
Definition at line 312 of file StreamControl.cpp.
00313 { 00314 #ifdef RIO_DEBUG1 00315 RioErr << "[CLeakBucket - SetMaxCredits] Start" << endl; 00316 #endif 00317 00318 // Altera o valor m_MaxCredits, com o numero maximo de creditos. 00319 m_MaxCredits = Value; 00320 // Garante que o valor de m_Credits nao e maior do que m_MaxCredits. 00321 if( m_Credits > m_MaxCredits ) 00322 m_Credits = m_MaxCredits; 00323 00324 #ifdef RIO_DEBUG1 00325 RioErr << "[CLeakBucket - SetMaxCredits] Finish" << endl; 00326 #endif 00327 }
void CLeakBucket::SetTimeBetweenCredits | ( | unsigned long long int | Value | ) | [private] |
SetTimeBetweenCredits altera o tempo (em microsegundos) entre duas atualizacoes do credito de um objeto da classe.
Value | novo tempo entre as duas atualizacoes de credito. |
Definition at line 330 of file StreamControl.cpp.
00331 { 00332 #ifdef RIO_DEBUG1 00333 RioErr << "[CLeakBucket - SetTimeBetweenCredits] Single" << endl; 00334 #endif 00335 00336 // Altera o valor m_TimeBetweenCredits, com o numero maximo de creditos. 00337 m_TimeBetweenCredits = Value; 00338 }
void CLeakBucket::UpdateCredits | ( | ) | [virtual] |
UpdateCredits atualiza, se necessario, o numero de creditos de um objeto da classe.
Se o tempo entre as atualizacoes nao passou, o credito nao sera atualizado, e se mais tempo passou, o numero de creditos sera aumentado de acordo (por exemplo, se decorreu um tempo tres vezes maior do que o da atualizacao, o credito sera aumentado em 3 unidades).
Reimplemented in CSendData, and CClientInfo.
Definition at line 475 of file StreamControl.cpp.
00476 { 00477 struct timeval tvUpdateTime; 00478 unsigned long long int UpdateTime, IntervalTime, Credits, RestTime; 00479 00480 #ifdef RIO_DEBUG1 00481 RioErr << "[CLeakBucket - UpdateCredits] Start" << endl; 00482 #endif 00483 00484 // Obtem o tempo em que a funcao UpdateCredits foi executada. 00485 gettimeofday( &tvUpdateTime, NULL ); 00486 // Converte o tempo para microsegundos. 00487 UpdateTime = ( ( unsigned long long int ) tvUpdateTime.tv_sec ) 00488 * 1000000ull + 00489 ( ( unsigned long long int ) tvUpdateTime.tv_usec ); 00490 // Calcula o intervalo de tempo entre esta chamada e a anterior. 00491 IntervalTime = UpdateTime - m_LastUpdateCredits; 00492 // Verifica se devemos atualizar o numero de creditos. 00493 if( IntervalTime >= m_TimeBetweenCredits ) { 00494 // Como o intervalo entre as chamadas e maior ou igual ao valor de 00495 // m_TimeBetweenCredits, deveremos atualizar o credito de acordo com 00496 // o tempo passado, e ajustar a variavel m_LastUpdateCredits de 00497 // acordo. 00498 Credits = IntervalTime / m_TimeBetweenCredits; 00499 RestTime = IntervalTime % m_TimeBetweenCredits; 00500 #ifdef RIO_DEBUG2 00501 RioErr << "CLeakBucket::UpdateCredits Intervalo = " << IntervalTime 00502 << ", m_TimeBetweenCredits = " << m_TimeBetweenCredits 00503 << ", Credits = " << Credits << ", UpdateTime = " 00504 << UpdateTime << ", RestTime = " << RestTime 00505 << ", m_LastUpdateCredits = " << m_LastUpdateCredits << endl; 00506 #endif 00507 AddCredits( Credits ); 00508 m_LastUpdateCredits = UpdateTime - RestTime; 00509 } 00510 00511 #ifdef RIO_DEBUG1 00512 RioErr << "[CLeakBucket - UpdateCredits] Finish" << endl; 00513 #endif 00514 }
bool CLeakBucket::VerifyCredits | ( | ) | [virtual] |
VerifyCredits verifica se um objeto da classe possui creditos.
Definition at line 425 of file StreamControl.cpp.
unsigned int CLeakBucket::m_Credits [private] |
Numero de creditos atual.
Definition at line 160 of file StreamControl.h.
unsigned long long int CLeakBucket::m_LastUpdateCredits [private] |
Tempo da ultima atualizacao dos creditos (em microsegundos).
Definition at line 162 of file StreamControl.h.
unsigned int CLeakBucket::m_MaxCredits [private] |
Numero maximo de creditos.
Definition at line 158 of file StreamControl.h.
unsigned long long int CLeakBucket::m_TimeBetweenCredits [private] |
Tempo que deve ser passado entre as atualizacoes (em microsegundos).
Definition at line 166 of file StreamControl.h.