aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorAlan M Webb2009-09-21 08:42:01 -0400
committerdr scofield (aka dirk husemann)2009-09-23 14:49:34 +0200
commitb7265abfaeb256ebc8421ee1d647dd68f08ff77a (patch)
tree203454dbad34c0c65bdc04b40f4a2451ba2e244b
parent* Makes SimulatorEnable messages 'reliable' and subject to redelivery. (diff)
downloadopensim-SC-b7265abfaeb256ebc8421ee1d647dd68f08ff77a.zip
opensim-SC-b7265abfaeb256ebc8421ee1d647dd68f08ff77a.tar.gz
opensim-SC-b7265abfaeb256ebc8421ee1d647dd68f08ff77a.tar.bz2
opensim-SC-b7265abfaeb256ebc8421ee1d647dd68f08ff77a.tar.xz
Added delay loop to give a newly created assembly time to appear. On
Linux (as an example), it is possible for the existence check to fail because the file is not yet recognized by the file system. Although the loop has a 250mS delay, in practise, the existence test in the for loop is successful and no delay is introduced. Next, this takes care of the two, unpredictable, situations where a script fails to compile. The first is caused by an occasional SEGV in the underlying mono VM while mcs is running, the second is caused by file system latency. Signed-off-by: dr scofield (aka dirk husemann) <drscofield@xyzzyxyzzy.net>
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs103
1 files changed, 71 insertions, 32 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
index cb5664b..5a94957 100644
--- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
@@ -542,11 +542,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
542 break; 542 break;
543 case enumCompileType.cs: 543 case enumCompileType.cs:
544 case enumCompileType.lsl: 544 case enumCompileType.lsl:
545 lock (CScodeProvider) 545 bool complete = false;
546 bool retried = false;
547 do
546 { 548 {
547 results = CScodeProvider.CompileAssemblyFromSource( 549 lock (CScodeProvider)
548 parameters, Script); 550 {
551 results = CScodeProvider.CompileAssemblyFromSource(
552 parameters, Script);
553 }
554 // Deal with an occasional segv in the compiler.
555 // Rarely, if ever, occurs twice in succession.
556 // Line # == 0 and no file name are indications that
557 // this is a native stack trace rather than a normal
558 // error log.
559 if (results.Errors.Count > 0)
560 {
561 if (!retried && (results.Errors[0].FileName == null || results.Errors[0].FileName == String.Empty) &&
562 results.Errors[0].Line == 0)
563 {
564 // System.Console.WriteLine("retrying failed compilation");
565 retried = true;
566 }
567 else
568 {
569 complete = true;
570 }
571 }
572 else
573 {
574 complete = true;
575 }
549 } 576 }
577 while(!complete);
550 break; 578 break;
551 case enumCompileType.js: 579 case enumCompileType.js:
552 results = JScodeProvider.CompileAssemblyFromSource( 580 results = JScodeProvider.CompileAssemblyFromSource(
@@ -567,17 +595,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
567 // 595 //
568 // WARNINGS AND ERRORS 596 // WARNINGS AND ERRORS
569 // 597 //
570 int display = 5; 598 bool hadErrors = false;
599 string errtext = String.Empty;
600
571 if (results.Errors.Count > 0) 601 if (results.Errors.Count > 0)
572 { 602 {
573 string errtext = String.Empty;
574 foreach (CompilerError CompErr in results.Errors) 603 foreach (CompilerError CompErr in results.Errors)
575 { 604 {
576 // Show 5 errors max
577 //
578 if (display <= 0)
579 break;
580 display--;
581 605
582 string severity = "Error"; 606 string severity = "Error";
583 if (CompErr.IsWarning) 607 if (CompErr.IsWarning)
@@ -587,36 +611,51 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
587 611
588 KeyValuePair<int, int> lslPos; 612 KeyValuePair<int, int> lslPos;
589 613
590 lslPos = FindErrorPosition(CompErr.Line, CompErr.Column); 614 // Show 5 errors max, but check entire list for errors
615
616 if (severity == "Error")
617 {
618 lslPos = FindErrorPosition(CompErr.Line, CompErr.Column);
619 string text = CompErr.ErrorText;
620
621 // Use LSL type names
622 if (lang == enumCompileType.lsl)
623 text = ReplaceTypes(CompErr.ErrorText);
624
625 // The Second Life viewer's script editor begins
626 // countingn lines and columns at 0, so we subtract 1.
627 errtext += String.Format("Line ({0},{1}): {4} {2}: {3}\n",
628 lslPos.Key - 1, lslPos.Value - 1,
629 CompErr.ErrorNumber, text, severity);
630 hadErrors = true;
631 }
632 }
633 }
591 634
592 string text = CompErr.ErrorText; 635 if (hadErrors)
636 {
637 throw new Exception(errtext);
638 }
593 639
594 // Use LSL type names 640 // On today's highly asynchronous systems, the result of
595 if (lang == enumCompileType.lsl) 641 // the compile may not be immediately apparent. Wait a
596 text = ReplaceTypes(CompErr.ErrorText); 642 // reasonable amount of time before giving up on it.
597 643
598 // The Second Life viewer's script editor begins 644 if (!File.Exists(OutFile))
599 // countingn lines and columns at 0, so we subtract 1. 645 {
600 errtext += String.Format("Line ({0},{1}): {4} {2}: {3}\n", 646 for (int i=0; i<20 && !File.Exists(OutFile); i++)
601 lslPos.Key - 1, lslPos.Value - 1, 647 {
602 CompErr.ErrorNumber, text, severity); 648 System.Threading.Thread.Sleep(250);
603 } 649 }
604 650 // One final chance...
605 if (!File.Exists(OutFile)) 651 if (!File.Exists(OutFile))
606 { 652 {
653 errtext = String.Empty;
654 errtext += "No compile error. But not able to locate compiled file.";
607 throw new Exception(errtext); 655 throw new Exception(errtext);
608 } 656 }
609 } 657 }
610 658
611 //
612 // NO ERRORS, BUT NO COMPILED FILE
613 //
614 if (!File.Exists(OutFile))
615 {
616 string errtext = String.Empty;
617 errtext += "No compile error. But not able to locate compiled file.";
618 throw new Exception(errtext);
619 }
620// m_log.DebugFormat("[Compiler] Compiled new assembly "+ 659// m_log.DebugFormat("[Compiler] Compiled new assembly "+
621// "for {0}", asset); 660// "for {0}", asset);
622 661
@@ -629,7 +668,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
629 668
630 if (fi == null) 669 if (fi == null)
631 { 670 {
632 string errtext = String.Empty; 671 errtext = String.Empty;
633 errtext += "No compile error. But not able to stat file."; 672 errtext += "No compile error. But not able to stat file.";
634 throw new Exception(errtext); 673 throw new Exception(errtext);
635 } 674 }
@@ -644,7 +683,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
644 } 683 }
645 catch (Exception) 684 catch (Exception)
646 { 685 {
647 string errtext = String.Empty; 686 errtext = String.Empty;
648 errtext += "No compile error. But not able to open file."; 687 errtext += "No compile error. But not able to open file.";
649 throw new Exception(errtext); 688 throw new Exception(errtext);
650 } 689 }