CClientHeap Class Reference

Classe que implementa uma lista duplamente encadeada com os clientes para os quais desejamos enviar dados. More...

#include <StreamControl.h>

Public Member Functions

 CClientHeap (unsigned int MaxClientsCredits)
 CClientHeap construtor da classe, chamado quando um objeto e criado usando o comando new.
 ~CClientHeap ()
 ~CClientHeap 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 do cliente associado a este fragmento.
void GetFragments (TFragments &Fragments)
 GetFragments Retorna os fragmentos do cliente associado ao topo do heap, se o heap nao estiver vazio.

Private Member Functions

CClientInfoFindClient (int ip, int port)
 FindClient verifica se existe, no heap, o cliente identificado pela sua conexao com o servidor, composta por seu endereco IP e por sua porta.
CClientInfoCreateClient (int ip, int port, unsigned long long int TimeBetweenCredits)
 CreateClient insere no heap o cliente identificado pela sua conexao com o servidor, composta por seu endereco IP e por sua porta.
bool RemoveClient (CClientInfo *Client)
 CreateClient Funcao para remover do heap o cliente cujo ponteiro e passado como parametro.

Private Attributes

unsigned int m_MaxClientsCredits
 Variavel que armazena o numero de creditos dos clientes ao enviar fragmentos.
TClientsHeap m_ClientsHeap
 Heap usado para armazenar os clientes ativos no servidor.
TClientsMap m_ClientsMap
 Mapa usado para acelerar a busca por um cliente no heap (usado ao copiarmos os fragmentos do pool para a lista dos clientes).
CClientInfom_LastClient
 Ponteiro para o ultimo cliente achado pela funcao FindClient.
pthread_mutex_t m_AccessClients
 Mutex para garantir o acesso exclusivo ao mapa descrito anteriormente, e a variavel m_LastClient.
pthread_mutex_t m_AccessClientsHeap
 Mutex para garantir o acesso exclusivo ao heap descrito anteriormente.
pthread_cond_t m_WaitClients
 Variavel de condicao usada pela thread que processa os clientes para esperar pelo evento indicando que o heap m_AccessClientsHeap da classe deixou de ficar vazio, isto e, um cliente possui fragmentos para serem enviados.

Detailed Description

Classe que implementa uma lista duplamente encadeada com os clientes para os quais desejamos enviar dados.

Existira uma entrada para cada cliente ativo na lista. O objetivo da lista de um cliente e o de controlar o fluxo de saida para este cliente. Somente se o cliente possuir credito e que um dos objetos serao repassados a lista de controle de fluxo do servidor. Usada pela thread que gerencia os objetos FragmentInfo que devem ser enviados aos clientes.

Definition at line 567 of file StreamControl.h.


Constructor & Destructor Documentation

CClientHeap::CClientHeap ( unsigned int  MaxClientsCredits  ) 

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

Parameters:
MaxClientsCredits valor inteiro (nao sinalizado), definindo o numero maximo de creditos dos clientes associados ao heap.

Definition at line 1064 of file StreamControl.cpp.

01065 {
01066     #ifdef RIO_DEBUG1
01067     RioErr << "[CClientHeap - Construtor] Start" << endl;
01068     #endif
01069 
01070     // Inicializa as variaveis da classe
01071     // ClientsHeap: a fila de prioridades nao precisa ser inicializada.
01072     // ClientsMap: o mapa dos clientes nao precisa ser inicializado.
01073     m_MaxClientsCredits = MaxClientsCredits;
01074     // Inicializa a variavel m_LastClient.
01075     m_LastClient = NULL;
01076     // Cria o mutex usado para garantir o acesso exclusivo ao mapa e a 
01077     // variavel m_LastClient.
01078     pthread_mutex_init( &m_AccessClients, NULL );
01079     // Cria o mutex usado para garantir o acesso exclusivo ao heap.
01080     pthread_mutex_init( &m_AccessClientsHeap, NULL );
01081     // Cria a variavel de condicao da classe (usada para esperar por clientes).
01082     pthread_cond_init( &m_WaitClients, NULL );
01083 
01084     #ifdef RIO_DEBUG1
01085     RioErr << "[CClientHeap - Construtor] Finish" << endl;
01086     #endif
01087 }

