xref: /netbsd-src/external/mit/libuv/dist/docs/code/queue-work/main.c (revision 0e552da7216834a96e91ad098e59272b41087480)
1*0e552da7Schristos #include <stdio.h>
2*0e552da7Schristos #include <stdlib.h>
3*0e552da7Schristos #include <unistd.h>
4*0e552da7Schristos 
5*0e552da7Schristos #include <uv.h>
6*0e552da7Schristos 
7*0e552da7Schristos #define FIB_UNTIL 25
8*0e552da7Schristos uv_loop_t *loop;
9*0e552da7Schristos 
fib_(long t)10*0e552da7Schristos long fib_(long t) {
11*0e552da7Schristos     if (t == 0 || t == 1)
12*0e552da7Schristos         return 1;
13*0e552da7Schristos     else
14*0e552da7Schristos         return fib_(t-1) + fib_(t-2);
15*0e552da7Schristos }
16*0e552da7Schristos 
fib(uv_work_t * req)17*0e552da7Schristos void fib(uv_work_t *req) {
18*0e552da7Schristos     int n = *(int *) req->data;
19*0e552da7Schristos     if (random() % 2)
20*0e552da7Schristos         sleep(1);
21*0e552da7Schristos     else
22*0e552da7Schristos         sleep(3);
23*0e552da7Schristos     long fib = fib_(n);
24*0e552da7Schristos     fprintf(stderr, "%dth fibonacci is %lu\n", n, fib);
25*0e552da7Schristos }
26*0e552da7Schristos 
after_fib(uv_work_t * req,int status)27*0e552da7Schristos void after_fib(uv_work_t *req, int status) {
28*0e552da7Schristos     fprintf(stderr, "Done calculating %dth fibonacci\n", *(int *) req->data);
29*0e552da7Schristos }
30*0e552da7Schristos 
main()31*0e552da7Schristos int main() {
32*0e552da7Schristos     loop = uv_default_loop();
33*0e552da7Schristos 
34*0e552da7Schristos     int data[FIB_UNTIL];
35*0e552da7Schristos     uv_work_t req[FIB_UNTIL];
36*0e552da7Schristos     int i;
37*0e552da7Schristos     for (i = 0; i < FIB_UNTIL; i++) {
38*0e552da7Schristos         data[i] = i;
39*0e552da7Schristos         req[i].data = (void *) &data[i];
40*0e552da7Schristos         uv_queue_work(loop, &req[i], fib, after_fib);
41*0e552da7Schristos     }
42*0e552da7Schristos 
43*0e552da7Schristos     return uv_run(loop, UV_RUN_DEFAULT);
44*0e552da7Schristos }
45