tprimes.c 798 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <thread.h>
  4. int quiet;
  5. int goal;
  6. int buffer;
  7. int (*fn)(void(*)(void*), void*, uint) = threadcreate;
  8. void
  9. primethread(void *arg)
  10. {
  11. Channel *c, *nc;
  12. int p, i;
  13. c = arg;
  14. p = recvul(c);
  15. if(p > goal)
  16. threadexitsall(nil);
  17. if(!quiet)
  18. print("%d\n", p);
  19. nc = chancreate(sizeof(ulong), buffer);
  20. (*fn)(primethread, nc, 1024);
  21. for(;;){
  22. i = recvul(c);
  23. if(i%p)
  24. sendul(nc, i);
  25. }
  26. }
  27. void
  28. threadmain(int argc, char **argv)
  29. {
  30. int i;
  31. Channel *c;
  32. ARGBEGIN{
  33. case 'q':
  34. quiet = 1;
  35. break;
  36. case 'b':
  37. buffer = atoi(ARGF());
  38. break;
  39. case 'p':
  40. fn=proccreate;
  41. break;
  42. }ARGEND
  43. if(argc>0)
  44. goal = atoi(argv[0]);
  45. else
  46. goal = 100;
  47. c = chancreate(sizeof(ulong), buffer);
  48. threadcreate(primethread, c, 1024);
  49. for(i=2;; i++)
  50. sendul(c, i);
  51. }