4 #include "threadimpl.h"
12 iointerrupt(Ioproc *io)
18 write(io->ctl, "interrupt", 9);
27 snprint(buf, sizeof(buf), "/proc/%lud/ctl", (ulong)getpid());
28 return open(buf, OWRITE|OCEXEC);
39 if(io = mallocz(sizeof(*io), 1)){
41 * open might fail, ignore it for programs like factotum
42 * that don't use iointerrupt() anyway.
44 io->ctl = openprocctl();
45 if((io->creply = chancreate(sizeof(void*), 0)) == nil){
53 while(send(c, &io) < 0)
59 while(recv(io->c, &r) < 0)
65 strcpy(r->err, "interrupted");
66 } else if((r->ret = r->op(&r->arg)) < 0)
67 rerrstr(r->err, sizeof r->err);
72 write(io->ctl, "nointerrupt", 11);
74 while(send(io->creply, &r) < 0)
92 if((c = chancreate(sizeof(void*), 0)) == nil)
93 sysfatal("ioproc chancreate");
94 proccreate(xioproc, c, STACK);
95 while(recv(c, &io) < 0)
98 sysfatal("ioproc alloc");
103 closeioproc(Ioproc *io)
108 while(sendp(io->c, nil) < 0)