CSendData Class Reference

Classe para implementar a fila FIFO dos objetos FragmentInfo que estao esperando para serem enviados. More...

#include <StreamControl.h>

Inherits CLeakBucket.

Public Member Functions

 CSendData (unsigned int MaxCredits, unsigned long long int TimeBetweenCredits)
 CSendData construtor da classe, chamado quando um objeto e criado usando o comando new.
 ~CSendData ()
 ~CSendData destrutor da classe, chamado quando um objeto e removido com o comando delete.
int Insert (FragmentInfo *fip)
 Insert Insere um objeto FragmentInfo no final da fila.
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.
void UpdateCredits ()
 UpdateCredits atualiza o numero de creditos de um objeto da classe.

Private Member Functions

void DecCredits ()
 DecCredits decrementa o numero de creditos de um objeto da classe em 1 unidade.

Private Attributes

pthread_mutex_t m_AccessLeakBucket
 Mutex para garantir o acesso exclusivo as variaveis MaxCredits e Credits.
pthread_mutex_t m_AccessFragmentQueue
 Mutex para garantir o acesso exclusivo a fila FIFO.
pthread_cond_t m_WaitObject
 Variavel de condicao usada pela thread que envia os objetos FragmentInfo para esperar pelo evento indicando que a fila FIFO da classe, com objetos FragmentInfo, deixou de ficar vazia.
pthread_cond_t m_WaitCredits
 Variavel de condicao usada pela thread que envia os objetos FragmentInfo para esperar por creditos para enviar um objeto FragmentInfo.
pthread_cond_t m_WaitUseCredits
 Variavel de condicao usada para bloquear a thread que incrementa os creditos da classe caso estes ja estejam no maximo.

Detailed Description

Classe para implementar a fila FIFO dos objetos FragmentInfo que estao esperando para serem enviados.

A classe e derivada da anterior (LeackBucket) e implementa uma variavel de condicao que ira bloquear a thread que chamar a funcao Remove caso a fila esteja vazia.

Definition at line 280 of file StreamControl.h.


Constructor & Destructor Documentation

CSendData::CSendData ( unsigned int  MaxCredits,
unsigned long long int  TimeBetweenCredits 
)

CSendData construtor da classe, chamado quando um objeto e criado usando o comando new.

Esta classe e derivada da classe CLeakBucket, descrita anteriormente.

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 538 of file StreamControl.cpp.

00540           :CLeakBucket( MaxCredits, TimeBetweenCredits )
00541 {
00542     #ifdef RIO_DEBUG1
00543     RioErr << "[CSendData - Construtor] Start" << endl;
00544     #endif
00545 
00546     // Inicializa o mutex da classe para o acesso a fila FIFO.
00547     pthread_mutex_init( &m_AccessFragmentQueue, NULL );
00548     // Inicializa o mutex da classe para o acesso as variaveis Credits e
00549     // MaxCredits.
00550     pthread_mutex_init( &m_AccessLeakBucket, NULL );
00551     // Cria a variavel de condicao da classe (usada para esperar por objetos).
00552     pthread_cond_init( &m_WaitObject, NULL );
00553     // Cria a variavel de condicao da classe (usada para esperar por creditos).
00554     pthread_cond_init( &m_WaitCredits, NULL );
00555     // Cria a variavel de condicao da classe (usada para esperar que os
00556     // creditos sejam decrementados em 1 unidade).
00557     pthread_cond_init( &m_WaitUseCredits, NULL );
00558 
00559     #ifdef RIO_DEBUG1
00560     RioErr << "[CSendData - Construtor] Finish" << endl;
00561     #endif
00562 }

CSendData::~CSendData (  ) 

~CSendData destrutor da classe, chamado quando um objeto e removido com o comando delete.

Definition at line 565 of file StreamControl.cpp.

00566 {
00567     #ifdef RIO_DEBUG1
00568     RioErr << "[CSendData - Destrutor] Start" << endl;
00569     #endif
00570 
00571     // Remove o mutex da classe para o acesso a fila FIFO.
00572     pthread_mutex_destroy( &m_AccessFragmentQueue );
00573     // Remove o mutex da classe para o acesso as variaveis Credits e
00574     // MaxCredits.
00575     pthread_mutex_destroy( &m_AccessLeakBucket );
00576     // Remove o mutex da classe para o acesso a fila FIFO.
00577     pthread_mutex_destroy( &m_AccessFragmentQueue );
00578     // Remove a variavel de condicao da classe (usada para esperar por
00579     // objetos).
00580     pthread_cond_destroy( &m_WaitObject );
00581     // Remove a variavel de condicao da classe (usada para esperar por
00582     // creditos).
00583     pthread_cond_destroy( &m_WaitCredits );
00584     // Remove a variavel de condicao da classe (usada para esperar que os
00585     // creditos sejam decrementados em 1 unidade).
00586     pthread_cond_destroy( &m_WaitUseCredits );
00587     
00588     #ifdef RIO_DEBUG1
00589     RioErr << "[CSendData - Destrutor] Finish" << endl;
00590     #endif
00591 }


Member Function Documentation

