File:  [Research Unix] / researchv9 / jtools / src / sunlib / wait.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:59 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv9-SUN3_old, researchv9-SUN3, HEAD
researchv9-SUN3(old)

#include "jerq.h"
#include "rcv.h"

unsigned alarmtime, alarmstart;

wait (resource)
{
	int maxfd, smask, ret;
	unsigned diff;
#ifdef	BSD
	struct timeval tv;
#endif	BSD

	maxfd = displayfd + 1;
	for(;;){
#ifdef SUNTOOLS
		if (damagedone) {
			fixdamage();
			break;
		}
#endif SUNTOOLS
		if (alarmtime) {
			diff = realtime() - alarmstart;
			if (diff >= alarmtime) {
				alarmtime = 0;
				P->state |= ALARM;
			} else {
				alarmstart += diff;
				alarmtime -= diff;
			}
		}
		if(P->state & resource)
			break;
#ifdef X11
		if(XPending(dpy))
			goto xin;
#endif X11
		smask = (1 << displayfd);
		if (!Jrcvbuf.blocked)
			smask |= jerqrcvmask;
		if (resource & CPU) {
#ifdef	BSD
			tv.tv_sec = 0;
			tv.tv_usec = 0;
			ret = select(maxfd, &smask, 0, 0, &tv);
#else	/* V9 */
			ret = select(maxfd, &smask, 0, 0);
#endif
			if (ret == 0)
				break;
		} else if (alarmtime) {
#ifdef	BSD
			tv.tv_sec = alarmtime/60;
			tv.tv_usec = (alarmtime%60) * 16666;
			ret = select(maxfd, &smask, 0, 0, &tv);
#else	/* V9 */
			ret = select(maxfd, &smask, 0, alarmtime*17);
#endif
			if (ret == 0) {
				alarmtime = 0;
				P->state |= ALARM;
				continue;
			}
		} else {
#ifdef	BSD
			ret = select(maxfd, &smask, 0, 0, 0);
#else	/* V9 */
			ret = select(maxfd, &smask, 0, 0x6fffffff);
#endif
		}
		if (ret == -1)
			continue;
		if(smask & jerqrcvmask)
			rcvfill();
		if(smask & (1 << displayfd)){
xin:
			handleinput();
			if(resource & MOUSE) /* We always have the mouse */
				break;
		}
	}
	return resource & (P->state|MOUSE);
}

nap (n)
int n;
{
	wait(MOUSE);
}

alarm(ticks)
{
	alarmtime = ticks;
	alarmstart = realtime();
	P->state &= ~ALARM;
}

sleep(ticks)
{
#ifdef BSD
	int maxfd, smask, ret;
	unsigned diff = 0, tleft;
	struct timeval tv;
	unsigned start = realtime();

	maxfd = displayfd + 1;
	for(tleft = ticks; diff < tleft; ) {
		tleft -= diff;
#ifdef X11
		if(XPending(dpy))
			goto xin;
#endif X11
damage:
#ifdef SUNTOOLS
		if (damagedone) {
			fixdamage();
			return;
		}
#endif SUNTOOLS
		smask = (1 << displayfd);
		if (!Jrcvbuf.blocked)
			smask |= jerqrcvmask;
		tv.tv_sec = tleft / 60;
		tv.tv_usec = (tleft % 60) * 16666;
		ret = select(maxfd, &smask, 0, 0, &tv);
		if (ret == 0)
			break;
		if (ret == -1)
			goto damage;
		if(smask & jerqrcvmask)
			rcvfill();
		if(smask & (1 << displayfd)){
xin:
			handleinput();
		}
		diff = realtime() - start;
		start += diff;
	}
	if (alarmtime) {
		if (ticks >= alarmtime) {
			alarmtime = 0;
			P->state |= ALARM;
		} else {
			alarmstart += ticks;
			alarmtime -= ticks;
		}
	}
#else
	wait(CPU);
#undef nap
	nap(ticks);
	wait(CPU);
	if (alarmtime) {
		int diff = realtime() - alarmstart;
		if (diff >= alarmtime) {
				alarmtime = 0;
				P->state |= ALARM;
		}
		alarmstart += diff;
		alarmtime -= diff;
	}
#endif BSD
}

#ifndef BSD
#include <sys/timeb.h>
#endif
realtime()
{
#ifdef BSD
	struct timeval tv;
	gettimeofday(&tv, 0);
	return tv.tv_sec * 60 + (tv.tv_usec * 60 / 1000000);
#else
	struct timeb tb;
	ftime(&tb);
	return tb.time * 60 + (tb.millitm * 60 / 1000);
#endif BSD
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.