CClientHeap::~CClientHeap (  ) 

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

Definition at line 1090 of file StreamControl.cpp.

01091 {
01092     #ifdef RIO_DEBUG1
01093     RioErr << "[CClientHeap - Destrutor] Start" << endl;
01094     #endif
01095 
01096     // Remove o mutex usado para garantir o acesso exclusivo ao mapa e a 
01097     // variavel m_LastClient.
01098     pthread_mutex_destroy( &m_AccessClients );
01099     // Remove o mutex da classe para o acesso ao heap.
01100     pthread_mutex_destroy( &m_AccessClientsHeap );
01101     // Cria a variavel de condicao da classe (usada para esperar por clientes).
01102     pthread_cond_destroy( &m_WaitClients );
01103 
01104     #ifdef RIO_DEBUG1
01105     RioErr << "[CClientHeap - Destrutor] Finish" << endl;
01106     #endif
01107 }


Member Function Documentation

CClientInfo * CClientHeap::CreateClient ( int  ip,
int  port,
unsigned long long int  TimeBetweenCredits 
) [private]

CreateClient insere no heap o cliente identificado pela sua conexao com o servidor, composta por seu endereco IP e por sua porta.

Um sinal para a variavel de condicao m_WaitClients sera gerado para desbloquear, se necessario, uma thread que pode ter sido bloqueada nesta variavel de condicao, ao executar a funcao GetFragments, caso o heap estivesse vazio quando a thread executou a funcao.

Parameters:
ip endereco IP do cliente a ser inserido no heap.
port porta do cliente a ser inserido no heap.
TimeBetweenCredits tempo em microsegundos entre duas atualizacoes do credito do cliente inserido no heap.
Returns:
ponteiro para o objeto da classe CClientInfo associado ao cliente que acabou de ser inserido no heap.

Definition at line 1173 of file StreamControl.cpp.

01175 {
01176     unsigned long long int ClientMapId;
01177     CClientInfo *Client;
01178 
01179     #ifdef RIO_DEBUG1
01180     RioErr << "[CClientHeap - CreateClient] Start" << endl;
01181     #endif
01182 
01183     #ifdef RIO_DEBUG2
01184     struct in_addr clientaddr;
01185     clientaddr.s_addr = ip;
01186     RioErr << "CClientList::CreateClient criando uma lista para o cliente com " 
01187            << "o IP " << inet_ntoa( clientaddr ) << " e a porta " 
01188            << ntohs( port ) << endl;
01189     #endif        
01190     // Tentamos criar uma lista para o cliente identificado por IP e port. 
01191     Client = new CClientInfo( m_MaxClientsCredits, TimeBetweenCredits, ip, 
01192                               port );
01193     if( Client == NULL )
01194     {
01195 
01196         #ifdef RIO_DEBUG1
01197         RioErr << "[CClientHeap - CreateClient] Finish1" << endl;
01198         #endif
01199 
01200         return NULL;
01201     }                          
01202     // Adiciona o cliente no heap.
01203     // Obtem acesso exclusivo ao heap.
01204     pthread_mutex_lock( &m_AccessClientsHeap );
01205     // Verifica se o heap esta vazio, pois neste caso, precisamos gerar um 
01206     // sinal para desbloquear a thread m_ClientsThread que processa os 
01207     // clientes do heap
01208     if( m_ClientsHeap.empty() )
01209         pthread_cond_signal( &m_WaitClients );
01210     m_ClientsHeap.push( Client );
01211     // Libera o acesso exclusivo ao heap.
01212     pthread_mutex_unlock( &m_AccessClientsHeap );
01213     // Determina o ID (com 64 bits) do cliente (os 32 bits superiores sao a
01214     // porta do cliente, e os 32 bits inferiores sao o IP do cliente).
01215     ClientMapId = ( unsigned int ) port;
01216     ClientMapId = ( ClientMapId << 32 ) | ( ( unsigned int ) ip );       
01217     // Devemos agora inserir o cliente no mapa.
01218     m_ClientsMap.insert( pair< unsigned long long int, CClientInfo * >
01219                          ( ClientMapId, Client ) );
01220     #ifdef RIO_DEBUG2
01221     RioErr << "CClientList::CreateClient inserindo no mapa o cliente com o IP " 
01222            << inet_ntoa( clientaddr ) << ", a porta " << ntohs( port ) 
01223            << ", e a ID " << ClientMapId << endl;
01224     #endif
01225 
01226     #ifdef RIO_DEBUG1
01227     RioErr << "[CClientHeap - CreateClient] Finish2" << endl;
01228     #endif
01229 
01230     return Client;
01231 }