void CSendData::DecCredits (  )  [private, virtual]

DecCredits decrementa o numero de creditos de um objeto da classe em 1 unidade.

Note que esta funcao desbloqueara a thread bloqueada na variavel de condicao m_WaitUseCredits (a que incrementa os creditos da classe) caso o numero de creditos estivesse em seu valor maximo, pois agora a thread pode voltar a incrementar os creditos do objeto.

Reimplemented from CLeakBucket.

Definition at line 594 of file StreamControl.cpp.

00595 {
00596     bool SendSignal;
00597 
00598     #ifdef RIO_DEBUG1
00599     RioErr << "[CSendData - DecCredits] Start" << endl;
00600     #endif
00601 
00602     // Verifica se os creditos estavam no maximo.
00603     // Chama a funcao da classe pai para decrementar os creditos.
00604     CLeakBucket::DecCredits();
00605     SendSignal = ( GetCredits() == ( GetMaxCredits() - 1 ) );
00606     // Se o numero de creditos estava no maximo, enviamos um sinal para 
00607     // desbloquear, se necessario, a thread que incrementa os creditos.
00608     if( SendSignal )
00609         pthread_cond_signal( &m_WaitUseCredits );
00610 
00611     #ifdef RIO_DEBUG1
00612     RioErr << "[CSendData - DecCredits] Finish" << endl;
00613     #endif
00614 }

int CSendData::Insert ( FragmentInfo fip  )  [virtual]

Insert Insere um objeto FragmentInfo no final da fila.

Se a fila estava vazia antes da insercao do elemento, um sinal sera enviado a thread que foi bloqueada na variavel de condicao m_WaitObject ao executar a funcao Remove dada a seguir, pois agora existem elementos a serem removidos da fila.

Parameters:
fip ponteiro para o objeto a ser inserido no final da fila.
Returns:
S_OK se o objeto foi corretamente inserido na fila, e valor diferente de S_OK se algum erro ocorreu ao inserir o objeto.

Reimplemented from CFragmentQueue.

Definition at line 621 of file StreamControl.cpp.

00622 {
00623     int result;
00624     bool SendSignal;
00625 
00626     #ifdef RIO_DEBUG1
00627     RioErr << "[CSendData - Insert] Start" << endl;
00628     #endif
00629 
00630     // Chama o metodo da classe pai para inserir o objeto FragmentInfo.
00631     // Obtem acesso exclusivo a fila FIFO.
00632     pthread_mutex_lock( &m_AccessFragmentQueue );
00633     SendSignal = IsEmpty();
00634     result = CLeakBucket::Insert( fip );
00635     #ifdef RIO_DEBUG2
00636     // Imprime a lista obtida apos a insercao do objeto.
00637     CLeakBucket::PrintFragmentQueue( "Insercao em CSendData" );
00638     #endif
00639     if( ( result == S_OK ) && ( SendSignal ) )
00640         pthread_cond_signal( &m_WaitObject );
00641     // Libera o acesso exclusivo a fila FIFO.
00642     pthread_mutex_unlock( &m_AccessFragmentQueue );
00643 
00644     #ifdef RIO_DEBUG1
00645     RioErr << "[CSendData - Insert] Finish" << endl;
00646     #endif
00647 
00648     return result;
00649 }

FragmentInfo * CSendData::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 da classe sera decrementado em 1 unidade. Se o objeto na classe nao possuir creditos, a thread que chamou a funcao sera bloqueada na variavel de condicao m_WaitCredits (esperando que seja desbloqueada pela funcao UpdateCretids). Se o objeto possuir creditos e se a fila estiver vazia , a thread que chamou a funcao sera bloqueada na variavel de condicao m_WaitObject, ate que um elemento seja inserido na fila pela funcao Insert.

Returns:
ponteiro para o elemento do inicio da fila que foi removido. Note, pelo que foi descrito anteriormente, que a funcao somente retornara se o objeto possuir creditos e existir pelo menos um elemento na fila.

Reimplemented from CLeakBucket.

Definition at line 657 of file StreamControl.cpp.

