xref: /netbsd-src/external/mit/libuv/dist/docs/code/queue-cancel/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 uv_work_t fib_reqs[FIB_UNTIL];
10*0e552da7Schristos 
fib_(long t)11*0e552da7Schristos long fib_(long t) {
12*0e552da7Schristos     if (t == 0 || t == 1)
13*0e552da7Schristos         return 1;
14*0e552da7Schristos     else
15*0e552da7Schristos         return fib_(t-1) + fib_(t-2);
16*0e552da7Schristos }
17*0e552da7Schristos 
fib(uv_work_t * req)18*0e552da7Schristos void fib(uv_work_t *req) {
19*0e552da7Schristos     int n = *(int *) req->data;
20*0e552da7Schristos     if (random() % 2)
21*0e552da7Schristos         sleep(1);
22*0e552da7Schristos     else
23*0e552da7Schristos         sleep(3);
24*0e552da7Schristos     long fib = fib_(n);
25*0e552da7Schristos     fprintf(stderr, "%dth fibonacci is %lu\n", n, fib);
26*0e552da7Schristos }
27*0e552da7Schristos 
after_fib(uv_work_t * req,int status)28*0e552da7Schristos void after_fib(uv_work_t *req, int status) {
29*0e552da7Schristos     if (status == UV_ECANCELED)
30*0e552da7Schristos         fprintf(stderr, "Calculation of %d cancelled.\n", *(int *) req->data);
31*0e552da7Schristos }
32*0e552da7Schristos 
signal_handler(uv_signal_t * req,int signum)33*0e552da7Schristos void signal_handler(uv_signal_t *req, int signum)
34*0e552da7Schristos {
35*0e552da7Schristos     printf("Signal received!\n");
36*0e552da7Schristos     int i;
37*0e552da7Schristos     for (i = 0; i < FIB_UNTIL; i++) {
38*0e552da7Schristos         uv_cancel((uv_req_t*) &fib_reqs[i]);
39*0e552da7Schristos     }
40*0e552da7Schristos     uv_signal_stop(req);
41*0e552da7Schristos }
42*0e552da7Schristos 
main()43*0e552da7Schristos int main() {
44*0e552da7Schristos     loop = uv_default_loop();
45*0e552da7Schristos 
46*0e552da7Schristos     int data[FIB_UNTIL];
47*0e552da7Schristos     int i;
48*0e552da7Schristos     for (i = 0; i < FIB_UNTIL; i++) {
49*0e552da7Schristos         data[i] = i;
50*0e552da7Schristos         fib_reqs[i].data = (void *) &data[i];
51*0e552da7Schristos         uv_queue_work(loop, &fib_reqs[i], fib, after_fib);
52*0e552da7Schristos     }
53*0e552da7Schristos 
54*0e552da7Schristos     uv_signal_t sig;
55*0e552da7Schristos     uv_signal_init(loop, &sig);
56*0e552da7Schristos     uv_signal_start(&sig, signal_handler, SIGINT);
57*0e552da7Schristos 
58*0e552da7Schristos     return uv_run(loop, UV_RUN_DEFAULT);
59*0e552da7Schristos }
60