shithub: 9ferno

ref: 670f4e90ee6028ffee399e5a96fb5e4cd72fc7bc

View raw version
implement Alarms;
include "sys.m";
	sys: Sys;

include "alarms.m";

Alarm.stop(a: self Alarm) 
{
	a.alchan <-= -1;
	fd:=sys->open("#p/"+string a.pid+"/ctl",sys->OWRITE);
	sys->fprint(fd, "killgrp");
}

Alarm.alarm(time: int): Alarm
{
	if (sys == nil)
		sys = load Sys Sys->PATH;

	pid := sys->pctl(sys->NEWPGRP|sys->FORKNS,nil);
	a:=Alarm(chan of int,pid);
	spawn listener(a.alchan);
	spawn sleeper(a.alchan,time,pid);
	return a;
}
	
sleeper(ch: chan of int, time, pid: int)
{
	sys->sleep(time);
	alt{
		ch <-= pid =>
			;
		* =>
			exit;
	}
}

listener(ch: chan of int)
{
	a := <-ch;
	if (a==-1)
		exit;
	fd := sys->open("#p/"+string a+"/ctl",sys->OWRITE);
	if (fd != nil)
		sys->fprint(fd, "killgrp");
}