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_ci
10e66f31c5Sopenharmony_cilong fib_(long t) {
11e66f31c5Sopenharmony_ci    if (t == 0 || t == 1)
12e66f31c5Sopenharmony_ci        return 1;
13e66f31c5Sopenharmony_ci    else
14e66f31c5Sopenharmony_ci        return fib_(t-1) + fib_(t-2);
15e66f31c5Sopenharmony_ci}
16e66f31c5Sopenharmony_ci
17e66f31c5Sopenharmony_civoid fib(uv_work_t *req) {
18e66f31c5Sopenharmony_ci    int n = *(int *) req->data;
19e66f31c5Sopenharmony_ci    if (random() % 2)
20e66f31c5Sopenharmony_ci        sleep(1);
21e66f31c5Sopenharmony_ci    else
22e66f31c5Sopenharmony_ci        sleep(3);
23e66f31c5Sopenharmony_ci    long fib = fib_(n);
24e66f31c5Sopenharmony_ci    fprintf(stderr, "%dth fibonacci is %lu\n", n, fib);
25e66f31c5Sopenharmony_ci}
26e66f31c5Sopenharmony_ci
27e66f31c5Sopenharmony_civoid after_fib(uv_work_t *req, int status) {
28e66f31c5Sopenharmony_ci    fprintf(stderr, "Done calculating %dth fibonacci\n", *(int *) req->data);
29e66f31c5Sopenharmony_ci}
30e66f31c5Sopenharmony_ci
31e66f31c5Sopenharmony_ciint main() {
32e66f31c5Sopenharmony_ci    loop = uv_default_loop();
33e66f31c5Sopenharmony_ci
34e66f31c5Sopenharmony_ci    int data[FIB_UNTIL];
35e66f31c5Sopenharmony_ci    uv_work_t req[FIB_UNTIL];
36e66f31c5Sopenharmony_ci    int i;
37e66f31c5Sopenharmony_ci    for (i = 0; i < FIB_UNTIL; i++) {
38e66f31c5Sopenharmony_ci        data[i] = i;
39e66f31c5Sopenharmony_ci        req[i].data = (void *) &data[i];
40e66f31c5Sopenharmony_ci        uv_queue_work(loop, &req[i], fib, after_fib);
41e66f31c5Sopenharmony_ci    }
42e66f31c5Sopenharmony_ci
43e66f31c5Sopenharmony_ci    return uv_run(loop, UV_RUN_DEFAULT);
44e66f31c5Sopenharmony_ci}
45