First version of the job control
This commit is contained in:
parent
dc699ce88f
commit
2f7595603b
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
args="-lel pps/load.scm -lel module-system/load.scm -lel interaction/load.scm -lm debug-packages.scm -lel scsh-ncurses-0.2/load.scm -lm nuit-packages.scm -o nuit"
|
args="-lel pps/load.scm -lel module-system/load.scm -lel interaction/load.scm -lel cml/load.scm -lm debug-packages.scm -lel scsh-ncurses-0.2/load.scm -lm nuit-packages.scm -o nuit"
|
||||||
echo "Starting scsh with options: $args"
|
echo "Starting scsh with options: $args"
|
||||||
exec scsh $args
|
exec scsh $args
|
||||||
#-c "(nuit)"
|
#-c "(nuit)"
|
|
@ -1,3 +1,3 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
args="-lel pps/load.scm -lel module-system/load.scm -lel interaction/load.scm -lm debug-packages.scm -lel scsh-ncurses-0.2/load.scm -lm nuit-packages.scm -o nuit"
|
args="-lel pps/load.scm -lel module-system/load.scm -lel interaction/load.scm -lel cml/load.scm -lm debug-packages.scm -lel scsh-ncurses-0.2/load.scm -lm nuit-packages.scm -o nuit"
|
||||||
exec scsh $args -c "(nuit)"
|
exec scsh $args -c "(nuit)"
|
||||||
|
|
|
@ -0,0 +1,141 @@
|
||||||
|
(define-record-type job :job
|
||||||
|
(make-job name pty-in pty-out proc status)
|
||||||
|
job?
|
||||||
|
(name job-name)
|
||||||
|
(pty-in job-pty-in)
|
||||||
|
(pty-out job-pty-out)
|
||||||
|
(proc job-proc)
|
||||||
|
(status really-job-status))
|
||||||
|
|
||||||
|
(define (make-job name pty-in pty-out proc)
|
||||||
|
(let ((job (make-job name pty-in pty-out proc
|
||||||
|
(make-placeholder))))
|
||||||
|
(spawn-job-status-surveillant job)
|
||||||
|
(add-job! job)
|
||||||
|
job))
|
||||||
|
|
||||||
|
(define (job-status-rv job)
|
||||||
|
(placeholder-value-rv (really-job-status job)))
|
||||||
|
|
||||||
|
(define (job-status job)
|
||||||
|
(sync (job-status-rv job)))
|
||||||
|
|
||||||
|
(define (spawn-job-status-surveillant job)
|
||||||
|
(let ((channel (make-channel)))
|
||||||
|
(spawn
|
||||||
|
(lambda ()
|
||||||
|
(placeholder-set!
|
||||||
|
(really-job-status job) (wait (job-proc)))))))
|
||||||
|
|
||||||
|
(define (signal-job signal job)
|
||||||
|
(signal-process-group signal (job-proc job)))
|
||||||
|
|
||||||
|
(define (stop-job job)
|
||||||
|
(signal-job signal/stop job))
|
||||||
|
|
||||||
|
(define (continue-job job)
|
||||||
|
(signal-process-group signal/cont job))
|
||||||
|
|
||||||
|
;; channels for communicating with the joblist surveillant
|
||||||
|
|
||||||
|
(define add-job-channel
|
||||||
|
(make-channel))
|
||||||
|
|
||||||
|
(define get-job-list-channel
|
||||||
|
(make-channel))
|
||||||
|
|
||||||
|
(define (add-job! job)
|
||||||
|
(send add-job-channel job))
|
||||||
|
|
||||||
|
(define (running-jobs)
|
||||||
|
(let ((answer-channel (make-channel)))
|
||||||
|
(send get-job-list-channel (cons 'running answer-channel))
|
||||||
|
(receive answer-channel)))
|
||||||
|
|
||||||
|
(define (ready-jobs)
|
||||||
|
(let ((answer-channel (make-channel)))
|
||||||
|
(send get-job-list-channel (cons 'ready answer-channel))
|
||||||
|
(receive answer-channel)))
|
||||||
|
|
||||||
|
(define (jobs-with-new-output)
|
||||||
|
(let ((answer-channel (make-channel)))
|
||||||
|
(send get-job-list-channel (cons 'new-output answer-channel))
|
||||||
|
(receive answer-channel)))
|
||||||
|
|
||||||
|
(define (jobs-waiting-for-input)
|
||||||
|
(let ((answer-channel (make-channel)))
|
||||||
|
(send get-job-list-channel (cons 'waiting-for-input answer-channel))
|
||||||
|
(receive answer-channel)))
|
||||||
|
|
||||||
|
(define (spawn-joblist-surveillant)
|
||||||
|
(let ((statistics-channel (make-channel)))
|
||||||
|
(spawn
|
||||||
|
(lambda ()
|
||||||
|
(let lp ((running '())
|
||||||
|
(ready '())
|
||||||
|
(new-output '())
|
||||||
|
(waiting-for-input '())
|
||||||
|
(notify? #f))
|
||||||
|
(cond
|
||||||
|
(notify?
|
||||||
|
(send statistics-channel
|
||||||
|
(list (cons 'running (length running))
|
||||||
|
(cons 'ready (length ready))
|
||||||
|
(cons 'new-output (length new-output))
|
||||||
|
(cons 'waiting-for-input (length waiting-for-input))))
|
||||||
|
(lp running ready new-output waiting-for-input #f))
|
||||||
|
(else
|
||||||
|
(apply
|
||||||
|
select
|
||||||
|
(append
|
||||||
|
(list
|
||||||
|
(wrap (receive-rv add-job-channel)
|
||||||
|
(lambda (new-job)
|
||||||
|
(lp (cons new-job running)
|
||||||
|
ready new-output waiting-for-input #t)))
|
||||||
|
|
||||||
|
(wrap (receive-rv get-job-list-channel)
|
||||||
|
(lambda (state.channel)
|
||||||
|
(send (cdr state.channel)
|
||||||
|
(case (car state.channel)
|
||||||
|
((running) running)
|
||||||
|
((ready) ready)
|
||||||
|
((new-output) new-output)
|
||||||
|
((waiting-for-input) waiting-for-input)
|
||||||
|
(else
|
||||||
|
(error "joblist-surveillant" state.channel))))
|
||||||
|
(lp running ready new-output waiting-for-input #f))))
|
||||||
|
|
||||||
|
(map (lambda (job)
|
||||||
|
(wrap (job-status-rv job)
|
||||||
|
(lambda (ignore)
|
||||||
|
(lp (delete job running)
|
||||||
|
(cons job ready)
|
||||||
|
new-output
|
||||||
|
waiting-for-input #t))))
|
||||||
|
running))))))))
|
||||||
|
statistics-channel))
|
||||||
|
|
||||||
|
(define (initial-job-statistics)
|
||||||
|
(list (cons 'running 0)
|
||||||
|
(cons 'ready 0)
|
||||||
|
(cons 'new-output 0)
|
||||||
|
(cons 'waiting-for-input 0)))
|
||||||
|
|
||||||
|
;; #### unfinished
|
||||||
|
(define (install-terminal/stop-handler)
|
||||||
|
(set-interrupt-handler
|
||||||
|
interrupt/tstp
|
||||||
|
(lambda args
|
||||||
|
(display args))))
|
||||||
|
|
||||||
|
(define-syntax run-as-background-job
|
||||||
|
(syntax-rules ()
|
||||||
|
((_ epf)
|
||||||
|
(call-with-values
|
||||||
|
(lambda ()
|
||||||
|
(fork-pty-session
|
||||||
|
(lambda ()
|
||||||
|
(exec-epf epf))))
|
||||||
|
(lambda (proc pty-in pty-out tty-name)
|
||||||
|
(make-job (quote epf) pty-in pty-out proc))))))
|
|
@ -305,11 +305,20 @@
|
||||||
(init-windows!)
|
(init-windows!)
|
||||||
(init-executables-completion-set!)
|
(init-executables-completion-set!)
|
||||||
|
|
||||||
|
;; init joblist
|
||||||
|
(let ((statistics-channel (spawn-joblist-surveillant)))
|
||||||
|
(spawn
|
||||||
|
(lambda ()
|
||||||
|
(let lp ((stats (cml-receive statistics-channel)))
|
||||||
|
(debug-message "statistics update " stats)
|
||||||
|
(paint-command-frame-window)
|
||||||
|
(paint-job-status-list stats)
|
||||||
|
(paint-command-window-contents)
|
||||||
|
(refresh-command-window)
|
||||||
|
(lp (cml-receive statistics-channel))))))
|
||||||
|
|
||||||
(set-process-group (pid) (pid))
|
(set-process-group (pid) (pid))
|
||||||
(set-tty-process-group (current-input-port) (pid))
|
(set-tty-process-group (current-input-port) (pid))
|
||||||
(set-interrupt-handler interrupt/tstp
|
|
||||||
(lambda a
|
|
||||||
(debug-message "SIGTSTP")))
|
|
||||||
|
|
||||||
'(set-interrupt-handler interrupt/keyboard
|
'(set-interrupt-handler interrupt/keyboard
|
||||||
(lambda a
|
(lambda a
|
||||||
|
@ -536,8 +545,36 @@
|
||||||
(box (app-window-curses-win command-frame-window)
|
(box (app-window-curses-win command-frame-window)
|
||||||
(ascii->char 0) (ascii->char 0))
|
(ascii->char 0) (ascii->char 0))
|
||||||
(paint-command-buffer-mode-indicator)
|
(paint-command-buffer-mode-indicator)
|
||||||
|
(paint-job-status-list)
|
||||||
(wrefresh (app-window-curses-win command-frame-window)))
|
(wrefresh (app-window-curses-win command-frame-window)))
|
||||||
|
|
||||||
|
(define paint-job-status-list
|
||||||
|
(let ((latest-statistics (initial-job-statistics)))
|
||||||
|
(lambda args
|
||||||
|
(let-optionals args
|
||||||
|
((statistics latest-statistics))
|
||||||
|
(let* ((stat-item (lambda (text number)
|
||||||
|
(string-append text (number->string number))))
|
||||||
|
(stat
|
||||||
|
(string-join
|
||||||
|
(map
|
||||||
|
(lambda (status.count)
|
||||||
|
(case (car status.count)
|
||||||
|
((running) (stat-item "run:" (cdr status.count)))
|
||||||
|
((ready) (stat-item "ready:" (cdr status.count)))
|
||||||
|
((new-output) (stat-item "out:" (cdr status.count)))
|
||||||
|
((waiting-for-input) (stat-item "in:" (cdr status.count)))))
|
||||||
|
statistics)))
|
||||||
|
(line (string-append "[ " stat " ]")))
|
||||||
|
(set! latest-statistics statistics)
|
||||||
|
(mvwaddstr
|
||||||
|
(app-window-curses-win command-frame-window)
|
||||||
|
(- (app-window-height command-frame-window) 1)
|
||||||
|
(- (- (app-window-width command-frame-window)
|
||||||
|
(string-length line))
|
||||||
|
2)
|
||||||
|
line))))))
|
||||||
|
|
||||||
(define (paint-command-window-contents)
|
(define (paint-command-window-contents)
|
||||||
(set-buffer-num-lines! command-buffer
|
(set-buffer-num-lines! command-buffer
|
||||||
(- (app-window-height command-window) 2))
|
(- (app-window-height command-window) 2))
|
||||||
|
|
|
@ -329,13 +329,46 @@
|
||||||
thread-fluids)
|
thread-fluids)
|
||||||
(files complete))
|
(files complete))
|
||||||
|
|
||||||
|
;;; jobs and joblist
|
||||||
|
|
||||||
|
(define-interface job-interface
|
||||||
|
(export make-job
|
||||||
|
job-status
|
||||||
|
job-status-rv
|
||||||
|
signal-job
|
||||||
|
stop-job
|
||||||
|
continue-job
|
||||||
|
(run-as-background-job :syntax)))
|
||||||
|
|
||||||
|
(define-interface joblist-interface
|
||||||
|
(export running-jobs
|
||||||
|
ready-jobs
|
||||||
|
jobs-with-new-output
|
||||||
|
jobs-waiting-for-input
|
||||||
|
spawn-joblist-surveillant
|
||||||
|
initial-job-statistics))
|
||||||
|
|
||||||
|
(define-structures ((jobs job-interface)
|
||||||
|
(joblist joblist-interface))
|
||||||
|
(open (modify scheme-with-scsh
|
||||||
|
(hide receive select))
|
||||||
|
define-record-types
|
||||||
|
threads
|
||||||
|
srfi-1
|
||||||
|
signals
|
||||||
|
|
||||||
|
rendezvous
|
||||||
|
rendezvous-channels
|
||||||
|
rendezvous-placeholders)
|
||||||
|
(files job))
|
||||||
|
|
||||||
;;; nuit
|
;;; nuit
|
||||||
|
|
||||||
(define-interface nuit-interface
|
(define-interface nuit-interface
|
||||||
(export nuit))
|
(export nuit))
|
||||||
|
|
||||||
(define-structure nuit nuit-interface
|
(define-structure nuit nuit-interface
|
||||||
(open scheme-with-scsh
|
(open (modify scheme-with-scsh (hide receive))
|
||||||
external-calls
|
external-calls
|
||||||
define-record-types
|
define-record-types
|
||||||
conditions
|
conditions
|
||||||
|
@ -352,6 +385,13 @@
|
||||||
inspect-exception
|
inspect-exception
|
||||||
rt-modules
|
rt-modules
|
||||||
tty-debug
|
tty-debug
|
||||||
|
threads
|
||||||
|
rendezvous
|
||||||
|
(modify rendezvous-channels
|
||||||
|
(rename
|
||||||
|
(send cml-send)
|
||||||
|
(receive cml-receive)))
|
||||||
|
let-opt
|
||||||
|
|
||||||
focus-table
|
focus-table
|
||||||
nuit-eval/focus-table
|
nuit-eval/focus-table
|
||||||
|
@ -365,6 +405,8 @@
|
||||||
handle-fatal-error
|
handle-fatal-error
|
||||||
completion-sets
|
completion-sets
|
||||||
select-list
|
select-list
|
||||||
|
jobs
|
||||||
|
joblist
|
||||||
;; the following modules are plugins
|
;; the following modules are plugins
|
||||||
dirlist-view-plugin
|
dirlist-view-plugin
|
||||||
user-group-info-plugin
|
user-group-info-plugin
|
||||||
|
|
Loading…
Reference in New Issue