CClientInfo * CClientHeap::FindClient ( int  ip,
int  port 
) [private]

FindClient verifica se existe, no heap, o cliente identificado pela sua conexao com o servidor, composta por seu endereco IP e por sua porta.

Parameters:
ip endereco IP do cliente a ser procurado no heap.
port porta do cliente a ser procurado no heap.
Returns:
ponteiro para o objeto da classe CClientInfo associado ao cliente caso este esteja no heap, ou NULL em caso contrario.

Definition at line 1113 of file StreamControl.cpp.

01114 {
01115     unsigned long long int ClientMapId;
01116     // Define um iterador para uma posicao qualquer do mapa, e um iterador para 
01117     // o final do mapa.   
01118     TClientsMap::iterator ClientIt, EndIt;
01119 
01120     #ifdef RIO_DEBUG1
01121     RioErr << "[CClientHeap - FindClient] Start" << endl;
01122     #endif
01123 
01124     #ifdef RIO_DEBUG2
01125     struct in_addr clientaddr;
01126     clientaddr.s_addr = ip;
01127     RioErr << "CClientList::FindClient procurando pelo cliente com o IP " 
01128            << inet_ntoa( clientaddr ) << " e a porta " 
01129            << ntohs( port ) << endl;
01130     #endif       
01131     // Determina o ID (com 64 bits) do cliente (os 32 bits superiores sao a
01132     // porta do cliente, e os 32 bits inferiores sao o IP do cliente).
01133     ClientMapId = ( unsigned int ) port;
01134     ClientMapId = ( ClientMapId << 32 ) | ( ( unsigned int ) ip );
01135     // Verifica se o cliente com a ID computada anteriormente esta no mapa.
01136     ClientIt = m_ClientsMap.find( ClientMapId );
01137     EndIt = m_ClientsMap.end();
01138     if( ClientIt != EndIt ) 
01139     {
01140         #ifdef RIO_DEBUG2
01141         RioErr << "CClientList::FindClient cliente com a ID " << ClientMapId
01142                << " achado no mapa." << endl;
01143         #endif
01144 
01145         #ifdef RIO_DEBUG1
01146         RioErr << "[CClientHeap - FindClient] Finish1" << endl;
01147         #endif
01148 
01149         // Se o cliente estiver no mapa, entao retornamos um ponteiro para uma 
01150         // estrutura CHeapElement com as informacoes do cliente (este ponteiro 
01151         // e dado por it->second. O valor id->first e igual ao valor de ID).
01152         return ClientIt->second;
01153     }    
01154     else
01155     {
01156         #ifdef RIO_DEBUG2
01157         RioErr << "CClientList::FindClient cliente com a ID " << ClientMapId
01158                << " nao achado no mapa." << endl;
01159         #endif       
01160 
01161         #ifdef RIO_DEBUG1
01162         RioErr << "[CClientHeap - FindClient] Finish2" << endl;
01163         #endif
01164 
01165         // Se o cliente nao estiver no mapa, entao retornamos NULL.
01166         return NULL;
01167     }
01168 }

