Finalize example program and write corresponding text for it in the tutorial.
[charm.git] / doc / converse / code / cth-tutorial / pgm.C
1 #include <stdio.h>
2 #include "converse.h"
3
4 #define HIGH_PRIO 0
5 #define LOW_PRIO 1
6 #define NUM_YIELD 10
7
8 int endCounter = 0;
9
10 //determine completion based on threads calling it
11 void threadDone() {
12   endCounter++;
13   if (endCounter == 2) CsdExitScheduler();
14 }
15
16 //worker function for worker1, yields with a low priority
17 void worker1Work(void* msg) {
18   printf("start worker1\n");
19   CthYield();
20   printf("worker1 resumed first time\n");
21   unsigned int prio  = LOW_PRIO;
22   for(int i = 0; i < NUM_YIELD; i++) {
23     CthYieldPrio(CQS_QUEUEING_IFIFO,0,&prio);
24     printf("worker1 resumed %dth time\n",i);
25   }
26   threadDone();
27 }
28
29 //worker function for worker2, yields with a high priority
30 void worker2Work(void* msg) {
31   printf("start worker2\n");
32   CthYield();
33   printf("worker2 resumed first time\n");
34   unsigned int prio  = HIGH_PRIO;
35   for(int i = 0; i < NUM_YIELD; i++) {
36     CthYieldPrio(CQS_QUEUEING_IFIFO,0,&prio);
37     printf("worker2 resumed %dth time\n",i);
38   }
39   threadDone();
40 }
41
42 //create two worker threads and push them on scheduler Q
43 void initThreads(int argc, char* argv[]) {
44   printf("called initThreads\n");
45   CthThread worker1 = CthCreateMigratable((CthVoidFn)worker1Work, 0, 160000);
46   CthThread worker2 = CthCreateMigratable((CthVoidFn)worker2Work, 0, 160000);
47   CthAwaken(worker1); CthAwaken(worker2);
48 }
49
50 int main(int argc, char* argv[]) {
51   ConverseInit(argc, argv, initThreads, 0, 0);
52 }