/// <summary> /// Puede levantar AbortarEsperarMorirException debido al protocolo Esperar-Morir /// </summary> /// <param name="transaccion">Transaccion que solicita el bloqueo</param> /// <param name="condiciones">Condiciones por la que bloquear</param> /// <param name="tipoBloqueo">Tipo de bloqueo que solicita</param> /// <returns></returns> internal DescriptorBloqueo bloquear(Transaccion transaccion, Condicion condicion, TipoBloqueo tipoBloqueo) { lock (Entradas) { foreach (EntradaBloqueo entrada in Entradas) { if (entrada.igualCondicion(condicion)) { if (entrada.permiteBloqueo(condicion, tipoBloqueo)) { return(entrada.bloquear(transaccion, tipoBloqueo)); } entrada.encolarBloqueo(transaccion); //-> aqui puede leventar exception por protocolo esperar morir while ((entrada.Bloqueado && !entrada.permiteBloqueo(condicion, tipoBloqueo)) || !entrada.desencolarSiEsElSiguiente(transaccion)) { Monitor.Wait(entradas); } if (tipoBloqueo == TipoBloqueo.BLOQUEO_LECTURA) { Monitor.PulseAll(entradas);//porque no eran los primeros, se volvieron a bloquear } return(entrada.bloquear(transaccion, tipoBloqueo)); } } //no estaba la entrada EntradaBloqueo nuevaEntrada = new EntradaBloqueo(this, tipoBloqueo, condicion); Entradas.Add(nuevaEntrada); return(nuevaEntrada.bloquear(transaccion, tipoBloqueo)); } }
internal EntradaBloqueo(ControladorConcurrencia controladorConcurrencia, TipoBloqueo tipo, Condicion condicion) { this.controladorConcurrencia = controladorConcurrencia; this.tipo = tipo; this.condicion = condicion; }
internal Boolean permiteBloqueo(Condicion condicion, TipoBloqueo tipo) { if (igualCondicion(condicion) && Bloqueado) { //si alguno de los 2 es de escritura, no se puede if (this.Tipo == TipoBloqueo.BLOQUEO_ESCRITURA || tipo == TipoBloqueo.BLOQUEO_ESCRITURA) { return(false); } } //distina condicion, o ambos de lectura return(true); }
internal Boolean igualCondicion(Condicion condicion) { return(Condicion.igualOmayorCondicionQue(condicion)); }
/// <summary> /// Determina si esta condicion es compatible con la que viene como parametro. /// Por ahora, sin id /// </summary> /// <param name="condicion"></param> /// <returns></returns> internal abstract bool igualOmayorCondicionQue(Condicion condicion);