CompilerData CreateExecutable(InputData input) { CompilerData cdata = new CompilerData(); string ext = ""; string rand = Utils.RandomString(); cdata.Rand = rand; string dir = rand + @"\"; switch (input.Lang) { case Languages.VCPP: ext = ".cpp"; break; case Languages.VC: ext = ".c"; break; default: ext = ".unknown"; break; } string PathToSource = RootPath + dir + rand + ext; input.PathToSource = PathToSource; input.BaseDir = RootPath + dir; input.Rand = rand; Directory.CreateDirectory(RootPath + dir); Directory.SetCurrentDirectory(RootPath + dir); //DirectorySecurity sec = Directory.GetAccessControl(RootPath + dir); //SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null); //sec.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.Modify | FileSystemRights.Synchronize, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow)); //Directory.SetAccessControl(RootPath + dir, sec); using (TextWriter sw = new StreamWriter(PathToSource)) { sw.Write(input.Program); } cdata.CleanThis = RootPath + dir; var comp = ICompilerFactory.GetICompiler(input.Lang); if (comp != null) { return(comp.Compile(input, cdata)); } cdata.Success = false; return(cdata); }
OutputData RunSql(InputData idata) { OutputData odata = new OutputData(); string path = BasePath + @"usercode\" + Utils.RandomString() + ".sql"; using (TextWriter tw = new StreamWriter(path)) { tw.Write(idata.Program); } using (Process process = new Process()) { try { double TotalMemoryInBytes = 0; double TotalThreadCount = 0; int samplesCount = 0; process.StartInfo.FileName = BasePath + @"executables\SqlSandbox.exe"; process.StartInfo.Arguments = path.Replace(" ", "|_|"); process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; DateTime start = DateTime.Now; process.Start(); OutputReader output = new OutputReader(process.StandardOutput); Thread outputReader = new Thread(new ThreadStart(output.ReadOutput)); outputReader.Start(); OutputReader error = new OutputReader(process.StandardError); Thread errorReader = new Thread(new ThreadStart(error.ReadOutput)); errorReader.Start(); do { // Refresh the current process property values. process.Refresh(); if (!process.HasExited) { try { var proc = process.TotalProcessorTime; // Update the values for the overall peak memory statistics. var mem1 = process.PagedMemorySize64; var mem2 = process.PrivateMemorySize64; //update stats TotalMemoryInBytes += (mem1 + mem2); TotalThreadCount += (process.Threads.Count); samplesCount++; if (proc.TotalSeconds > 5 || mem1 + mem2 > 100000000 || process.Threads.Count > 100 || start + TimeSpan.FromSeconds(15) < DateTime.Now) { var time = proc.TotalSeconds; var mem = mem1 + mem2; process.Kill(); var res = string.Format("Process killed because it exceeded given resources.\nCpu time used {0} sec, absolute running time {1} sec, memory used {2} Mb, nr of threads {3}", time, (int)(DateTime.Now - start).TotalSeconds, (int)(mem / 1048576), process.Threads.Count); odata.Errors = odata.Errors + "\n" + res; string partialResult = output.Builder.ToString(); odata.Output = partialResult; //odata.Stats = string.Format("Absolute service time: {0} sec", Math.Round((double)(DateTime.Now - start).TotalMilliseconds / 1000, 2)); //Utils.Log.LogCodeToDB(data.Program, data.Input, data.CompilerArgs, res, (int)data.LanguageChoice, data.IsApi); return(odata); } } catch (InvalidOperationException) { break; } } }while (!process.WaitForExit(10)); process.WaitForExit(); errorReader.Join(5000); outputReader.Join(5000); if (!string.IsNullOrEmpty(error.Output)) { odata.Output = output.Builder.ToString(); odata.Errors += "\n" + error.Output; odata.Stats = string.Format("Absolute service time: {0} sec", Math.Round((double)(DateTime.Now - start).TotalMilliseconds / 1000, 2)); //Utils.Log.LogCodeToDB(data.Program, data.Input, data.CompilerArgs, error.Output, (int)data.LanguageChoice, data.IsApi); return(odata); } if (File.Exists(path + ".stats")) { using (TextReader tr = new StreamReader(path + ".stats")) { odata.Stats = tr.ReadLine(); if (!string.IsNullOrEmpty(odata.Stats)) { odata.Stats += ", "; } else { odata.Stats = ""; } odata.Stats += string.Format("absolute service time: {0} sec", Math.Round((double)(DateTime.Now - start).TotalMilliseconds / 1000, 2)); } } //else //{ // odata.Stats = string.Format("Absolute service time: {0} sec", Math.Round((double)(DateTime.Now - start).TotalMilliseconds / 1000, 2)); //} odata.Output = output.Output; // Utils.Log.LogCodeToDB(data.Program, data.Input, data.CompilerArgs, "OK", (int)data.LanguageChoice, data.IsApi); return(odata); } catch (Exception e) { if (!process.HasExited) { //reExp.Utils.Log.LogInfo("Process left running " + e.Message, "RunSqlServer"); } throw; } finally { try { File.Delete(path); } catch (Exception) { } //SqlServerUtils job = new SqlServerUtils(); //Thread t = new Thread(job.DoShrinkJob); //t.Start(); } } }