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:
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. |