#include <StreamControl.h>
Inherits CFragmentQueue.
Public Member Functions | |
CFPool () | |
CFPool construtor da classe, chamado quando um objeto e criado usando o comando new. | |
~CFPool () | |
~CFPool 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. | |
void | WaitObject () |
WaitObject funcao usada para esperar que existam objetos na fila FIFO de um objeto da classe. | |
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. | |
Private Attributes | |
pthread_cond_t | m_WaitObject |
Variavel de condicao usada pela thread que processa os clientes para esperar pelo evento indicando que a fila FIFO da classe, com objetos FragmentInfo, deixou de ficar vazia. | |
pthread_mutex_t | m_AccessFragmentQueue |
Mutex para garantir o acesso exclusivo a fila FIFO. |
Definition at line 382 of file StreamControl.h.
CFPool::CFPool | ( | ) |
CFPool construtor da classe, chamado quando um objeto e criado usando o comando new.
Definition at line 757 of file StreamControl.cpp.
00758 { 00759 #ifdef RIO_DEBUG1 00760 RioErr << "[CFPool - Construtor] Start" << endl; 00761 #endif 00762 00763 // Cria a variavel de condicao da classe. 00764 pthread_cond_init( &m_WaitObject, NULL ); 00765 // Cria o mutex usado para garantir o acesso exclusivo a fila FIFO. 00766 pthread_mutex_init( &m_AccessFragmentQueue, NULL ); 00767 00768 #ifdef RIO_DEBUG1 00769 RioErr << "[CFPool - Construtor] Finish" << endl; 00770 #endif 00771 }
CFPool::~CFPool | ( | ) |
~CFPool destrutor da classe, chamado quando um objeto e removido com o comando delete.
Definition at line 774 of file StreamControl.cpp.
00775 { 00776 #ifdef RIO_DEBUG1 00777 RioErr << "[CFPool - Destrutor] Start" << endl; 00778 #endif 00779 00780 // Remove a variavel de condicao da classe. 00781 pthread_cond_destroy( &m_WaitObject ); 00782 // remove o mutex usado para garantir o acesso exclusivo a fila FIFO. 00783 pthread_mutex_destroy( &m_AccessFragmentQueue ); 00784 00785 #ifdef RIO_DEBUG1 00786 RioErr << "[CFPool - Destrutor] Finish" << endl; 00787 #endif 00788 }
int CFPool::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 793 of file StreamControl.cpp.
00794 { 00795 bool SendSignal; 00796 int result; 00797 00798 #ifdef RIO_DEBUG1 00799 RioErr << "[CFPool - Insert] Start" << endl; 00800 #endif 00801 00802 // Usa a funcao Insert da classe pai para inserir o objeto FragmentInfo na 00803 // fila FIFO. 00804 // Obtem acesso exclusivo a fila FIFO. 00805 pthread_mutex_lock( &m_AccessFragmentQueue ); 00806 SendSignal = IsEmpty(); 00807 result = CFragmentQueue::Insert( fip ); 00808 #ifdef RIO_DEBUG2 00809 // Imprime a lista obtida apos a insercao do objeto. 00810 CFragmentQueue::PrintFragmentQueue( "Insercao em CFPool" ); 00811 #endif 00812 // Se nao ocorreu nenhum erro na insercao, devemos gerar um sinal 00813 // informando que um objeto foi inserido, se o pool estava vazio antes 00814 // da insercao (obs: devemos usar S_OK ao inves de S_OK?) 00815 if( ( result == S_OK ) && ( SendSignal ) ) 00816 // Envia um sinal para a variavel de condicao, para desbloquear, se 00817 // necessario, uma thread que esteja esperando pela condicao, que e a 00818 // insercao de um objeto FragmentInfo no pool. 00819 pthread_cond_signal( &m_WaitObject ); 00820 // Libera o acesso exclusivo a fila FIFO. 00821 pthread_mutex_unlock( &m_AccessFragmentQueue ); 00822 00823 #ifdef RIO_DEBUG1 00824 RioErr << "[CFPool - Insert] Finish" << endl; 00825 #endif 00826 00827 return result; 00828 }
FragmentInfo * CFPool::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.
Reimplemented from CFragmentQueue.
Definition at line 865 of file StreamControl.cpp.
00866 { 00867 FragmentInfo *fip; 00868 00869 #ifdef RIO_DEBUG1 00870 RioErr << "[CFPool - Remove] Start" << endl; 00871 #endif 00872 00873 // Usa a funcao Remove da classe pai para tentar remover um objeto 00874 // FragmentInfo da fila FIFO. 00875 // Obtem acesso exclusivo a fila FIFO. 00876 pthread_mutex_lock( &m_AccessFragmentQueue ); 00877 fip = CFragmentQueue::Remove(); 00878 #ifdef RIO_DEBUG2 00879 // Imprime a lista obtida apos a remocao do objeto. 00880 CFragmentQueue::PrintFragmentQueue( "Remocao em CFPool" ); 00881 #endif 00882 // Libera o acesso exclusivo a fila FIFO. 00883 pthread_mutex_unlock( &m_AccessFragmentQueue ); 00884 00885 #ifdef RIO_DEBUG1 00886 RioErr << "[CFPool - Remove] Finish" << endl; 00887 #endif 00888 00889 return fip; 00890 }
void CFPool::WaitObject | ( | ) |
WaitObject funcao usada para esperar que existam objetos na fila FIFO de um objeto da classe.
Se a fila nao estiver vazia, a funcao retornara imediatamente o controle a thread que a executou. Porem, caso a fila esteja 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.
Definition at line 834 of file StreamControl.cpp.
00835 { 00836 #ifdef RIO_DEBUG1 00837 RioErr << "[CFPool - WaitObject] Start" << endl; 00838 #endif 00839 00840 // Usa a funcao Remove da classe pai para tentar remover um objeto 00841 // FragmentInfo da fila FIFO. 00842 // Obtem acesso exclusivo a fila FIFO. 00843 pthread_mutex_lock( &m_AccessFragmentQueue ); 00844 if( IsEmpty() ) 00845 { 00846 // Espera na variavel de condicao pela chegada de um objeto 00847 // FragmentInfo. A thread que chamou Insert sera bloqueada ate que a 00848 // funcao Insert seja chamada e gere um sinal para a variavel de 00849 // condicao, o que ira em consequencia desbloquear a thread. 00850 #ifdef RIO_DEBUG2 00851 RioErr << "CFPool::WaitObject esperando por um objeto." << endl; 00852 #endif 00853 pthread_cond_wait( &m_WaitObject, &m_AccessFragmentQueue ); 00854 } 00855 // Libera o acesso exclusivo a fila FIFO. 00856 pthread_mutex_unlock( &m_AccessFragmentQueue ); 00857 00858 #ifdef RIO_DEBUG1 00859 RioErr << "[CFPool - WaitObject] Finish" << endl; 00860 #endif 00861 }
pthread_mutex_t CFPool::m_AccessFragmentQueue [private] |
Mutex para garantir o acesso exclusivo a fila FIFO.
Definition at line 391 of file StreamControl.h.
pthread_cond_t CFPool::m_WaitObject [private] |
Variavel de condicao usada pela thread que processa os clientes para esperar pelo evento indicando que a fila FIFO da classe, com objetos FragmentInfo, deixou de ficar vazia.
Definition at line 389 of file StreamControl.h.