//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
using System;
using System.Threading;
namespace Microsoft.SqlTools.Utility
{
///
/// A wrapper around the ReaderWriterLock to make sure the locks are released even if the action fails
///
public class AutoLock
{
private readonly ReaderWriterLock _lock;
private readonly bool _isWriteLocked;
///
/// Creates new lock given type of lock and timeout
///
public AutoLock(ReaderWriterLock lockObj, bool isWriteLock, TimeSpan timeOut, Action action, out Exception exception)
{
exception = null;
try
{
_lock = lockObj;
_isWriteLocked = isWriteLock;
if (_isWriteLocked)
{
_lock.AcquireWriterLock(timeOut);
}
else
{
_lock.AcquireReaderLock(timeOut);
}
action();
}
catch (Exception ex)
{
exception = ex;
}
finally
{
if (_isWriteLocked && _lock.IsWriterLockHeld)
{
_lock.ReleaseWriterLock();
}
else if (!_isWriteLocked && _lock.IsReaderLockHeld)
{
_lock.ReleaseReaderLock();
}
}
}
}
}