public static async Task <(int funcs, int links)> FixInvalidFunctionNamesAsync() { var syscallStats = new TSyscallStats(); int funcs = 0, links = 0; using (var db = new ThumbnailDb()) { var funcsToFix = new List <SyscallInfo>(0); try { funcsToFix = await db.SyscallInfo.Where(sci => sci.Function.Contains('(')).ToListAsync().ConfigureAwait(false); funcs = funcsToFix.Count; if (funcs == 0) { return(0, 0); } foreach (var sci in funcsToFix) { var productIds = await db.SyscallToProductMap.AsNoTracking().Where(m => m.SyscallInfoId == sci.Id).Select(m => m.Product.ProductCode).Distinct().ToListAsync().ConfigureAwait(false); links += productIds.Count; foreach (var productId in productIds) { if (!syscallStats.TryGetValue(productId, out var scInfo)) { syscallStats[productId] = scInfo = new Dictionary <string, HashSet <string> >(); } if (!scInfo.TryGetValue(sci.Module, out var smInfo)) { scInfo[sci.Module] = smInfo = new HashSet <string>(); } smInfo.Add(sci.Function.Split('(', 2)[0]); } } } catch (Exception e) { Config.Log.Warn(e, "Failed to build fixed syscall mappings"); throw e; } await SaveAsync(syscallStats).ConfigureAwait(false); if (await Limiter.WaitAsync(1000, Config.Cts.Token)) { try { db.SyscallInfo.RemoveRange(funcsToFix); await db.SaveChangesAsync().ConfigureAwait(false); } catch (Exception e) { Config.Log.Warn(e, "Failed to remove broken syscall mappings"); throw e; } finally { Limiter.Release(); } } } return(funcs, links); }