|
|
1.1 root 1: #include "jerq.h"
2: #include "rcv.h"
3:
4: unsigned alarmtime, alarmstart;
5:
6: wait (resource)
7: {
8: int maxfd, smask, ret;
9: unsigned diff;
10: #ifdef BSD
11: struct timeval tv;
12: #endif BSD
13:
14: maxfd = displayfd + 1;
15: for(;;){
16: #ifdef SUNTOOLS
17: if (damagedone) {
18: fixdamage();
19: break;
20: }
21: #endif SUNTOOLS
22: if (alarmtime) {
23: diff = realtime() - alarmstart;
24: if (diff >= alarmtime) {
25: alarmtime = 0;
26: P->state |= ALARM;
27: } else {
28: alarmstart += diff;
29: alarmtime -= diff;
30: }
31: }
32: if(P->state & resource)
33: break;
34: #ifdef X11
35: if(XPending(dpy))
36: goto xin;
37: #endif X11
38: smask = (1 << displayfd);
39: if (!Jrcvbuf.blocked)
40: smask |= jerqrcvmask;
41: if (resource & CPU) {
42: #ifdef BSD
43: tv.tv_sec = 0;
44: tv.tv_usec = 0;
45: ret = select(maxfd, &smask, 0, 0, &tv);
46: #else /* V9 */
47: ret = select(maxfd, &smask, 0, 0);
48: #endif
49: if (ret == 0)
50: break;
51: } else if (alarmtime) {
52: #ifdef BSD
53: tv.tv_sec = alarmtime/60;
54: tv.tv_usec = (alarmtime%60) * 16666;
55: ret = select(maxfd, &smask, 0, 0, &tv);
56: #else /* V9 */
57: ret = select(maxfd, &smask, 0, alarmtime*17);
58: #endif
59: if (ret == 0) {
60: alarmtime = 0;
61: P->state |= ALARM;
62: continue;
63: }
64: } else {
65: #ifdef BSD
66: ret = select(maxfd, &smask, 0, 0, 0);
67: #else /* V9 */
68: ret = select(maxfd, &smask, 0, 0x6fffffff);
69: #endif
70: }
71: if (ret == -1)
72: continue;
73: if(smask & jerqrcvmask)
74: rcvfill();
75: if(smask & (1 << displayfd)){
76: xin:
77: handleinput();
78: if(resource & MOUSE) /* We always have the mouse */
79: break;
80: }
81: }
82: return resource & (P->state|MOUSE);
83: }
84:
85: nap (n)
86: int n;
87: {
88: wait(MOUSE);
89: }
90:
91: alarm(ticks)
92: {
93: alarmtime = ticks;
94: alarmstart = realtime();
95: P->state &= ~ALARM;
96: }
97:
98: sleep(ticks)
99: {
100: #ifdef BSD
101: int maxfd, smask, ret;
102: unsigned diff = 0, tleft;
103: struct timeval tv;
104: unsigned start = realtime();
105:
106: maxfd = displayfd + 1;
107: for(tleft = ticks; diff < tleft; ) {
108: tleft -= diff;
109: #ifdef X11
110: if(XPending(dpy))
111: goto xin;
112: #endif X11
113: damage:
114: #ifdef SUNTOOLS
115: if (damagedone) {
116: fixdamage();
117: return;
118: }
119: #endif SUNTOOLS
120: smask = (1 << displayfd);
121: if (!Jrcvbuf.blocked)
122: smask |= jerqrcvmask;
123: tv.tv_sec = tleft / 60;
124: tv.tv_usec = (tleft % 60) * 16666;
125: ret = select(maxfd, &smask, 0, 0, &tv);
126: if (ret == 0)
127: break;
128: if (ret == -1)
129: goto damage;
130: if(smask & jerqrcvmask)
131: rcvfill();
132: if(smask & (1 << displayfd)){
133: xin:
134: handleinput();
135: }
136: diff = realtime() - start;
137: start += diff;
138: }
139: if (alarmtime) {
140: if (ticks >= alarmtime) {
141: alarmtime = 0;
142: P->state |= ALARM;
143: } else {
144: alarmstart += ticks;
145: alarmtime -= ticks;
146: }
147: }
148: #else
149: wait(CPU);
150: #undef nap
151: nap(ticks);
152: wait(CPU);
153: if (alarmtime) {
154: int diff = realtime() - alarmstart;
155: if (diff >= alarmtime) {
156: alarmtime = 0;
157: P->state |= ALARM;
158: }
159: alarmstart += diff;
160: alarmtime -= diff;
161: }
162: #endif BSD
163: }
164:
165: #ifndef BSD
166: #include <sys/timeb.h>
167: #endif
168: realtime()
169: {
170: #ifdef BSD
171: struct timeval tv;
172: gettimeofday(&tv, 0);
173: return tv.tv_sec * 60 + (tv.tv_usec * 60 / 1000000);
174: #else
175: struct timeb tb;
176: ftime(&tb);
177: return tb.time * 60 + (tb.millitm * 60 / 1000);
178: #endif BSD
179: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.