void CClientHeap::GetFragments ( TFragments Fragments  ) 

GetFragments Retorna os fragmentos do cliente associado ao topo do heap, se o heap nao estiver vazio.

Este cliente sera aquele com o tempo de atualizacao dos creditos mais proximo do tempo atual. Apos remover o cliente do heap, os creditos do cliente serao atualizados apos esperarmos pelo tempo desta atualizacao (usando a funcao usleep), e apos isso, um numero de fragmentos nao maior do que o numero de creditos deste cliente (que pode ser menor do que este numero caso a fila do cliente possua menos fragmentos do que o numero de creditos) sera retornado pela funcao. Se nao existirem fragmentos a serem enviados para este cliente (o cliente pode estar inativo), o cliente sera novamente inserido no heap, na ordem do proximo tempo da sua atualizacao de credito, se o contador de inatividade nao for nulo. Se ele for nulo, o cliente nao sera inserido no heap, e seu objeto da classe CClientInfo sera removido. Agora, se o heap estiver vazio, a thread que executou a funcao sera bloqueada na variavel de condicao m_WaitClients ate que um cliente seja inserido no heap (por outra thread) a partir da funcao Insert.

Returns:
TFragments vetor de objetos do tipo FragmentInfo

Definition at line 1378 of file StreamControl.cpp.

