serviço do kernel common_reclock

Propósito

Implementa uma interface genérica para as funções de bloqueio de registro.

Sintaxe

#include <sys/types.h>
#include <sys/flock.h>
common_reclock( gp, size, offset, 
lckdat, cmd, retray_fcn, retry_id, lock_fcn, 
rele_fcn)
struct gnode *gp;
offset_t size;
offset_t offset;
struct eflock *lckdat;
int cmd;
int (*retry_fcn)();
ulong *retry_id;
int (*lock_fcn)();
int (*rele_fcn)();

Parâmetros

Item Descrição
Gp Aponta para o gnó que representa o arquivo para bloquear.
tamanho Identifica o tamanho atual do arquivo em bytes.
deslocamento Especifica o deslocamento de arquivo atual. O sistema utiliza o parâmetro deslocamento para estabelecer onde a região de bloqueio deve começar.
lckdat Aponta para uma estrutura eflock que descreve a operação de bloqueio para executar.
cmd Define o tipo de operação que o serviço kernel executa. Este parâmetro é uma máscara de bit que consiste nos bits a seguir:
SETFLCK
Se configurado, o sistema configura ou limpa uma trava. Se não for definido, as informações de bloqueio são retornadas.
SLPFLCK
Se o bloqueio não puder ser concedido imediatamente, espere por ele. Isso só é válido quando o flag SETFLCK estiver configurado.
INOFLCK
O ouvinte está segurando um bloqueio no objeto referido pelo gnó. O serviço kernel comum-rerelógio chama a função de liberação antes de dormir, e a função de bloqueio no retorno do sono.

Quando o parâmetro cmd é configurado como SLPFLCK, ele indica que se o bloqueio não puder ser concedido imediatamente, o serviço deverá esperar por ele. Se o parâmetro retry_fcn contém um ponteiro válido, o serviço kernel comum-rerelógio não dorme, independentemente da sinalização SLPFLCK .

retry_fcn Aponta para uma função de nova tentativa. Esta função é chamada quando o bloqueio é retentado. A função de nova tentativa não é usada se o bloqueio for concedido imediatamente. Quando o bloqueio solicitado é bloqueado por um bloqueio existente, um bloqueio de dormir é estabelecido com o endereço de função de nova tentativa armazenado nele. O serviço kernel comum-rerelógio então retorna um ID correlacionando (veja o parâmetro retry_id ) para a rotina de chamada, juntamente com um valor de saída de EAGAIN. Quando o bloqueio de dormir é despertado, a função de nova tentativa é chamada com o ID correlacionando como seu argumento ID.

Se esse argumento não for NULL, então o serviço kernel comum- rerelógio não dorme, independentemente da sinalização de comando SLPFLCK .

retry_id Pontos para localização para armazenar o ID correlacionar. Este ID é usado para correlacionar uma operação de nova tentativa com um bloqueio ou conjunto de bloqueios específicos. Este parâmetro é usado apenas em conjunto com função de nova tentativa. O valor armazenado neste local é um valor opaco. O ouvinte não deve utilizar este valor para qualquer finalidade diferente da correlação de bloqueio.
lock_fcn Aponta para uma função de bloqueio. Esta função é invocada pelo serviço de kernel comum- rerelógio para bloquear uma estrutura de dados utilizada pelo responsável pelo chamamento. Geralmente esta é a estrutura de dados contendo o gnode para bloquear. Essa função é necessária para serializar o acesso ao objeto a bloquear. Quando o serviço kernel comum-rerelógio invoca a função de bloqueio, ele é passado o ponteiro de dados privados do gnode como seu único argumento.
rele_fcn Aponta para uma função de liberação. Esta função libera o bloqueio adquirido com a função de bloqueio. Quando a função de liberação é invocada, ela é passada o ponteiro de dados privados do gnó como seu único argumento.

Descrição

A rotina comum-rerelógio implementa uma interface genérica para as funções de bloqueio de registro. Este serviço permite sistemas de arquivos distribuídos para usar bloqueio de faixa de bytes. O serviço kernel faz o seguinte quando um bloqueio solicitado é bloqueado por um bloqueio existente:

  • Estabelece um bloqueio de sono com a função de nova tentativa na estrutura trava . O endereço da função de nova tentativa é especificado pelo parâmetro retry_fcn .
  • Retorna um valor de ID correlacionando ao chamante juntamente com um valor de saída de EAGAIN. O ID é armazenado no parâmetro retry_id .
  • Chamada a função de nova tentativa quando o bloqueio de sono é posteriormente despertado, a função de nova tentativa é chamada com o parâmetro retry_id como seu argumento.
    Nota: Antes de uma chamada para a subroutine comum- rerelógio , a estrutura eflock deve ser completamente preenchida. O parâmetro lckdat aponta para a estrutura eflock .

O ouvinte pode realizar um bloqueio de serialização no objeto de dados apontado pelo gnode. No entanto, se o ouvinte espera dormir por um bloqueio de arquivo de bloqueio e está segurando o bloqueio do objeto, o responsável deve especificar uma função de bloqueio com o parâmetro lock_fcn e uma função de liberação com o parâmetro rele_fcn .

O bloqueio é descrito por uma estrutura eflock . Essa estrutura é identificada pelo parâmetro lckdat . Se um bloqueio de leitura (F_RDLCK) ou lock de gravação (F_WRLCK ) é configurado com um comprimento de 0, o arquivo inteiro está bloqueado. Da mesma forma, se desbloquear (F_UNLCK) for configurado iniciando em 0 por 0 comprimento, todos os bloqueios neste arquivo são desbloqueados. Este método é como os bloqueios são removidos quando um arquivo é fechado.

Para permitir que o serviço kernel comum-rerelógio atualize a lista de bloqueios por gnode, o serviço leva um bloqueio GN_RECLK_LOCK durante o processamento.

Ambiente de Execução

O serviço kernel comum-rerelógio pode ser chamado apenas do ambiente de processo.

Valores De Retorno

Item Descrição
0 Indica conclusão bem-sucedida.
EAGAIN Indica um bloqueio não pode ser concedido por causa de um bloqueio de bloqueio e o ouvinte não pediu que a operação durma.
Nº DE ERRO Indica um erro. Consulte a chamada de sistema fcntl para a lista de valores possíveis.