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(); } } }
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); }