branch: externals/el-job
commit 04a4ec75c463a999c009cb87bc8bfd800818a3b1
Author: Martin Edström <[email protected]>
Commit: Martin Edström <[email protected]>

    Pass args to :callback same order as :inputs
    
    See explanation in 4fe6b604eab17d18f290d9d99d3e781725d614c0
---
 el-job-ng.el | 39 +++++++++++++++++++--------------------
 1 file changed, 19 insertions(+), 20 deletions(-)

diff --git a/el-job-ng.el b/el-job-ng.el
index 3f44a5a18d..ec422b9eb3 100644
--- a/el-job-ng.el
+++ b/el-job-ng.el
@@ -153,11 +153,10 @@ The extra character is meant to aid reading clarity 
inside BODY."
 (cl-defstruct (el-job-ng--job (:constructor el-job-ng--make-job)
                               (:copier nil))
   id
-  processes
+  process-outputs
   stderr
-  callback
   (benchmarks-tbl (make-hash-table :test #'equal))
-  outputs)
+  callback)
 
 ;;;###autoload
 (cl-defun el-job-ng-run (&key id
@@ -223,13 +222,11 @@ ID can also be passed to these helpers:
   (setq id (or id (abs (random))))
   (let ((job (or (gethash id el-job-ng--jobs)
                  (puthash id (el-job-ng--make-job :id id) el-job-ng--jobs))))
-    (el-job-ng--with job (.processes .benchmarks-tbl .callback .outputs 
.stderr)
+    (el-job-ng--with job (.process-outputs .benchmarks-tbl .callback .stderr)
       ;; Cancel any currently-running job with same ID
-      (dolist (proc .processes)
+      (while-let ((proc (car (pop .process-outputs))))
         (delete-process proc))
-      (setf .processes nil)
       (setf .callback callback)
-      (setf .outputs nil)
       ;; https://github.com/meedstrom/org-node/issues/98
       (with-temp-buffer
         (let* ((print-length nil)
@@ -277,7 +274,7 @@ ID can also be passed to these helpers:
                                       (format " *el-job-ng:%s:%d*" id i) t)
                              :command command
                              :sentinel #'el-job-ng--sentinel)))
-                  (push proc .processes)
+                  (push (cons proc nil) .process-outputs)
                   ;; Q: Why not a temp buffer? A: Have to `erase-buffer' in any
                   ;; case, and this buffer is easier to peek on during edebug.
                   (with-current-buffer (process-buffer proc)
@@ -320,7 +317,7 @@ ID can also be passed to these helpers:
     (let ((print-length nil)
           (print-level nil)
           (print-circle t))
-      (print benchmarked-outputs))))
+      (print (nreverse benchmarked-outputs)))))
 
 
 ;;; Sentinel; receiving what the child printed
@@ -363,22 +360,24 @@ and run `el-job-ng--handle-finished-child'."
            (el-job-ng-kill-keep-bufs id)))))
 
 (defun el-job-ng--handle-finished-child (proc buf job)
-  (el-job-ng--with job (.id .processes .benchmarks-tbl .outputs .callback)
-    (setf .processes (delq proc .processes))
+  (el-job-ng--with job (.id .process-outputs .callback .benchmarks-tbl)
     (with-current-buffer buf
       (unless (and (eobp) (> (point) 2) (eq (char-before) ?\n))
         (error "Process output looks incomplete or point moved"))
-      (goto-char (point-min))
-      (cl-loop for (input duration output) in (read (current-buffer)) do
-               (puthash input duration .benchmarks-tbl)
-               (push output .outputs))
+      (setcdr (assq proc .process-outputs)
+              (cl-loop for (input benchmark output) in (read (buffer-string))
+                       do (puthash input benchmark .benchmarks-tbl)
+                       and collect output))
+      (setcar (assq proc .process-outputs) nil)
       (when (= 0 el-job-ng--debug-level)
         (kill-buffer)))
-    (when (null .processes)
-      (when .callback
+    ;; Last child
+    (when (and .callback (cl-every #'null (mapcar #'car .process-outputs)))
+      (let ((outputs (prog1 (mapcan #'cdr .process-outputs)
+                       (setf .process-outputs nil))))
         ;; Allow quitting out of a hung or slow CALLBACK.  Since we're called
         ;; by a process sentinel, `inhibit-quit' is t at this time.
-        (when (null (with-local-quit (funcall .callback .outputs) t))
+        (when (null (with-local-quit (funcall .callback outputs) t))
           (el-job-ng--dbg 0 "Quit while executing :callback for %s" .id))))))
 
 
@@ -456,13 +455,13 @@ Otherwise, a keyboard quit would let it continue in the 
background."
 
 (defun el-job-ng-processes (id)
   (let ((job (el-job-ng-get-job id)))
-    (and job (el-job-ng--job-processes job))))
+    (and job (mapcar #'car (el-job-ng--job-process-outputs job)))))
 
 (define-obsolete-function-alias 'el-job-ng-job 'el-job-ng-get-job "2026-01-22")
 (defun el-job-ng-get-job (id-or-process)
   (if (processp id-or-process)
       (cl-loop for job being each hash-value of el-job-ng--jobs
-               when (memq id-or-process (el-job-ng--processes job))
+               when (assq id-or-process (el-job-ng--job-process-outputs job))
                return job)
     (gethash id-or-process el-job-ng--jobs)))
 

Reply via email to