base: Box 'number-children'
* src/mcron/base.scm (number-children): Box it using SRFI-111 to be
explicit about the mutability of this object.
(update-number-children!): New procedure.
(run-job, child-cleanup): Use it.
* tests/base.scm ("update-number-children!: 1+")
("number-children: init", "update-number-children!: 1-"): New tests.
	
	
This commit is contained in:
		
					parent
					
						
							
								d63db1ce4e
							
						
					
				
			
			
				commit
				
					
						526ce502e5
					
				
			
		
					 2 changed files with 47 additions and 6 deletions
				
			
		| 
						 | 
					@ -32,6 +32,7 @@
 | 
				
			||||||
  #:use-module (srfi srfi-1)
 | 
					  #:use-module (srfi srfi-1)
 | 
				
			||||||
  #:use-module (srfi srfi-2)
 | 
					  #:use-module (srfi srfi-2)
 | 
				
			||||||
  #:use-module (srfi srfi-9)
 | 
					  #:use-module (srfi srfi-9)
 | 
				
			||||||
 | 
					  #:use-module (srfi srfi-111)
 | 
				
			||||||
  #:export (add-job
 | 
					  #:export (add-job
 | 
				
			||||||
            remove-user-jobs
 | 
					            remove-user-jobs
 | 
				
			||||||
            display-schedule
 | 
					            display-schedule
 | 
				
			||||||
| 
						 | 
					@ -157,10 +158,18 @@ unusable."
 | 
				
			||||||
                   jobs))))
 | 
					                   jobs))))
 | 
				
			||||||
    (display-schedule (- count 1) port #:schedule schedule)))
 | 
					    (display-schedule (- count 1) port #:schedule schedule)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;; For proper housekeeping, it is necessary to keep a record of the number of
 | 
					;;;
 | 
				
			||||||
;; child processes we fork off to run the jobs.
 | 
					;;; Running jobs
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define number-children 0)
 | 
					(define number-children
 | 
				
			||||||
 | 
					  ;; For proper housekeeping, it is necessary to keep a record of the number
 | 
				
			||||||
 | 
					  ;; of child processes we fork off to run the jobs.
 | 
				
			||||||
 | 
					  (box 0))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (update-number-children! proc)
 | 
				
			||||||
 | 
					  ;; Apply PROC to the value stored in 'number-children'.
 | 
				
			||||||
 | 
					  (set-box! number-children (proc (unbox number-children))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (run-job job)
 | 
					(define (run-job job)
 | 
				
			||||||
  "Run JOB in a separate process. The process is run as JOB user with the
 | 
					  "Run JOB in a separate process. The process is run as JOB user with the
 | 
				
			||||||
| 
						 | 
					@ -178,16 +187,16 @@ next value."
 | 
				
			||||||
        (λ ()
 | 
					        (λ ()
 | 
				
			||||||
          (primitive-exit 0)))
 | 
					          (primitive-exit 0)))
 | 
				
			||||||
      (begin                            ;parent
 | 
					      (begin                            ;parent
 | 
				
			||||||
        (set! number-children (+ number-children 1))
 | 
					        (update-number-children! 1+)
 | 
				
			||||||
        (job:next-time-set! job ((job:next-time-function job)
 | 
					        (job:next-time-set! job ((job:next-time-function job)
 | 
				
			||||||
                                 (current-time))))))
 | 
					                                 (current-time))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (child-cleanup)
 | 
					(define (child-cleanup)
 | 
				
			||||||
  ;; Give any zombie children a chance to die, and decrease the number known
 | 
					  ;; Give any zombie children a chance to die, and decrease the number known
 | 
				
			||||||
  ;; to exist.
 | 
					  ;; to exist.
 | 
				
			||||||
  (unless (or (<= number-children 0)
 | 
					  (unless (or (<= (unbox number-children) 0)
 | 
				
			||||||
              (= (car (waitpid WAIT_ANY WNOHANG)) 0))
 | 
					              (= (car (waitpid WAIT_ANY WNOHANG)) 0))
 | 
				
			||||||
    (set! number-children (- number-children 1))
 | 
					    (update-number-children! 1-)
 | 
				
			||||||
    (child-cleanup)))
 | 
					    (child-cleanup)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define* (run-job-loop #:optional fd-list #:key (schedule %global-schedule))
 | 
					(define* (run-job-loop #:optional fd-list #:key (schedule %global-schedule))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,7 @@
 | 
				
			||||||
;;; along with GNU Mcron.  If not, see <http://www.gnu.org/licenses/>.
 | 
					;;; along with GNU Mcron.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(use-modules (srfi srfi-64)
 | 
					(use-modules (srfi srfi-64)
 | 
				
			||||||
 | 
					             (srfi srfi-111)
 | 
				
			||||||
             (mcron base))
 | 
					             (mcron base))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(test-begin "base")
 | 
					(test-begin "base")
 | 
				
			||||||
| 
						 | 
					@ -148,4 +149,35 @@
 | 
				
			||||||
    (with-output-to-string
 | 
					    (with-output-to-string
 | 
				
			||||||
      (λ () (display-schedule 1 #:schedule schdl)))))
 | 
					      (λ () (display-schedule 1 #:schedule schdl)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					;;; Running jobs
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;; Import private global.
 | 
				
			||||||
 | 
					(define number-children (@@ (mcron base) number-children))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;; Import private procedures.
 | 
				
			||||||
 | 
					(define update-number-children! (@@ (mcron base) update-number-children!))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;; Check 'number-children' initial value.
 | 
				
			||||||
 | 
					(let ((schdl (make-schedule '() '() 'user)))
 | 
				
			||||||
 | 
					  (test-equal "number-children: init"
 | 
				
			||||||
 | 
					    0
 | 
				
			||||||
 | 
					    (unbox number-children)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;; Check 'update-number-children!' incrementation.
 | 
				
			||||||
 | 
					(let ((schdl (make-schedule '() '() 'user)))
 | 
				
			||||||
 | 
					  (update-number-children! 1+)
 | 
				
			||||||
 | 
					  (update-number-children! 1+)
 | 
				
			||||||
 | 
					  (test-equal "update-number-children!: 1+"
 | 
				
			||||||
 | 
					    2
 | 
				
			||||||
 | 
					    (unbox number-children)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;; Check 'update-number-children!' decrementation.
 | 
				
			||||||
 | 
					(let ((schdl (make-schedule '() '() 'user)))
 | 
				
			||||||
 | 
					  (update-number-children! 1-)
 | 
				
			||||||
 | 
					  (test-equal "update-number-children!: 1-"
 | 
				
			||||||
 | 
					    1
 | 
				
			||||||
 | 
					    (unbox number-children)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(test-end)
 | 
					(test-end)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue