|
|
1.1 root 1: /*ident "%W%" */
2: /**************************************************************************
3: Copyright (c) 1984 AT&T
4: All Rights Reserved
5:
6: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
7:
8: The copyright notice above does not evidence any
9: actual or intended publication of such source code.
10:
11: *****************************************************************************/
12: #include <task.h>
13:
14: object::~object()
15: {
16: if (o_link) task_error(E_OLINK, this);
17: if (o_next) task_error(E_ONEXT, this);
18: } /* delete */
19:
20: /* note that a task can be on a chain in several places
21: */
22:
23: /* object::remember() ... */
24:
25: void
26: object::forget(register task* p)
27: /* remove all occurrences of task* p from this object's task list */
28: {
29: register olink* ll;
30: register olink* l;
31:
32: if (o_link == 0) return;
33:
34: while (o_link->l_task == p) {
35: ll = o_link;
36: o_link = ll->l_next;
37: delete ll;
38: if (o_link == 0) return;
39: };
40:
41: l = o_link;
42: while (ll = l->l_next) {
43: if (ll->l_task == p) {
44: l->l_next = ll->l_next;
45: delete ll;
46: }
47: else l = ll;
48: };
49: }
50:
51:
52: /*
53: * prepare IDLE tasks on this object for scheduling
54: * also flush the remember chain
55: */
56: void
57: object::alert()
58: {
59: register olink* l;
60: register olink* ll;
61:
62: for (l=o_link; ll = l; l=l->l_next, delete ll) {
63: register task* p = l->l_task;
64: if (p->s_state == IDLE) p->insert(0,this);
65: }
66: o_link = 0;
67: }
68:
69: /*
70: * virtual int object::pending() returns 1 if the object should be waited for.
71: * By default say yes and assume that alert() will be called somehow.
72: */
73: int
74: object::pending()
75: {
76: return 1;
77: }
78:
79: /*
80: * object::print() is a virtual function. In each derived class,
81: * derived::print() will print the derived information,
82: * then call its immediate base::print(), with second argument non-zero.
83: * The original virtual call will have the second argument 0.
84: * The first arg is meant to be CHAIN, VERBOSE, or STACK, or several combined
85: * with | (e.g., CHAIN|STACK)
86: */
87: void
88: object::print(int n, int baseClass)
89: {
90: if (!baseClass)
91: printf("Unidentified object ");
92:
93: if (n&VERBOSE) {
94: olink* l;
95: printf("\tobject: this=%x\n", this);
96: if (!o_link)
97: printf("\tNo tasks remembered\n");
98: for (l=o_link; l; l=l->l_next) {
99: printf("\tNext task on this=%x remember chain is:\n",
100: this);
101: l->l_task->print(n & ~CHAIN);
102: }
103: }
104:
105: if (n&CHAIN) {
106: if (o_next) o_next->print(n);
107: }
108: printf("\n");
109: }
110:
111: #define macro_start static char* error_name[] = {
112: #define macro(num,name,string) string,
113: #define macro_end(last_name) };
114: task_error_messages
115: #undef macro_start
116: #undef macro
117: #undef macro_end
118:
119: static int in_error = 0;
120:
121: void
122: sched::_print_error(int n)
123: {
124:
125: register i = (n<1 || MAXERR<n) ? 0 : n;
126:
127: printf("\n\n***** task_error(%d) %s\n",n,error_name[i]);
128:
129: if (object::this_task()) {
130: printf("thistask: ");
131: thistask->print(VERBOSE|STACK);
132: }
133: if (sched::runchain) {
134: printf("runchain:\n");
135: sched::runchain->print(CHAIN);
136: }
137: } /* _print_error */
138:
139: // Obsolete version, remains for compatibility, use 2-argument static version
140: // instead
141: int
142: object::task_error(int n)
143: {
144: if (in_error)
145: exit(in_error);
146: else
147: in_error = n;
148:
149: if (error_fct) {
150: n = (*error_fct)(n,this);
151: if (n) exit(n);
152: }
153: else {
154: sched::_print_error(n);
155: exit(n);
156: }
157: in_error = 0;
158: return 0;
159: }
160: //The second, static, version of the task_error function is usable by
161: //both member functions and non-member functions.
162: int
163: object::task_error(int n, object* th)
164: {
165: if (in_error)
166: exit(in_error);
167: else
168: in_error = n;
169:
170: if (error_fct) {
171: n = (*error_fct)(n, th);
172: //th is really a "this" pointer for real
173: //objects, and is 0 for non-members
174: if (n) exit(n);
175: }
176: else {
177: sched::_print_error(n);
178: exit(n);
179: }
180: in_error = 0;
181: return 0;
182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.