static void Main(string[] args) { Logger.verbosity = Verbosity.Verbose; FLockUtil.Init(() => "/Users/harveyjin/Work/nssclient/Tools/BuildTools/ThirdParty/flock"); Console.WriteLine($"main process {Process.GetCurrentProcess().Id}"); // 使用flock给文件加锁 var flock = FLockUtil.NewFLock("lock"); bool success = false; if (args[0] == "s") { Console.WriteLine($"flock share"); flock.AcquireShareLock(); } else { Console.WriteLine($"flock exclusive"); flock.AcquireExclusiveLock(); } Console.WriteLine(success ? "success" : "failed"); while (true) { System.Threading.Thread.Sleep(1000); } }
public static void AcquireUnity(string unityPoolDir, string unitySvnUrl, string unitySvnRev, out string unityExePath, out IFLock unityLock) { if (DoodleEnv.curPlatform != Platform.OSX) { throw new NssIntegrationException($"'{nameof(AcquireUnity)}'只能在OS X系统使用!"); } if (!Directory.Exists(unityPoolDir)) { throw new NotDirException(unityPoolDir, nameof(unityPoolDir)); } unityExePath = null; unityLock = null; // 遍历目录下所有Unity,返回可以得到写锁的那个 string unityAppPath = null; var rootDir = new DirectoryInfo(unityPoolDir); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); IFLock flock = null; RepeateDo repeateDo = new RepeateDo(600); repeateDo.Do(() => { foreach (var dir in rootDir.GetDirectories("*.app")) { flock = FLockUtil.NewFLock(Path.Combine(unityPoolDir, dir.Name, "lock")); if (!flock.TryAcquireExclusiveLock()) { continue; } unityAppPath = Path.Combine(unityPoolDir, dir.Name, "Contents/MacOS/Unity"); break; } if (unityAppPath == null) { Logger.Log($"没有可用的Unity引擎,已等待{stopwatch.ElapsedMilliseconds / 1000 / 60}分钟..."); Thread.Sleep(60 * 1000); return(false); } return(true); }); repeateDo = new RepeateDo(5); repeateDo.IgnoreException <ExecutableException>(); repeateDo.Do(() => SvnUtil.Sync(unityAppPath, unitySvnUrl, unitySvnRev)); if (!flock.TryAcquireShareLock()) { throw new ImpossibleException($"之前已经获取了写锁了,获取读锁不可能失败!"); } // 赋执行权限 CmdUtil.Execute($"chmod -R +x {unityAppPath}"); unityExePath = Path.Combine(unityAppPath, "Contents/MacOS/Unity"); unityLock = flock; return; }