1*37da2899SCharles.Forsythimplement Exception; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsythinclude "sys.m"; 4*37da2899SCharles.Forsyth sys: Sys; 5*37da2899SCharles.Forsythinclude "exception.m"; 6*37da2899SCharles.Forsyth 7*37da2899SCharles.Forsythgetexc(pid: int): (int, string, string) 8*37da2899SCharles.Forsyth{ 9*37da2899SCharles.Forsyth loadsys(); 10*37da2899SCharles.Forsyth if(pid < 0) 11*37da2899SCharles.Forsyth pid = sys->pctl(0, nil); 12*37da2899SCharles.Forsyth f := "/prog/"+string pid+"/exception"; 13*37da2899SCharles.Forsyth if((fd := sys->open(f, Sys->OREAD)) == nil) 14*37da2899SCharles.Forsyth return (0, nil, nil); 15*37da2899SCharles.Forsyth b := array[8192] of byte; 16*37da2899SCharles.Forsyth if((n := sys->read(fd, b, len b)) < 0) 17*37da2899SCharles.Forsyth return (0, nil, nil); 18*37da2899SCharles.Forsyth s := string b[0: n]; 19*37da2899SCharles.Forsyth if(s == nil) 20*37da2899SCharles.Forsyth return (0, nil, nil); 21*37da2899SCharles.Forsyth (m, l) := sys->tokenize(s, " "); 22*37da2899SCharles.Forsyth if(m < 3) 23*37da2899SCharles.Forsyth return (0, nil, nil); 24*37da2899SCharles.Forsyth pc := int hd l; l = tl l; 25*37da2899SCharles.Forsyth mod := hd l; l = tl l; 26*37da2899SCharles.Forsyth exc := hd l; l = tl l; 27*37da2899SCharles.Forsyth for( ; l != nil; l = tl l) 28*37da2899SCharles.Forsyth exc += " " + hd l; 29*37da2899SCharles.Forsyth return (pc, mod, exc); 30*37da2899SCharles.Forsyth} 31*37da2899SCharles.Forsyth 32*37da2899SCharles.Forsythsetexcmode(mode: int): int 33*37da2899SCharles.Forsyth{ 34*37da2899SCharles.Forsyth loadsys(); 35*37da2899SCharles.Forsyth pid := sys->pctl(0, nil); 36*37da2899SCharles.Forsyth f := "/prog/" + string pid + "/ctl"; 37*37da2899SCharles.Forsyth if(mode == NOTIFYLEADER) 38*37da2899SCharles.Forsyth return write(f, "exceptions notifyleader"); 39*37da2899SCharles.Forsyth else if(mode == PROPAGATE) 40*37da2899SCharles.Forsyth return write(f, "exceptions propagate"); 41*37da2899SCharles.Forsyth else 42*37da2899SCharles.Forsyth return -1; 43*37da2899SCharles.Forsyth} 44*37da2899SCharles.Forsyth 45*37da2899SCharles.Forsythloadsys() 46*37da2899SCharles.Forsyth{ 47*37da2899SCharles.Forsyth if(sys == nil) 48*37da2899SCharles.Forsyth sys = load Sys Sys->PATH; 49*37da2899SCharles.Forsyth} 50*37da2899SCharles.Forsyth 51*37da2899SCharles.Forsythwrite(f: string, s: string): int 52*37da2899SCharles.Forsyth{ 53*37da2899SCharles.Forsyth if((fd := sys->open(f, Sys->OWRITE)) == nil) 54*37da2899SCharles.Forsyth return -1; 55*37da2899SCharles.Forsyth b := array of byte s; 56*37da2899SCharles.Forsyth if((n := sys->write(fd, b, len b)) != len b) 57*37da2899SCharles.Forsyth return -1; 58*37da2899SCharles.Forsyth return 0; 59*37da2899SCharles.Forsyth} 60