01379 {
01380     unsigned long long int CurrentTime, UpdateTime;
01381     bool InsertClient;
01382     FragmentInfo *fip;
01383     CClientInfo *Client;
01384     struct timeval tvCurrentTime;
01385 
01386     #ifdef RIO_DEBUG1
01387     RioErr << "[CClientHeap - GetFragments] Start" << endl;
01388     #endif
01389 
01390     // Obtem a cabeca do heap.
01391     // Obtem acesso exclusivo ao heap.
01392     pthread_mutex_lock( &m_AccessClientsHeap );
01393     // Verifica se existem elementos no heap. Caso o heap esteja vazio, espera
01394     // pela chegada de novos clientes.
01395     if( m_ClientsHeap.empty() )
01396         pthread_cond_wait( &m_WaitClients, &m_AccessClientsHeap );
01397     // Agora que temos pelo menos um  cliente (pois o heap nao esta vazio), 
01398     // entao vamos processar o proximo cliente, que esta no topo do heap, 
01399     // associado ao evento que devera ser primeiramente executado.
01400     Client = m_ClientsHeap.top();
01401     // Remove a cabeca do heap.
01402     m_ClientsHeap.pop();
01403     // Libera o acesso exclusivo ao heap.
01404     pthread_mutex_unlock( &m_AccessClientsHeap );
01405     // Obtem o tempo de atualizacao do credito.
01406     UpdateTime = Client->NextTimeToUpdateCredits(); 
01407     // Determina o tempo atual.
01408     gettimeofday( &tvCurrentTime, NULL );
01409     // Converte o tempo atual (computado anteriormente) para microsegundos.
01410     CurrentTime = ( ( unsigned long long int ) tvCurrentTime.tv_sec ) 
01411                   * 1000000ull + 
01412                   ( ( unsigned long long int ) tvCurrentTime.tv_usec );
01413     // Verifica se precisamos dormir por alguns microsegundos. Isso ocorrera 
01414     // se o tempo de atualizacao x for maior do que o tempo atual a. Se o 
01415     // tempo de atualizacao x for maior, entao deverenis dormir por a - x 
01416     // microsegundos.
01417     if( UpdateTime > CurrentTime )
01418         usleep( UpdateTime - CurrentTime );
01419     // Agora, como ja passou o tempo de atualizacao do cliente (pelo menos, 
01420     // isso deveria ocorrer), atualizamos os creditos do cliente.
01421     Client->UpdateCredits();
01422     // Inicializa a variavel que diz se devemos ou nao inserir novamente o 
01423     // cliente no heap.
01424     InsertClient = true;
01425     // Verificamos se temos fragmentos para o cliente. Note que o cliente 
01426     // deveria possuir creditos, pois dormimos ate o tempo da proxima 
01427     // atualizacao do credito do cliente.
01428     Fragments.clear();
01429     while ( ( fip = Client->Remove() ) != NULL )
01430     {
01431         // Insere os fragmentos no vetor enquanto o cliente possuir creditos 
01432         // ou fragmentos para serem enviados.
01433         Fragments.insert( Fragments.end(), fip );
01434     }
01435     if( Fragments.size() > 0 ) 
01436     {
01437         #ifdef RIO_DEBUG2
01438         struct in_addr clientaddr;
01439         char StrAux[ 256 ];
01440         unsigned int f;
01441         for( f = 0; f < Fragments.size(); f++ ) 
01442         {
01443             clientaddr.s_addr = Fragments[ f ]->IP;
01444             sprintf( StrAux, 
01445                      "enviando fragmento %u para o cliente [IP=%s,Port=%u]", 
01446                      f+1, inet_ntoa( clientaddr ), 
01447                      ntohs( Fragments[ f ]->Port ) );          
01448             RioErr << "CClientHeap::GetNextFragment " << StrAux << endl;
01449         }
01450         #endif
01451     }    
01452     else
01453     {
01454        // O cliente esta inativo por muito tempo e precisa ser removido do
01455        // mapa. Como o cliente ja foi removido do heap, bastara remove-lo do 
01456        // mapa e deletar a estrutura Client. Isso sera feito pela funcao
01457        // RemoveClient da classe, que retornara true se o cliente pode ser
01458        // removido. O cliente nao podera ser removido se outra thread
01459        // estiver tentando inserir fragmentos na fila dele. Note que o valor
01460        // de InsertClient e a negacao do retorno da funcao porque somente
01461        // deveremos inserir o cliente no heap se ele nao pode ser removido.
01462        InsertClient = !RemoveClient( Client );  
01463     }
01464     // Obtem acesso exclusivo ao heap.
01465     pthread_mutex_lock( &m_AccessClientsHeap );
01466     // Se InsertClient for true, deveremos reinserir o cliente no heap.
01467     if( InsertClient ) 
01468         m_ClientsHeap.push( Client );
01469     // Libera o acesso exclusivo ao heap.
01470     pthread_mutex_unlock( &m_AccessClientsHeap );
01471 
01472     #ifdef RIO_DEBUG1
01473     RioErr << "[CClientHeap - GetFragments] Finish" << endl;
01474     #endif
01475 }

int CClientHeap::Insert ( FragmentInfo fip  ) 

Insert Insere um objeto FragmentInfo no final da fila do cliente associado a este fragmento.

Para descobrirmos o cliente, usanmos o endereco IP e a porta dado no objeto para descobrirmos no heap o cliente associado ao fragmento. Se este cliente estiver no heap, o objeto sera inserido no filal da fila associada ao cliente. Se o cliente nao estiver no heap, um novo objeto da classe CClientInfo sera criado para o cliente, o fragmento sera depois inserido no inicio da fila do cliente e, finalmente, o cliente sera inserido no heap.

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.

Definition at line 1294 of file StreamControl.cpp.

