provide POLYSTATSDIR to keep $HOME/.polyml clean (requires Poly/ML 52881757b127, otherwise ignored);
authorwenzelm
Fri, 07 Aug 2020 22:57:14 +0200
changeset 72119 d115d50a19c0
parent 72118 84f716e72fa3
child 72120 2831933195ef
provide POLYSTATSDIR to keep $HOME/.polyml clean (requires Poly/ML 52881757b127, otherwise ignored);
src/Pure/ML/ml_process.scala
src/Pure/ML/ml_statistics.scala
src/Pure/PIDE/markup.ML
src/Pure/PIDE/markup.scala
src/Pure/System/isabelle_process.ML
--- a/src/Pure/ML/ml_process.scala	Fri Aug 07 22:28:04 2020 +0200
+++ b/src/Pure/ML/ml_process.scala	Fri Aug 07 22:57:14 2020 +0200
@@ -110,7 +110,9 @@
 
     // ISABELLE_TMP
     val isabelle_tmp = Isabelle_System.tmp_dir("process")
-    val env_tmp = Map("ISABELLE_TMP" -> File.standard_path(isabelle_tmp))
+    val env_tmp =
+      Map("ISABELLE_TMP" -> File.standard_path(isabelle_tmp),
+        "POLYSTATSDIR" -> isabelle_tmp.getAbsolutePath)
 
     val env_functions = Map("ISABELLE_SCALA_FUNCTIONS" -> Scala.functions.mkString(","))
 
--- a/src/Pure/ML/ml_statistics.scala	Fri Aug 07 22:28:04 2020 +0200
+++ b/src/Pure/ML/ml_statistics.scala	Fri Aug 07 22:57:14 2020 +0200
@@ -28,6 +28,7 @@
   /* monitor process */
 
   def monitor(pid: Long,
+    stats_dir: String = "",
     delay: Time = Time.seconds(0.5),
     consume: Properties.T => Unit = Console.println)
   {
@@ -42,7 +43,10 @@
       if (props.nonEmpty) consume(props)
     }
 
-    Bash.process("exec \"$POLYML_EXE\" -q --use src/Pure/ML/ml_statistics.ML --eval " +
+    val env_prefix =
+      if (stats_dir.isEmpty) "" else "export POLYSTATSDIR=" + Bash.string(stats_dir) + "\n"
+
+    Bash.process(env_prefix + "exec \"$POLYML_EXE\" -q --use src/Pure/ML/ml_statistics.ML --eval " +
         Bash.string("ML_Statistics.monitor " + ML_Syntax.print_long(pid) + " " +
           ML_Syntax.print_double(delay.seconds)),
         cwd = Path.explode("~~").file)
@@ -79,8 +83,11 @@
     private def ml_statistics(msg: Prover.Protocol_Output): Boolean = synchronized
     {
       msg.properties match {
-        case Markup.ML_Statistics(pid) =>
-          monitoring = Future.thread("ML_statistics") { monitor(pid, consume = consume) }
+        case Markup.ML_Statistics(pid, stats_dir) =>
+          monitoring =
+            Future.thread("ML_statistics") {
+              monitor(pid, stats_dir = stats_dir, consume = consume)
+            }
           true
         case _ => false
       }
--- a/src/Pure/PIDE/markup.ML	Fri Aug 07 22:28:04 2020 +0200
+++ b/src/Pure/PIDE/markup.ML	Fri Aug 07 22:57:14 2020 +0200
@@ -209,7 +209,7 @@
   val dialogN: string val dialog: serial -> string -> T
   val jedit_actionN: string
   val functionN: string
-  val ML_statistics: {pid: int} -> Properties.T
+  val ML_statistics: {pid: int, stats_dir: string} -> Properties.T
   val commands_accepted: Properties.T
   val assign_update: Properties.T
   val removed_versions: Properties.T
@@ -672,7 +672,8 @@
 
 val functionN = "function"
 
-fun ML_statistics {pid} = [(functionN, "ML_statistics"), ("pid", Value.print_int pid)];
+fun ML_statistics {pid, stats_dir} =
+  [(functionN, "ML_statistics"), ("pid", Value.print_int pid), ("stats_dir", stats_dir)];
 
 val commands_accepted = [(functionN, "commands_accepted")];
 
--- a/src/Pure/PIDE/markup.scala	Fri Aug 07 22:28:04 2020 +0200
+++ b/src/Pure/PIDE/markup.scala	Fri Aug 07 22:57:14 2020 +0200
@@ -578,9 +578,10 @@
 
   object ML_Statistics extends Function("ML_statistics")
   {
-    def unapply(props: Properties.T): Option[Long] =
+    def unapply(props: Properties.T): Option[(Long, String)] =
       props match {
-        case List(PROPERTY, ("pid", Value.Long(pid))) => Some(pid)
+        case List(PROPERTY, ("pid", Value.Long(pid)), ("stats_dir", stats_dir)) =>
+          Some((pid, stats_dir))
         case _ => None
       }
   }
--- a/src/Pure/System/isabelle_process.ML	Fri Aug 07 22:28:04 2020 +0200
+++ b/src/Pure/System/isabelle_process.ML	Fri Aug 07 22:57:14 2020 +0200
@@ -113,6 +113,10 @@
     Output.physical_stderr
       "Recovered from Isabelle process crash -- see also Isabelle_Process.crashes\n");
 
+fun ml_statistics () =
+  Output.protocol_message
+    (Markup.ML_statistics {pid = ML_Pid.get (), stats_dir = getenv "POLYSTATSDIR"}) [];
+
 val _ = Session.protocol_handler "isabelle.ML_Statistics$Protocol_Handler";
 
 in
@@ -201,7 +205,7 @@
 
     fun protocol () =
      (Session.init_protocol_handlers ();
-      Output.protocol_message (Markup.ML_statistics {pid = ML_Pid.get ()}) [];
+      ml_statistics ();
       message Markup.initN [] [XML.Text (Session.welcome ())];
       protocol_loop ());