/// <summary>
 /// Wait for writer to finish.
 /// </summary>
 /// <param name="me">caller's XState object</param>
 /// <param name="writer">prior writer's XState object</param>
 public void ResolveConflict(XState me, XState writer)
 {
     while (writer.State == XStates.ACTIVE)
     {
         writer.BlockWhileActiveAndNotWaiting();
     }
 }
예제 #2
0
 /// <summary>
 /// Either give the writer a chance to finish it, abort it, or both.
 /// </summary>
 /// <param name="me">caller's XState object</param>
 /// <param name="writer">prior writer's XState object</param>
 public void ResolveConflict(XState me, XState writer)
 {
     if (writer.priority > me.priority)
     {
         writer.BlockWhileActiveAndNotWaiting();                 // wait for same or higher priority
     }
     else
     {
         writer.Abort();                                         // abort lower priority
     }
 }
예제 #3
0
 /// <summary>
 /// If prior transaction is
 ///		active and higher priority, then wait.
 ///     active and lower priority, then abort it.
 ///		waiting and higher priority, then adopt its priority and abort it.
 ///     waiting and lower priority, then abort it.
 /// </summary>
 /// <param name="me">caller's XState object</param>
 /// <param name="writer">prior writer's XState object</param>
 public void ResolveConflict(XState me, XState writer)
 {
     if (writer.waiting || writer.priority < me.priority)
     {
         writer.Abort();
     }
     else
     {
         me.Waiting();                                           // announce that I'm waiting
         writer.BlockWhileActiveAndNotWaiting();                 // wait for prior transaction to become not ACTIVE
         me.NotWaiting();                                        // announce that I'm no longer waiting
     }
 }