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. | |
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. | |
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. |
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.
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.
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 }
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.
fip | ponteiro para o objeto a ser inserido no final da fila. |
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.
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 }
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.