Dados gerais

Interface: BlockBuffer
Arquivos: blockbuffer.h
Última atualização: 24/07/2002
Autor: Luiz Henrique Shigunov
Informações

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

Descrição

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.

Estruturas

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.

0x00 - FreeUnit

Sintaxe

int BlockBuffer_FreeUnit(BlockBuffer_Unit *unit);

Propriedades

Descrição

Esta função libera a unidade unit.

Uma unidade dum dispositivo só deve ser liberada quando nenhum bloco dela estiver sendo usado.

Valor de retorno

0x01 - GetBlock

Sintaxe

int BlockBuffer_GetBlock(BlockBuffer_Unit *unit, unsigned int blockN, int prop, BlockBuffer_Block **block);

Propriedades

Descrição

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:

Valor de retorno

0x02 - GetBlockSize

Sintaxe

int BlockBuffer_GetBlockSize(BlockBuffer_Unit *unit, unsigned int *size);

Propriedades

Descrição

Esta função obtém o tamanho do bloco lógico em bytes da unidade unit e o coloca em size.

Valor de retorno

0x03 - GetHardBlockSize

Sintaxe

int BlockBuffer_GetHardBlockSize(BlockBuffer_Unit *unit, unsigned int *size);

Propriedades

Descrição

Esta função obtém o tamanho do bloco físico em bytes da unidade unit e o coloca em size.

Valor de retorno

0x04 - RegisterUnit

Sintaxe

int BlockBuffer_RegisterUnit(const char *devImp, unsigned int unitN, BlockBuffer_Unit **unit);

Propriedades

Descrição

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.

Valor de retorno

0x05 - Release

Sintaxe

int BlockBuffer_Release(BlockBuffer_Unit *unit, BlockBuffer_Block *block);

Propriedades

Descrição

Esta função libera o bloco block da unidade unit.

Valor de retorno

0x06 - SetBlockSize

Sintaxe

int BlockBuffer_SetBlockSize(BlockBuffer_Unit *unit, unsigned int size);

Propriedades

Descrição

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.

Valor de retorno