Conexiones y bloqueo de estructura de archivos
Con fines de bloqueo, se usan dos niveles de tablas de búsqueda:
Tabla de objetos por dispositivo para estructuras de SRV_CALL y NET_ROOT (tabla de prefijo)
Estructura de tabla por NET_ROOT para estructuras FCB (tabla FCB)
Estas tablas independientes permiten que las operaciones de directorio en diferentes estructuras de NET_ROOT no interfieran casi completamente una vez establecidas las conexiones. Sin embargo, las operaciones de directorio en la misma estructura de NET_ROOT interfieren ligeramente. En la tabla siguiente se describe qué bloqueos son necesarios para operaciones específicas:
Operación | Tipos de datos | Se requiere bloqueo |
---|---|---|
Crear o finalizar |
SRV_CALL NET_ROOT V_NET_ROOT | Bloqueo exclusivo en la tabla NetName (el campo TableLock de RxContext-RxDeviceObject-pRxNetNameTable>>). |
Referencia, desreferencia o búsqueda |
SRV_CALL NET_ROOT V_NET_ROOT | Bloqueo compartido o exclusivo en la tabla NetName (el campo TableLock de RxContext-RxDeviceObject-pRxNetNameTable>>). |
Crear o finalizar |
FCB SRV_OPEN FOBX | Bloqueo exclusivo en la tabla FCB (el campo TableLock de NET_ROOT-FcbTable>). |
Referencia, desreferencia o búsqueda |
FCB SRV_OPEN FOBX | Bloqueo compartido o exclusivo en la tabla FCB (el campo TableLock de NET_ROOT-FcbTable>). |
Tenga en cuenta que actualmente las manipulaciones de SRV_OPEN y estructuras de datos FOBX requieren el mismo bloqueo que para las manipulaciones de estructuras de datos FCB. Esto es simplemente una idea de ahorro de memoria. Las versiones futuras de Windows pueden agregar otro recurso en el nivel de FCB para quitar esta restricción para que se pueda usar un conjunto de recursos compartidos para reducir la probabilidad de una colisión a un nivel aceptablemente bajo.
Si necesita ambos bloqueos (FinalizeNetFcb, por ejemplo), primero debe tomar el bloqueo en la tabla NetName y, a continuación, el bloqueo de la tabla FCB. Debe liberar los bloqueos en el orden opuesto.
El proceso de creación y finalización de SRV_CALL, NET_ROOT y V_NET_ROOT se rige por la adquisición y liberación del bloqueo RDBSS en la tabla NetName.
El proceso de creación y finalización de FCB se rige por la adquisición y liberación del bloqueo en la tabla NetName asociada a la estructura de NET_ROOT.
El proceso de creación y finalización de FOBX y SRVOPEN se rige por la adquisición y liberación del bloqueo en la tabla FCB.
En la tabla siguiente se resumen los bloqueos y los modos en los que se deben adquirir los bloqueos para la creación y finalización de las distintas estructuras de datos:
Tipo de operación | SRV_CALL | NET_ROOT | FCB | SRV_OPEN | FOBX |
---|---|---|---|---|---|
Crear |
Bloqueo exclusivo en la tabla NetName |
Bloqueo exclusivo en la tabla NetName |
Bloqueo exclusivo en la tabla FCB |
Bloqueo exclusivo en la tabla FCB |
Bloqueo exclusivo en la tabla FCB |
Finalización |
Bloqueo exclusivo en la tabla NetName |
Bloqueo exclusivo en la tabla NetName |
Bloqueo exclusivo en la tabla FCB |
Bloqueo exclusivo en la tabla FCB |
Bloqueo exclusivo en la tabla FCB |
Hacer referencia y desreferenciar estas estructuras de datos también deben cumplir ciertas convenciones.
Cuando el recuento de referencias asociado a cualquiera de las estructuras de datos cae a 1 (la única referencia que mantiene la tabla de nombres en la mayoría de los casos), la estructura de datos es un posible candidato para la finalización. La estructura de datos se puede finalizar inmediatamente o se puede marcar para el scavenging. Ambos métodos se implementan en RDBSS. Cuando se cumplen los requisitos de bloqueo durante la desreferenciación, las estructuras de datos se finalizan inmediatamente. La única excepción a esto es cuando se implementa la optimización de la operación retrasada (desreferenciando la estructura FCB, por ejemplo). De lo contrario, la estructura de datos se marca para el scavenging.
Un minidirector de red debe tener un bloqueo exclusivo en la tabla NetName para llamar a una rutina de finalización.
Para ejecutar una instancia de Create en una de estas estructuras de datos, un controlador minidirector de red debe hacer algo similar al siguiente:
getshared();lookup();
if (failed) {
release(); getexclusive(); lookup();
if ((failed) { create(); }
}
deref();
release();
Cuando haya adquirido correctamente el bloqueo, inserte el nodo en la tabla, libere el bloqueo y, a continuación, compruebe si el servidor está disponible. Si el servidor está disponible, configure el resto de la información y desbloquee a cualquier persona que esté esperando en el mismo servidor (las estructuras SRV_CALL o NET_ROOT).