internal override void DecrementOutstandingNotifications(bool voteYes) { bool flag = false; IPhase0EnlistmentShim shim = null; lock (this) { if (DiagnosticTrace.Verbose) { string methodName = "OletxPhase0VolatileEnlistmentContainer.DecrementOutstandingNotifications, outstandingNotifications = " + this.outstandingNotifications.ToString(CultureInfo.CurrentCulture) + ", incompleteDependentClones = " + this.incompleteDependentClones.ToString(CultureInfo.CurrentCulture); MethodEnteredTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), methodName); } base.outstandingNotifications--; base.collectedVoteYes = base.collectedVoteYes && voteYes; if ((base.outstandingNotifications == 0) && (base.incompleteDependentClones == 0)) { if ((base.phase == 0) && !base.alreadyVoted) { flag = true; base.alreadyVoted = true; shim = this.phase0EnlistmentShim; } base.realOletxTransaction.DecrementUndecidedEnlistments(); } } try { if (flag && (shim != null)) { shim.Phase0Done(base.collectedVoteYes && !base.realOletxTransaction.Doomed); } } catch (COMException exception) { if ((System.Transactions.Oletx.NativeMethods.XACT_E_CONNECTION_DOWN == exception.ErrorCode) || (System.Transactions.Oletx.NativeMethods.XACT_E_TMNOTAVAILABLE == exception.ErrorCode)) { if (DiagnosticTrace.Verbose) { ExceptionConsumedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), exception); } } else { if (System.Transactions.Oletx.NativeMethods.XACT_E_PROTOCOL != exception.ErrorCode) { throw; } this.phase0EnlistmentShim = null; if (DiagnosticTrace.Verbose) { ExceptionConsumedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), exception); } } } if (DiagnosticTrace.Verbose) { string str = "OletxPhase0VolatileEnlistmentContainer.DecrementOutstandingNotifications"; MethodExitedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), str); } }
public void ForceRollback(Exception e) { IPhase0EnlistmentShim shim = null; IEnlistmentShim enlistmentShim = null; if (DiagnosticTrace.Verbose) { MethodEnteredTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxPreparingEnlistment.ForceRollback"); } if (DiagnosticTrace.Warning) { EnlistmentCallbackNegativeTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), base.InternalTraceIdentifier, EnlistmentCallback.ForceRollback); } lock (this) { if (OletxEnlistmentState.Preparing == this.state) { enlistmentShim = this.EnlistmentShim; } else { if (OletxEnlistmentState.Phase0Preparing != this.state) { throw TransactionException.CreateEnlistmentStateException(System.Transactions.SR.GetString("TraceSourceOletx"), null); } shim = this.Phase0EnlistmentShim; if (shim != null) { base.oletxTransaction.realOletxTransaction.DecrementUndecidedEnlistments(); } } this.state = OletxEnlistmentState.Aborted; } Interlocked.CompareExchange <Exception>(ref base.oletxTransaction.realOletxTransaction.innerException, e, null); try { if (enlistmentShim != null) { try { enlistmentShim.PrepareRequestDone(OletxPrepareVoteType.Failed); } finally { HandleTable.FreeHandle(this.phase1Handle); } } if (shim != null) { shim.Phase0Done(false); } } catch (COMException exception) { if ((System.Transactions.Oletx.NativeMethods.XACT_E_CONNECTION_DOWN != exception.ErrorCode) && (System.Transactions.Oletx.NativeMethods.XACT_E_TMNOTAVAILABLE != exception.ErrorCode)) { throw; } if (DiagnosticTrace.Verbose) { ExceptionConsumedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), exception); } } finally { this.FinishEnlistment(); } if (DiagnosticTrace.Verbose) { MethodExitedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxPreparingEnlistment.ForceRollback"); } }
public void Prepared() { int num1 = System.Transactions.Oletx.NativeMethods.S_OK; IEnlistmentShim enlistmentShim = null; IPhase0EnlistmentShim shim = null; bool fabricateRollback = false; if (DiagnosticTrace.Verbose) { MethodEnteredTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxPreparingEnlistment.Prepared"); EnlistmentCallbackPositiveTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), base.InternalTraceIdentifier, EnlistmentCallback.Prepared); } lock (this) { if (OletxEnlistmentState.Preparing == this.state) { enlistmentShim = this.EnlistmentShim; } else { if (OletxEnlistmentState.Phase0Preparing != this.state) { throw TransactionException.CreateEnlistmentStateException(System.Transactions.SR.GetString("TraceSourceOletx"), null); } shim = this.Phase0EnlistmentShim; if (base.oletxTransaction.realOletxTransaction.Doomed || this.fabricateRollback) { this.fabricateRollback = true; fabricateRollback = this.fabricateRollback; } } this.state = OletxEnlistmentState.Prepared; } try { if (enlistmentShim != null) { enlistmentShim.PrepareRequestDone(OletxPrepareVoteType.Prepared); } else if (shim != null) { base.oletxTransaction.realOletxTransaction.DecrementUndecidedEnlistments(); shim.Phase0Done(!fabricateRollback); } else { fabricateRollback = true; } if (fabricateRollback) { this.AbortRequest(); } } catch (COMException exception) { if ((System.Transactions.Oletx.NativeMethods.XACT_E_CONNECTION_DOWN == exception.ErrorCode) || (System.Transactions.Oletx.NativeMethods.XACT_E_TMNOTAVAILABLE == exception.ErrorCode)) { if (DiagnosticTrace.Verbose) { ExceptionConsumedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), exception); } } else { if (System.Transactions.Oletx.NativeMethods.XACT_E_PROTOCOL != exception.ErrorCode) { throw; } this.Phase0EnlistmentShim = null; if (DiagnosticTrace.Verbose) { ExceptionConsumedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), exception); } } } if (DiagnosticTrace.Verbose) { MethodExitedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxPreparingEnlistment.Prepared"); } }
public void EnlistmentDone() { bool flag; if (DiagnosticTrace.Verbose) { MethodEnteredTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxEnlistment.EnlistmentDone"); EnlistmentCallbackPositiveTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), base.InternalTraceIdentifier, EnlistmentCallback.Done); } IEnlistmentShim enlistmentShim = null; IPhase0EnlistmentShim shim2 = null; OletxEnlistmentState active = OletxEnlistmentState.Active; bool fabricateRollback = false; lock (this) { active = this.state; if (this.state == OletxEnlistmentState.Active) { shim2 = this.Phase0EnlistmentShim; if (shim2 != null) { base.oletxTransaction.realOletxTransaction.DecrementUndecidedEnlistments(); } flag = false; } else if (OletxEnlistmentState.Preparing == this.state) { enlistmentShim = this.EnlistmentShim; flag = true; } else if (OletxEnlistmentState.Phase0Preparing == this.state) { shim2 = this.Phase0EnlistmentShim; base.oletxTransaction.realOletxTransaction.DecrementUndecidedEnlistments(); if (this.fabricateRollback) { flag = true; } else { flag = false; } } else { if (((OletxEnlistmentState.Committing != this.state) && (OletxEnlistmentState.Aborting != this.state)) && (OletxEnlistmentState.SinglePhaseCommitting != this.state)) { throw TransactionException.CreateEnlistmentStateException(System.Transactions.SR.GetString("TraceSourceOletx"), null); } enlistmentShim = this.EnlistmentShim; flag = true; } fabricateRollback = this.fabricateRollback; this.state = OletxEnlistmentState.Done; } try { if (enlistmentShim != null) { if (OletxEnlistmentState.Preparing == active) { try { enlistmentShim.PrepareRequestDone(OletxPrepareVoteType.ReadOnly); goto Label_01C1; } finally { HandleTable.FreeHandle(this.phase1Handle); } } if (OletxEnlistmentState.Committing != active) { if (OletxEnlistmentState.Aborting != active) { if (OletxEnlistmentState.SinglePhaseCommitting != active) { throw TransactionException.CreateEnlistmentStateException(System.Transactions.SR.GetString("TraceSourceOletx"), null); } enlistmentShim.PrepareRequestDone(OletxPrepareVoteType.SinglePhase); } else if (!fabricateRollback) { enlistmentShim.AbortRequestDone(); } } else { enlistmentShim.CommitRequestDone(); } } else if (shim2 != null) { if (active != OletxEnlistmentState.Active) { if (OletxEnlistmentState.Phase0Preparing != active) { throw TransactionException.CreateEnlistmentStateException(System.Transactions.SR.GetString("TraceSourceOletx"), null); } shim2.Phase0Done(true); } else { shim2.Unenlist(); } } } catch (COMException exception) { flag = true; if (DiagnosticTrace.Verbose) { ExceptionConsumedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), exception); } } finally { if (flag) { this.FinishEnlistment(); } } Label_01C1: if (DiagnosticTrace.Verbose) { MethodExitedTraceRecord.Trace(System.Transactions.SR.GetString("TraceSourceOletx"), "OletxEnlistment.EnlistmentDone"); } }