#include #include #include Channel *cchan, *pchan; ulong iterations = 0; ulong misses = 0; enum { Parent, Child, }; int state = Parent; void child(void *unused) { char data = '1'; USED(unused); for (;;) { recv(cchan, &data); if (state == Parent) { ++iterations; state = Child; } else { ++misses; } send(pchan, &data); } } void threadmain(int argc, char **argv) { vlong tbegin, tend; double diff; char data = '1'; USED(argc, argv); cchan = chancreate(sizeof(char), 1); pchan = chancreate(sizeof(char), 1); threadcreate(child, nil, 1024); /* could be even smaller? */ tbegin = nsec(); while (iterations < 1000000) { send(cchan, &data); recv(pchan, &data); if (state == Child) { ++iterations; state = Parent; } else { ++misses; } } tend = nsec(); diff = (tend - tbegin)/1000000000.0; print("did %ld iterations in %f seconds\n",iterations,diff); print("%.0f iterations/second\n",(float)iterations/diff); print("%ld misses\n",misses); threadexitsall(nil); }