00658 {
00659     FragmentInfo *fip;
00660 
00661     #ifdef RIO_DEBUG1
00662     RioErr << "[CSendData - Remove] Start" << endl;
00663     #endif
00664 
00665     // Verifica agora se existem creditos para enviar o objeto FragmentInfo. 
00666     // Obtem acesso exclusivo as variaveis de creditos da classe. Caso nao
00667     // existam creditos, espera na variavel de condicao m_WaitCredits.
00668     // Obtem acesso exclusivo as variaveis de creditos da classe.
00669     pthread_mutex_lock( &m_AccessLeakBucket );
00670     if( !VerifyCredits() ) 
00671     {
00672         #ifdef RIO_DEBUG2
00673         RioErr << "CSendData::Remove esperando por creditos." << endl;
00674         #endif
00675         pthread_cond_wait( &m_WaitCredits, &m_AccessLeakBucket );
00676     }
00677     // Decrementa o numero de creditos para garantir que nenhuma outra
00678     // thread use o credito obtido apos o desbloqueio.
00679     DecCredits();
00680     // Libera o acesso exclusivo as variaveis de creditos da classe.
00681     pthread_mutex_unlock( &m_AccessLeakBucket );
00682     // Obtem acesso exclusivo a fila FIFO.
00683     pthread_mutex_lock( &m_AccessFragmentQueue );
00684     // Verifica se existe um objeto na lista. Se nao existir nenhum objeto,
00685     // a thread sera bloqueada na variavel de condicao m_WaitObject para 
00686     // esperar pelo objeto.
00687     if( IsEmpty() ) 
00688     {
00689         #ifdef RIO_DEBUG2
00690         RioErr << "CSendData::Remove esperando por um objeto." << endl;
00691         #endif
00692         pthread_cond_wait( &m_WaitObject, &m_AccessFragmentQueue );
00693     }
00694     // Depois de esperarmos com sucesso (sem bloqueio, ou esperando e depois
00695     // sendo desbloqueado, ja existe um objeto FragmentInfo na fila da classe e 
00696     // temos creditos para envia-lo. Entao, basta pegar o objeto. 
00697     // Usamos a funcao Remove da classe pai para obter este objeto.
00698     fip = CFragmentQueue::Remove(); // Note que um retorno NULL indica um erro na
00699     #ifdef RIO_DEBUG2
00700     // Imprime a lista obtida apos a remocao do objeto.
00701     CLeakBucket::PrintFragmentQueue( "Remocao em CSendData" );
00702     #endif 
00703     // Libera o acesso exclusivo a fila FIFO.
00704     pthread_mutex_unlock( &m_AccessFragmentQueue );
00705 
00706     #ifdef RIO_DEBUG1
00707     RioErr << "[CSendData - Remove] Finish" << endl;
00708     #endif
00709 
00710     return fip;
00711 }

void CSendData::UpdateCredits (  )  [virtual]

UpdateCredits atualiza o numero de creditos de um objeto da classe.

Se o numero de creditos da classe for igual ao maximo, a thread que chamou a funcao sera bloqueada na variavel de condicao m_WaitUseCredits ate que o credto da classe seja decrementado e a funcao possa incrementar os creditos da classe. Se ja podemos incrementar o credito do objeto e 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 from CLeakBucket.

Definition at line 718 of file StreamControl.cpp.

00719 {
00720     bool SendSignal, Wait;
00721 
00722     #ifdef RIO_DEBUG1
00723     RioErr << "[CSendData - UpdateCredits] Start" << endl;
00724     #endif
00725 
00726     // Obtem o tempo de espera, em que a thread de atualizacao dos creditos
00727     // devera ficar bloqueada (usando a funcao usleep).
00728     // Obtem acesso exclusivo as variaveis de creditos da classe
00729     pthread_mutex_lock( &m_AccessLeakBucket );
00730     // Verifica se precisamos bloquear esperando pelo decrescimo dos creditos.
00731     // Isso ocorrera se o numero de creditos for igual ao maximo.
00732     Wait = ( GetCredits() == GetMaxCredits() );
00733     if( Wait )
00734         pthread_cond_wait( &m_WaitUseCredits, &m_AccessLeakBucket );
00735     SendSignal = !VerifyCredits();
00736     // Atualiza os creditos da classe.
00737     CLeakBucket::UpdateCredits(); 
00738     // Envia o sinal para desbloquear a thread de envio caso nao existissem
00739     // creditos (a thread pode estar bloqueada esperando por threads na 
00740     // variavel de condicao m_WaitCredits).
00741     if( SendSignal )
00742         pthread_cond_signal( &m_WaitCredits );
00743     // Libera o acesso exclusivo as variaveis de creditos da classe
00744     pthread_mutex_unlock( &m_AccessLeakBucket );
00745 
00746     #ifdef RIO_DEBUG1
00747     RioErr << "[CSendData - UpdateCredits] Finish" << endl;
00748     #endif
00749 }


Field Documentation

pthread_mutex_t CSendData::m_AccessFragmentQueue [private]

Mutex para garantir o acesso exclusivo a fila FIFO.

Definition at line 288 of file StreamControl.h.

pthread_mutex_t CSendData::m_AccessLeakBucket [private]

Mutex para garantir o acesso exclusivo as variaveis MaxCredits e Credits.

Definition at line 286 of file StreamControl.h.

pthread_cond_t CSendData::m_WaitCredits [private]

Variavel de condicao usada pela thread que envia os objetos FragmentInfo para esperar por creditos para enviar um objeto FragmentInfo.

Definition at line 298 of file StreamControl.h.

pthread_cond_t CSendData::m_WaitObject [private]

Variavel de condicao usada pela thread que envia os objetos FragmentInfo para esperar pelo evento indicando que a fila FIFO da classe, com objetos FragmentInfo, deixou de ficar vazia.

Definition at line 293 of file StreamControl.h.

pthread_cond_t CSendData::m_WaitUseCredits [private]

Variavel de condicao usada para bloquear a thread que incrementa os creditos da classe caso estes ja estejam no maximo.

A funcao DecCredits, dada a seguir, ira desbloquear a thread ao decrementar os creditos.

Definition at line 304 of file StreamControl.h.


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