CLeakBucket Class Reference

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 FragmentInfoRemove ()
 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).

Detailed Description

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.


Constructor & Destructor Documentation

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.

Parameters:
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 }


Member Function Documentation

void CLeakBucket::AddCredits ( unsigned int  Value  )  [protected, virtual]

AddCredits adiciona creditos ao numero de creditos de um objeto da classe.

Parameters:
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.

Returns:
numero de creditos do objeto.

Definition at line 358 of file StreamControl.cpp.

00359 {
00360     #ifdef RIO_DEBUG1
00361     RioErr << "[CLeakBucket - GetCredits] Single" << endl;
00362     #endif
00363 
00364     return m_Credits;
00365 } 

unsigned int CLeakBucket::GetMaxCredits (  )  [protected]

GetMaxCredits retorna o numero maximo de creditos de um objeto da classe.

Returns:
numero maximo de creditos do objeto.

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").

Returns:
tempo da proxima atualizacao do credito.

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.

Returns:
ponteiro para o elemento do inicio da fila que foi removido, se o objeto possuir creditos e a fila nao estiver vazia, ou NULL em caso contrario (isto e, se a fila estiver vazia ou se o objeto nao possuir creditos).

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.

Parameters:
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.

Parameters:
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.

Returns:
true se o objeto possuir creditos, ou false em caso contrario.

Definition at line 425 of file StreamControl.cpp.

00426 {
00427     #ifdef RIO_DEBUG1
00428     RioErr << "[CLeakBucket - VerifyCredits] Single" << endl;
00429     #endif
00430 
00431     return  m_Credits > 0;
00432 }


Field Documentation

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.


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