1e66f31c5Sopenharmony_ci#include <stdio.h>
2e66f31c5Sopenharmony_ci#include <stdlib.h>
3e66f31c5Sopenharmony_ci#include <unistd.h>
4e66f31c5Sopenharmony_ci
5e66f31c5Sopenharmony_ci#include <uv.h>
6e66f31c5Sopenharmony_ci
7e66f31c5Sopenharmony_ci#define FIB_UNTIL 25
8e66f31c5Sopenharmony_ciuv_loop_t *loop;
9e66f31c5Sopenharmony_ciuv_work_t fib_reqs[FIB_UNTIL];
10e66f31c5Sopenharmony_ci
11e66f31c5Sopenharmony_cilong fib_(long t) {
12e66f31c5Sopenharmony_ci    if (t == 0 || t == 1)
13e66f31c5Sopenharmony_ci        return 1;
14e66f31c5Sopenharmony_ci    else
15e66f31c5Sopenharmony_ci        return fib_(t-1) + fib_(t-2);
16e66f31c5Sopenharmony_ci}
17e66f31c5Sopenharmony_ci
18e66f31c5Sopenharmony_civoid fib(uv_work_t *req) {
19e66f31c5Sopenharmony_ci    int n = *(int *) req->data;
20e66f31c5Sopenharmony_ci    if (random() % 2)
21e66f31c5Sopenharmony_ci        sleep(1);
22e66f31c5Sopenharmony_ci    else
23e66f31c5Sopenharmony_ci        sleep(3);
24e66f31c5Sopenharmony_ci    long fib = fib_(n);
25e66f31c5Sopenharmony_ci    fprintf(stderr, "%dth fibonacci is %lu\n", n, fib);
26e66f31c5Sopenharmony_ci}
27e66f31c5Sopenharmony_ci
28e66f31c5Sopenharmony_civoid after_fib(uv_work_t *req, int status) {
29e66f31c5Sopenharmony_ci    if (status == UV_ECANCELED)
30e66f31c5Sopenharmony_ci        fprintf(stderr, "Calculation of %d cancelled.\n", *(int *) req->data);
31e66f31c5Sopenharmony_ci}
32e66f31c5Sopenharmony_ci
33e66f31c5Sopenharmony_civoid signal_handler(uv_signal_t *req, int signum)
34e66f31c5Sopenharmony_ci{
35e66f31c5Sopenharmony_ci    printf("Signal received!\n");
36e66f31c5Sopenharmony_ci    int i;
37e66f31c5Sopenharmony_ci    for (i = 0; i < FIB_UNTIL; i++) {
38e66f31c5Sopenharmony_ci        uv_cancel((uv_req_t*) &fib_reqs[i]);
39e66f31c5Sopenharmony_ci    }
40e66f31c5Sopenharmony_ci    uv_signal_stop(req);
41e66f31c5Sopenharmony_ci}
42e66f31c5Sopenharmony_ci
43e66f31c5Sopenharmony_ciint main() {
44e66f31c5Sopenharmony_ci    loop = uv_default_loop();
45e66f31c5Sopenharmony_ci
46e66f31c5Sopenharmony_ci    int data[FIB_UNTIL];
47e66f31c5Sopenharmony_ci    int i;
48e66f31c5Sopenharmony_ci    for (i = 0; i < FIB_UNTIL; i++) {
49e66f31c5Sopenharmony_ci        data[i] = i;
50e66f31c5Sopenharmony_ci        fib_reqs[i].data = (void *) &data[i];
51e66f31c5Sopenharmony_ci        uv_queue_work(loop, &fib_reqs[i], fib, after_fib);
52e66f31c5Sopenharmony_ci    }
53e66f31c5Sopenharmony_ci
54e66f31c5Sopenharmony_ci    uv_signal_t sig;
55e66f31c5Sopenharmony_ci    uv_signal_init(loop, &sig);
56e66f31c5Sopenharmony_ci    uv_signal_start(&sig, signal_handler, SIGINT);
57e66f31c5Sopenharmony_ci
58e66f31c5Sopenharmony_ci    return uv_run(loop, UV_RUN_DEFAULT);
59e66f31c5Sopenharmony_ci}
60