// Copyright Keysight Technologies 2012-2019 // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, you can obtain one at http://mozilla.org/MPL/2.0/. using System.Collections.Concurrent; using System.Threading; namespace OpenTap.Plugins.BasicSteps { [Display("Lock", Group: "Á÷³Ì¿ØÖÆ", Description: "»¥³âËø",Order:1)] [AllowAnyChild] public class LockStep : TestStep { public LockStep() { LockName = "TAP_Mutex1"; SystemWide = false; Rules.Add(() => LockName.Contains("\\") == false, "Lock Name does not support '\\'", "LockName"); } [Display("Ãû³Æ", Description: "The name identifying the lock, used for sharing.")] public string LockName { get; set; } [Display("ϵͳ¼¶", Description: "Use a system-wide named mutex, that can be shared across processes.")] public bool SystemWide { get; set; } static ConcurrentDictionary localMutexes = new ConcurrentDictionary(); Mutex getMutex(string name, bool systemwide) { if (systemwide) return new Mutex(false, name); return localMutexes.GetOrAdd(name, s => new Mutex()); } protected override void RunDetail() { Mutex mutex = getMutex(LockName, SystemWide); mutex.WaitOne(); try { RunChildSteps(); } finally { mutex.ReleaseMutex(); } } } }