#include #include #include #include #include #include #include #include #include #include #include iomux_t iom; int s[32]; atomic_int n; #define TRANSACTIONS 100000 int w(void* a) { (void)a; for (;;) { int64 s; unsigned int events; switch (iom_wait(&iom,&s,&events,1000)) { case -1: diesys(111,"iom_wait"); break; case 0: carp("iom_wait: timeout"); break; case 1: if (events&IOM_WRITE) { if (write(s,"salut!\n",7) != 7) diesys(111,"write"); if (iom_requeue(&iom,s,IOM_READ) == -1) diesys(111,"iom_requeue"); } else { char buf[100]; ssize_t r=read(s,buf,sizeof buf); if (r<=0 || atomic_fetch_add(&n,1) >= TRANSACTIONS) { close(s); return 0; } if (iom_requeue(&iom,s,IOM_WRITE) == -1) diesys(111,"iom_requeue"); } } } return 0; } int main(int argc,char* argv[]) { iom_init(&iom); for (unsigned int i=0; i1 && scan_uint(argv[1],&nthr)>0) { if (nthr>sizeof(t)/sizeof(t[0])) { char buf[FMT_LONG]; buf[fmt_ulong(buf,sizeof(t)/sizeof(t[0]))]=0; die(111,"max threads > ",buf); } } for (unsigned int i=0; i