|
|
1.1 root 1: #include "process.pub"
2: #include "frame.pri"
3: #include "symtab.pri"
4: #include "symbol.h"
5: #include "hostcore.h"
6: #include "asm.pri"
7: #include "format.pub"
8: #include "bpts.pri"
9: #include "master.pri"
10: SRCFILE("waitlist.c")
11:
12: const int STOPPED=0, RUNNING=1, EXITED=2, DIED=3;
13:
14: void WaitList::add(HostCore* h)
15: {
16: WaitMem *wm = new WaitMem;
17: wm->core = h;
18: wm->next = head;
19: wm->changed = 0;
20: head = wm;
21: }
22:
23: void WaitList::remove(HostCore* h)
24: {
25: WaitMem *p = 0, *n = head;
26: while (n && (n->core != h)) {
27: p = n;
28: n = p->next;
29: }
30: if (!n)
31: return;
32: if (!p)
33: head = n->next;
34: else
35: p->next = n->next;
36: delete n;
37: }
38:
39: int wait3(_wait*, int, int);
40: int wait(_wait*);
41:
42: int WaitList::wait(HostCore* h, int flags)
43: {
44: WaitMem *p = head;
45: while (p && (p->core != h))
46: p = p->next;
47: if (!p)
48: return 0;
49: // It may have already occured
50: if (p->changed) {
51: p->changed = 0;
52: out:
53: if (flags & WAIT_DISCARD)
54: return 1;
55: h->state = STOPPED;
56: if (WIFSTOPPED(p->status)) {
57: h->cursig = p->status.w_stopsig;
58: if (h->cursig == SIGTRAP && (flags & WAIT_PCFIX))
59: h->regpoke(h->REG_PC(), h->pc() - 2);
60: } else {
61: if (WIFSIGNALED(p->status)) {
62: h->state = DIED;
63: h->cursig = p->status.w_termsig;
64: } else {
65: h->state = EXITED;
66: h->cursig = p->status.w_retcode;
67: }
68: }
69: return 1;
70: }
71: // Must really wait for it
72: for(;;) {
73: int pid;
74: _wait tstat;
75: if (flags & WAIT_POLL) {
76: if ((pid = ::wait3(&tstat, WNOHANG, 0)) <= 0)
77: return 0;
78: } else {
79: if ((pid = ::wait(&tstat)) == -1)
80: return 0;
81: }
82: WaitMem *q = head;
83: for ( ; q; q = q->next)
84: if (q->core->pid == pid) {
85: q->status = tstat;
86: if (q == p)
87: goto out;
88: q->changed = 1;
89: break;
90: }
91: }
92: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.