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