예제 #1
0
 public static void AssertLockIsHeldByMe(Guid dbId)
 {
     lock (AmDatabaseOperationLock.s_lockTable)
     {
         AmDatabaseOperationLock amDatabaseOperationLock = null;
         if (AmDatabaseOperationLock.s_lockTable.TryGetValue(dbId, out amDatabaseOperationLock) && amDatabaseOperationLock != null)
         {
             AmDatabaseOperationLock.GetThreadId();
         }
     }
 }
예제 #2
0
        public static AmDatabaseOperationLock Lock(Guid dbId, AmDbLockReason reason, TimeSpan?timeout)
        {
            AmDatabaseOperationLock amDatabaseOperationLock  = null;
            AmDatabaseOperationLock amDatabaseOperationLock2 = new AmDatabaseOperationLock();

            amDatabaseOperationLock2.m_reason   = reason;
            amDatabaseOperationLock2.m_dbId     = dbId;
            amDatabaseOperationLock2.m_threadId = AmDatabaseOperationLock.GetThreadId();
            lock (AmDatabaseOperationLock.s_lockTable)
            {
                if (AmDatabaseOperationLock.s_lockTable.TryGetValue(dbId, out amDatabaseOperationLock) && amDatabaseOperationLock != null)
                {
                    AmTrace.Error("AmDatabaseOperationLock: conflict on db {0}. Requesting for {1} but held by {2} for {3}", new object[]
                    {
                        dbId,
                        reason,
                        amDatabaseOperationLock.ThreadId,
                        amDatabaseOperationLock.Reason
                    });
                    if (timeout == null || timeout.Value.Ticks == 0L || amDatabaseOperationLock.m_waiter != null)
                    {
                        throw new AmDbLockConflictException(dbId, reason.ToString(), amDatabaseOperationLock.Reason.ToString());
                    }
                    amDatabaseOperationLock2.m_waiterEvent     = new ManualResetEvent(false);
                    amDatabaseOperationLock2.m_mustWaitForLock = true;
                    amDatabaseOperationLock.m_waiter           = amDatabaseOperationLock2;
                }
                else
                {
                    AmDatabaseOperationLock.s_lockTable[dbId] = amDatabaseOperationLock2;
                    amDatabaseOperationLock2.m_holdingLock    = true;
                }
            }
            if (amDatabaseOperationLock2.m_mustWaitForLock)
            {
                amDatabaseOperationLock2.WaitForLock(timeout.Value, amDatabaseOperationLock);
            }
            AmTrace.Debug("AmDatabaseOperationLock({0},{1}) : lock obtained", new object[]
            {
                dbId,
                reason
            });
            return(amDatabaseOperationLock2);
        }