01295 {
01296     int result;
01297     CClientInfo *Client;
01298 
01299     #ifdef RIO_DEBUG1
01300     RioErr << "[CClientHeap - Insert] Start" << endl;
01301     #endif
01302 
01303     // Obtem acesso exclusivo ao mapa e a variavel m_LastClient.
01304     pthread_mutex_lock( &m_AccessClients );
01305     // Determina se precisamos buscar um novo cliente (isso sera visto pelo par 
01306     // IP, porta do cliente dado em m_LastClient. Se o valor de m_LastClient for 
01307     // NULL, e se o IP ou a porta forem diferentes do cliente refenreciado por
01308     // m_LastClient, faremos uma nova busca pelo cliente e, se nao acharmos este
01309     // cliente, criaremos uma nova lista para ele.
01310     if( ( m_LastClient == NULL ) || ( m_LastClient->GetIPAddress() != fip->IP ) ||
01311         ( m_LastClient->GetPort() != fip->Port ) )
01312     {
01313         // Tenta obter a lista do cliente. Se necessario, cria uma nova lista 
01314         // para o cliente. Tentaremos buscar o cliente ate conseguirmos obter 
01315         // um ponteiro.
01316         Client = FindClient( fip->IP, fip->Port );
01317         if( Client == NULL ) 
01318         {
01319             // Precisamos criar uma nova lista para o cliente, pois ele nao
01320             // foi achado no mapa dos clientes.
01321             Client = CreateClient( fip->IP, fip->Port, 
01322                                    fip->TimeBetweenCredits );
01323             if( Client == NULL )
01324             {
01325 
01326                 #ifdef RIO_DEBUG1
01327                 RioErr << "[CClientHeap - Insert] Finish1" << endl;
01328                 #endif
01329 
01330                 return ERROR_STREAMCONTROL + ERROR_MEMORY;
01331             }
01332         }
01333         m_LastClient = Client;
01334     } 
01335     else
01336         Client = m_LastClient; // Como o ultimo fragmento inserido foi o do
01337                                // cliente para o qual devemos enviar fip, 
01338                                // entao simplesmente usados o ponteiro ao
01339                                // inves de busca-lo no mapa. 
01340     // Libera o acesso exclusivo ao mapa e a variavel m_LastClient.
01341     pthread_mutex_unlock( &m_AccessClients );
01342     // Agora adicionamos o novo objeto FragmentInfo na fila FIFO de objetos 
01343     // do cliente referenciado por Client (ou seja, no final da fila).
01344     result = Client->Insert( fip );
01345     if( result == S_OK ) 
01346     {
01347         // Agora imprimimos a lista do cliente, com usando seu par IP, porta
01348         // para identifica-lo. 
01349         #ifdef RIO_DEBUG2
01350         struct in_addr clientaddr;
01351         clientaddr.s_addr = Client->GetIPAddress();
01352         char StrAux[ 256 ];
01353         sprintf( StrAux, "Insercao em CClientList [IP=%s,Port=%u]",
01354                  inet_ntoa( clientaddr ), ntohs( Client->GetPort() ) );                
01355         Client->PrintFragmentQueue( StrAux );
01356         #endif 
01357         
01358     }
01359 
01360     #ifdef RIO_DEBUG1
01361     RioErr << "[CClientHeap - Insert] Finish2" << endl;
01362     #endif
01363 
01364     return result;  
01365 }

bool CClientHeap::RemoveClient ( CClientInfo Client  )  [private]

CreateClient Funcao para remover do heap o cliente cujo ponteiro e passado como parametro.

A funcao retorna true se a remocao do cliente foi feita com sucesso, e false se ela nao foi feita com sucesso (isto e, se a thread que insere fragmentos nos clientes estiver inserindo um fragmento neste cliente).

Parameters:
Client Ponteiro para a estrutura do cliente a ser removido do heap.
Returns:
true se a remocao foi feita com sucesso e false, caso a remocao nao possa ser feita.

Definition at line 1237 of file StreamControl.cpp.

