12
12
#include <stdlib.h>
13
13
#include <signal.h>
15
static struct list * complete_list = 0;
15
static struct list *complete_list = 0;
17
static void alarm_handler( int sig )
17
static void alarm_handler(int sig)
19
19
// do nothing except interrupt the wait
22
static int process_work( int timeout )
22
static int process_work(int timeout)
24
24
void *old_handler = 0;
31
old_handler = signal(SIGALRM,alarm_handler);
31
old_handler = signal(SIGALRM, alarm_handler);
35
35
struct process_info p;
37
p.pid = wait4(-1,&p.status,flags,&p.rusage);
38
if(p.pid<=0) return 0;
37
p.pid = wait4(-1, &p.status, flags, &p.rusage);
39
signal(SIGALRM, old_handler);
40
43
struct process_info *i = malloc(sizeof(*i));
43
list_push_tail(complete_list,i);
46
list_push_tail(complete_list, i);
48
struct process_info * process_wait( int timeout )
51
struct process_info *process_wait(int timeout)
50
53
struct process_info *p;
52
if(!complete_list) complete_list = list_create();
56
complete_list = list_create();
54
58
p = list_pop_head(complete_list);
57
62
process_work(timeout);
59
64
return list_pop_head(complete_list);
62
void process_putback( struct process_info *p )
67
void process_putback(struct process_info *p)
64
if(!complete_list) complete_list = list_create();
70
complete_list = list_create();
66
list_push_tail(complete_list,p);
72
list_push_tail(complete_list, p);
69
75
int process_pending()
71
if(!complete_list) complete_list = list_create();
78
complete_list = list_create();
73
if(list_size(complete_list)>0) return 1;
80
if(list_size(complete_list) > 0)
75
83
return process_work(0);