#include #include #include #include "girzu.h" void usage(void) { fprint(2, "usage: %s\n", argv0); threadexitsall("usage"); } WaitGroup wg; Channel *data; Channel *cancel; void eclose(Channel *c) { assert(sendul(c, 0) == 1); assert(chanclose(c) >= 0); } void proc(void*) { ulong i; int rv; while((rv = recv(data, &i)) == 1){ fprint(2, "proc: recv %lud\n", i); if(i == 5) eclose(cancel); } print("proc: exited rv=%d %d %d\n", rv, chanclosing(data), chanclosing(cancel)); wgdone(&wg); } void threadmain(int argc, char *argv[]) { ulong v; int rv; ARGBEGIN{ default: usage(); }ARGEND v = 0; data = chancreate(sizeof(ulong), 0); cancel = chancreate(sizeof(ulong), 0); Alt a[] = { [0] { data, &v, CHANSND }, [1] { cancel, nil, CHANRCV }, [2] { nil, nil, CHANEND }, }; wginit(&wg, 1); threadcreate(proc, 0, 8192); for(;;){ rv = alt(a); print("alt = %d\n", rv); switch(rv){ case -1: sysfatal("alt: %r"); case 0: v++; break; case 1: print("cancel %s\n", a[1].err); chanclose(data); a[0].op = CHANNOP; a[1].op = CHANNOP; a[2].op = CHANNOBLK; break; case 2: goto fin; } } fin: wgwait(&wg); chanfree(data); chanfree(cancel); threadexitsall(nil); }