src/Pure/Admin/isabelle_cronjob.scala
changeset 64199 f38d39c57959
parent 64198 351b8211aef9
child 64215 123e6dcd3852
equal deleted inserted replaced
64198:351b8211aef9 64199:f38d39c57959
   148       case None | Some("") =>
   148       case None | Some("") =>
   149       case Some(running) =>
   149       case Some(running) =>
   150         error("Isabelle cronjob appears to be still running: " + running)
   150         error("Isabelle cronjob appears to be still running: " + running)
   151     }
   151     }
   152 
   152 
       
   153 
       
   154     /* log service */
       
   155 
       
   156     val log_service = new Log_Service(progress)
       
   157 
       
   158     def run(start_date: Date, task: Logger_Task) { log_service.run_task(start_date, task) }
       
   159 
       
   160     def run_now(task: Logger_Task) { run(Date.now(), task) }
       
   161 
       
   162 
       
   163     /* structured tasks */
       
   164 
       
   165     def SEQ(tasks: Logger_Task*): Logger_Task = Logger_Task(body = _ =>
       
   166       for (task <- tasks.iterator if !exclude_task(task.name) || task.name == "")
       
   167         run_now(task))
       
   168 
       
   169     def PAR(tasks: Logger_Task*): Logger_Task = Logger_Task(body = _ =>
       
   170       {
       
   171         @tailrec def join(running: List[Task])
       
   172         {
       
   173           running.partition(_.is_finished) match {
       
   174             case (Nil, Nil) =>
       
   175             case (Nil, _ :: _) => Thread.sleep(500); join(running)
       
   176             case (_ :: _, remaining) => join(remaining)
       
   177           }
       
   178         }
       
   179         val start_date = Date.now()
       
   180         val running =
       
   181           for (task <- tasks.toList if !exclude_task(task.name))
       
   182             yield log_service.fork_task(start_date, task)
       
   183         join(running)
       
   184       })
       
   185 
       
   186 
       
   187     /* main */
       
   188 
   153     val main_start_date = Date.now()
   189     val main_start_date = Date.now()
   154     val log_service = new Log_Service(progress)
       
   155 
       
   156     File.write(main_state_file, main_start_date + " " + log_service.hostname)
   190     File.write(main_state_file, main_start_date + " " + log_service.hostname)
   157 
       
   158 
       
   159     /* run tasks */
       
   160 
       
   161     def run(start_date: Date, task: Logger_Task): Unit =
       
   162       log_service.run_task(start_date, task)
       
   163 
       
   164     def run_sequential(tasks: Logger_Task*): Unit =
       
   165       for (task <- tasks.iterator if !exclude_task(task.name) || task.name == "")
       
   166         run(Date.now(), task)
       
   167 
       
   168     def run_parallel(tasks: Logger_Task*)
       
   169     {
       
   170       @tailrec def join(running: List[Task])
       
   171       {
       
   172         running.partition(_.is_finished) match {
       
   173           case (Nil, Nil) =>
       
   174           case (Nil, _ :: _) => Thread.sleep(500); join(running)
       
   175           case (_ :: _, remaining) => join(remaining)
       
   176         }
       
   177       }
       
   178 
       
   179       val start_date = Date.now()
       
   180       val running =
       
   181         for (task <- tasks.toList if !exclude_task(task.name))
       
   182           yield log_service.fork_task(start_date, task)
       
   183       join(running)
       
   184     }
       
   185 
       
   186     def SEQ(tasks: Logger_Task*): Logger_Task =
       
   187       Logger_Task(body = _ => run_sequential(tasks:_*))
       
   188 
       
   189     def PAR(tasks: Logger_Task*): Logger_Task =
       
   190       Logger_Task(body = _ => run_parallel(tasks:_*))
       
   191 
       
   192 
       
   193     /* main */
       
   194 
   191 
   195     run(main_start_date,
   192     run(main_start_date,
   196       Logger_Task("isabelle_cronjob", _ =>
   193       Logger_Task("isabelle_cronjob", _ =>
   197         run_sequential(isabelle_identify, build_history_base)))
   194         run_now(SEQ(isabelle_identify, build_history_base))))
   198 
   195 
   199     log_service.shutdown()
   196     log_service.shutdown()
   200 
   197 
   201     main_state_file.file.delete
   198     main_state_file.file.delete
   202   }
   199   }