01238 {
01239     unsigned long long int ClientMapId;
01240     bool result;
01241 
01242     #ifdef RIO_DEBUG1
01243     RioErr << "[CClientHeap - RemoveClient] Start" << endl;
01244     #endif
01245 
01246     // Note que o cliente ja estara fora do heap (pois sempre removemos o 
01247     // cliente do heap e o recolocamos apos atualizar o tempo de atualizacao
01248     // entre os creditos).        
01249     // Obtem acesso exclusivo ao mapa e a variavel m_LastClient.
01250     pthread_mutex_lock( &m_AccessClients );
01251     if( ( Client->MustRemoveClient() ) && ( m_LastClient != Client ) )
01252     {
01253         #ifdef RIO_DEBUG2
01254         struct in_addr clientaddr;
01255         clientaddr.s_addr = Client->GetIPAddress();
01256         RioErr << "CClientList::RemoveClient removendo a lista do cliente com o "
01257                << "IP " << inet_ntoa( clientaddr ) << " e a porta " 
01258                << ntohs( Client->GetPort() ) << endl;
01259         #endif
01260         // Determina o ID (com 64 bits) do cliente (os 32 bits superiores sao a
01261         // porta do cliente, e os 32 bits inferiores sao o IP do cliente).
01262         ClientMapId = ( unsigned int ) Client->GetPort();
01263         ClientMapId = ( ClientMapId << 32 ) | 
01264                       ( ( unsigned int ) Client->GetIPAddress() );       
01265         // Remove o cliente do mapa.
01266         m_ClientsMap.erase( ClientMapId );
01267         // Corrige o ponteiro de  busca caso ele aponte para este cliente.
01268         if( m_LastClient == Client )
01269             m_LastClient = NULL;
01270         #ifdef RIO_DEBUG2
01271         RioErr << "CClientList::RemoveClient removendo do mapa o cliente com " 
01272                << "o IP " << inet_ntoa( clientaddr ) << ", a porta " 
01273                << ntohs( Client->GetPort() ) << ", e a ID " << ClientMapId  
01274                << endl;
01275         #endif
01276         // Deleta o objeto associado ao cliente.    
01277         delete Client;
01278         result = true;
01279     }
01280     else
01281         result = false;
01282     // Libera o acesso exclusivo ao mapa e a variavel m_LastClient.
01283     pthread_mutex_unlock( &m_AccessClients );
01284 
01285     #ifdef RIO_DEBUG1
01286     RioErr << "[CClientHeap - RemoveClient] Finish" << endl;
01287     #endif
01288 
01289     return result;
01290 }


Field Documentation

pthread_mutex_t CClientHeap::m_AccessClients [private]

Mutex para garantir o acesso exclusivo ao mapa descrito anteriormente, e a variavel m_LastClient.

Definition at line 596 of file StreamControl.h.

pthread_mutex_t CClientHeap::m_AccessClientsHeap [private]

Mutex para garantir o acesso exclusivo ao heap descrito anteriormente.

Definition at line 600 of file StreamControl.h.

Heap usado para armazenar os clientes ativos no servidor.

Ele e usado como uma lista de eventos, e e ordenado, em ordem crescente, pelo tempo de atualizacao dos creditos dos clientes.

Definition at line 578 of file StreamControl.h.

Mapa usado para acelerar a busca por um cliente no heap (usado ao copiarmos os fragmentos do pool para a lista dos clientes).

Cada entrada do mapa (com um identificador dado por um inteiro de bits cujos 32 bits superiores sao a porta do cliente e os 32 bits inferiores sao o IP do cliente) aponta para a entrada no heap de um cliente diferente.

Definition at line 586 of file StreamControl.h.

Ponteiro para o ultimo cliente achado pela funcao FindClient.

Usado pela funcao Insert para evitar a busca por clientes no mapa ClientsMap a cada vez que um fragmento e inserido via a funcao Insert dada a seguir.

Definition at line 592 of file StreamControl.h.

unsigned int CClientHeap::m_MaxClientsCredits [private]

Variavel que armazena o numero de creditos dos clientes ao enviar fragmentos.

Definition at line 573 of file StreamControl.h.

pthread_cond_t CClientHeap::m_WaitClients [private]

Variavel de condicao usada pela thread que processa os clientes para esperar pelo evento indicando que o heap m_AccessClientsHeap da classe deixou de ficar vazio, isto e, um cliente possui fragmentos para serem enviados.

Definition at line 606 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