Interface: BlockBuffer Arquivos: blockbuffer.h Última atualização: 24/07/2002 Autor: Luiz Henrique Shigunov |
Descrição Estruturas |
Funções | |
0x00 - FreeUnit - Libera uma unidade dum dispositivo 0x01 - GetBlock - Obtém um bloco 0x02 - GetBlockSize - Obtém o tamanho do bloco lógico de uma unidade 0x03 - GetHardBlockSize - Obtém o tamanho do bloco físico de uma unidade |
0x04 - RegisterUnit - Registra uma unidade dum dispositivo 0x05 - Release - Libera um bloco 0x06 - SetBlockSize - Define o tamanho do bloco lógico de uma unidade |
Esta página descreve a interface BlockBuffer que trata do acesso aos dispositivos de blocos fazendo cache dos blocos para melhorar o desempenho da leitura e escrita.
A interface BlockBuffer fornece serviços de armazenamento de blocos de dispositivos. O grande objetivo é manter os blocos mais utilizados em memória e, com isso, minimizar o uso dos dispositivos.
Todo um gerenciamento é feito para maximizar o uso de memória disponível sem que isso interfira na disponibilidade de memória para outros módulos.
O modo de uso deve ser: obter um bloco para leitura/escrita, utilizar o bloco, liberar o bloco para que outros possam utilizá-lo. Cada bloco tem um sincronizador do tipo leitor/escritor, ou seja, muitas podem ler, mas apenas uma linha de execução pode escrever.
Todo dispositivo para ser registrado tem que implementar a interface BlockDev.
typedef struct { char *data; void *avail1; void *avail2; unsigned int flags; unsigned int blockN; } BlockBuffer_Block;
Onde data é um ponteiro para os dados do bloco. avail1 e avail2 são disponíveis para quem possui o bloco para leitura ou escrita. flags não é utilizado ainda. blockN é o número do bloco.
int BlockBuffer_FreeUnit(BlockBuffer_Unit *unit);
Esta função libera a unidade unit.
Uma unidade dum dispositivo só deve ser liberada quando nenhum bloco dela estiver sendo usado.
int BlockBuffer_GetBlock(BlockBuffer_Unit *unit, unsigned int blockN, int prop, BlockBuffer_Block **block);
Esta função obtém o bloco blockN da unidade unit e o coloca em block.
Várias linhas de execução podem ter o bloco para leitura num determinado momento, mas apenas uma pode ter para leitura num determinado momento.
prop deve ser 0 ou o somatório de:
int BlockBuffer_GetBlockSize(BlockBuffer_Unit *unit, unsigned int *size);
Esta função obtém o tamanho do bloco lógico em bytes da unidade unit e o coloca em size.
int BlockBuffer_GetHardBlockSize(BlockBuffer_Unit *unit, unsigned int *size);
Esta função obtém o tamanho do bloco físico em bytes da unidade unit e o coloca em size.
int BlockBuffer_RegisterUnit(const char *devImp, unsigned int unitN, BlockBuffer_Unit **unit);
Esta função registra a unidade unitN do dispositivo devImp, que tem que implementar a interface BlockDev.
Apenas um módulo pode usar uma mesma unidade por vez.
Em caso de sucesso, unit terá o identificador da unidade.
int BlockBuffer_Release(BlockBuffer_Unit *unit, BlockBuffer_Block *block);
Esta função libera o bloco block da unidade unit.
int BlockBuffer_SetBlockSize(BlockBuffer_Unit *unit, unsigned int size);
Esta função define o tamanho do bloco lógico da unidade unit para size, que deve ser 512, 1024, 2048 ou 4096 bytes.
Nenhum bloco da unidade pode estar em uso.