* Copyright (c) 1990 Jan-Simon Pendry
* Copyright (c) 1990 Imperial College of Science, Technology & Medicine
* Copyright (c) 1990 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Jan-Simon Pendry at Imperial College, London.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* @(#)sched.c 5.3 (Berkeley) 5/12/91
* $Id: sched.c,v 5.2.1.5 91/05/07 22:18:32 jsp Alpha $
extern jmp_buf select_intr
;
extern int select_intr_valid
;
typedef struct pjob pjob
;
qelem hdr
; /* Linked list */
int pid
; /* Process ID of job */
cb_fun cb_fun
; /* Callback function */
voidp cb_closure
; /* Closure for callback */
union wait w
; /* Status filled in by sigchld */
voidp wchan
; /* Wait channel */
extern qelem proc_list_head
;
qelem proc_list_head
= { &proc_list_head
, &proc_list_head
};
extern qelem proc_wait_list
;
qelem proc_wait_list
= { &proc_wait_list
, &proc_wait_list
};
qelem
*p2
= elem
->q_back
;
static pjob
*sched_job(cf
, ca
)
* Now place on wait queue
ins_que(&p
->hdr
, &proc_wait_list
);
void run_task(tf
, ta
, cf
, ca
)
pjob
*p
= sched_job(cf
, ca
);
mask
= sigblock(sigmask(SIGCHLD
));
if (p
->pid
= background()) {
* Schedule a task to be run when woken up
void sched_task(cf
, ca
, wchan
)
pjob
*p
= sched_job(cf
, ca
);
dlog("SLEEP on %#x", wchan
);
bzero((voidp
) &p
->w
, sizeof(p
->w
));
ins_que(&p
->hdr
, &proc_list_head
);
/*dlog("wakeup(%#x)", wchan);*/
* Can't user ITER() here because
* wakeupjob() juggles the list.
for (p
= FIRST(pjob
, &proc_wait_list
);
p2
= NEXT(pjob
, p
), p
!= HEAD(pjob
, &proc_wait_list
);
dlog("Nothing SLEEPing on %#x", wchan
);
void wakeup_task(rc
, term
, cl
)
if ((pid
= wait(&w
)) > 0) {
while ((pid
= wait3((int *) &w
, WNOHANG
, (struct rusage
*) 0)) > 0) {
#endif /* SYS5_SIGNALS */
plog(XLOG_ERROR
, "Process %d exited with signal %d",
dlog("Process %d exited with status %d",
for (p
= FIRST(pjob
, &proc_wait_list
);
p2
= NEXT(pjob
, p
), p
!= HEAD(pjob
, &proc_wait_list
);
if (p
) ; else dlog("can't locate task block for pid %d", pid
);
#endif /* SYS5_SIGNALS */
longjmp(select_intr
, sig
);
* This must be called with SIGCHLD disabled
void do_task_notify(P_void
)
* Keep taking the first item off the list and processing it.
* Done this way because the the callback can, quite reasonably,
* queue a new task, so no local reference into the list can be
while (FIRST(pjob
, &proc_list_head
) != HEAD(pjob
, &proc_list_head
)) {
pjob
*p
= FIRST(pjob
, &proc_list_head
);
* Do callback if it exists
(*p
->cb_fun
)(p
->w
.w_retcode
,
p
->w
.w_termsig
, p
->cb_closure
);