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