1*37da2899SCharles.Forsythimplement Wait; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsyth# 4*37da2899SCharles.Forsyth# Copyright © 2003 Vita Nuova Holdings Limited. All rights reserved. 5*37da2899SCharles.Forsyth# 6*37da2899SCharles.Forsyth 7*37da2899SCharles.Forsythinclude "sys.m"; 8*37da2899SCharles.Forsyth sys: Sys; 9*37da2899SCharles.Forsyth 10*37da2899SCharles.Forsythinclude "wait.m"; 11*37da2899SCharles.Forsyth 12*37da2899SCharles.Forsythinit() 13*37da2899SCharles.Forsyth{ 14*37da2899SCharles.Forsyth sys = load Sys Sys->PATH; 15*37da2899SCharles.Forsyth} 16*37da2899SCharles.Forsyth 17*37da2899SCharles.Forsythread(fd: ref Sys->FD): (int, string, string) 18*37da2899SCharles.Forsyth{ 19*37da2899SCharles.Forsyth buf := array[2*Sys->WAITLEN] of byte; 20*37da2899SCharles.Forsyth n := sys->read(fd, buf, len buf); 21*37da2899SCharles.Forsyth if(n <= 0) 22*37da2899SCharles.Forsyth return (n, nil, sys->sprint("%r")); 23*37da2899SCharles.Forsyth return parse(string buf[0:n]); 24*37da2899SCharles.Forsyth} 25*37da2899SCharles.Forsyth 26*37da2899SCharles.Forsythmonitor(fd: ref Sys->FD): (int, chan of (int, string, string)) 27*37da2899SCharles.Forsyth{ 28*37da2899SCharles.Forsyth pid := chan of int; 29*37da2899SCharles.Forsyth out := chan of (int, string, string); 30*37da2899SCharles.Forsyth spawn waitreader(fd, pid, out); 31*37da2899SCharles.Forsyth return (<-pid, out); 32*37da2899SCharles.Forsyth} 33*37da2899SCharles.Forsyth 34*37da2899SCharles.Forsythwaitreader(fd: ref Sys->FD, pid: chan of int, out: chan of (int, string, string)) 35*37da2899SCharles.Forsyth{ 36*37da2899SCharles.Forsyth pid <-= sys->pctl(0, nil); 37*37da2899SCharles.Forsyth for(;;){ 38*37da2899SCharles.Forsyth (child, modname, status) := read(fd); 39*37da2899SCharles.Forsyth out <-= (child, modname, status); 40*37da2899SCharles.Forsyth if(child <= 0) 41*37da2899SCharles.Forsyth break; # exit on error 42*37da2899SCharles.Forsyth } 43*37da2899SCharles.Forsyth} 44*37da2899SCharles.Forsyth 45*37da2899SCharles.Forsythparse(status: string): (int, string, string) 46*37da2899SCharles.Forsyth{ 47*37da2899SCharles.Forsyth for (i := 0; i < len status; i++) 48*37da2899SCharles.Forsyth if (status[i] == ' ') 49*37da2899SCharles.Forsyth break; 50*37da2899SCharles.Forsyth j := i+2; # skip space and " 51*37da2899SCharles.Forsyth for (i = j; i < len status; i++) 52*37da2899SCharles.Forsyth if (status[i] == '"') 53*37da2899SCharles.Forsyth break; 54*37da2899SCharles.Forsyth return (int status, status[j:i], status[i+2:]); 55*37da2899SCharles.Forsyth} 56