|
|
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.