xref: /third_party/libuv/docs/code/progress/main.c (revision e66f31c5)
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_ciuv_loop_t *loop;
8e66f31c5Sopenharmony_ciuv_async_t async;
9e66f31c5Sopenharmony_ci
10e66f31c5Sopenharmony_cidouble percentage;
11e66f31c5Sopenharmony_ci
12e66f31c5Sopenharmony_civoid fake_download(uv_work_t *req) {
13e66f31c5Sopenharmony_ci    int size = *((int*) req->data);
14e66f31c5Sopenharmony_ci    int downloaded = 0;
15e66f31c5Sopenharmony_ci    while (downloaded < size) {
16e66f31c5Sopenharmony_ci        percentage = downloaded*100.0/size;
17e66f31c5Sopenharmony_ci        async.data = (void*) &percentage;
18e66f31c5Sopenharmony_ci        uv_async_send(&async);
19e66f31c5Sopenharmony_ci
20e66f31c5Sopenharmony_ci        sleep(1);
21e66f31c5Sopenharmony_ci        downloaded += (200+random())%1000; // can only download max 1000bytes/sec,
22e66f31c5Sopenharmony_ci                                           // but at least a 200;
23e66f31c5Sopenharmony_ci    }
24e66f31c5Sopenharmony_ci}
25e66f31c5Sopenharmony_ci
26e66f31c5Sopenharmony_civoid after(uv_work_t *req, int status) {
27e66f31c5Sopenharmony_ci    fprintf(stderr, "Download complete\n");
28e66f31c5Sopenharmony_ci    uv_close((uv_handle_t*) &async, NULL);
29e66f31c5Sopenharmony_ci}
30e66f31c5Sopenharmony_ci
31e66f31c5Sopenharmony_civoid print_progress(uv_async_t *handle) {
32e66f31c5Sopenharmony_ci    double percentage = *((double*) handle->data);
33e66f31c5Sopenharmony_ci    fprintf(stderr, "Downloaded %.2f%%\n", percentage);
34e66f31c5Sopenharmony_ci}
35e66f31c5Sopenharmony_ci
36e66f31c5Sopenharmony_ciint main() {
37e66f31c5Sopenharmony_ci    loop = uv_default_loop();
38e66f31c5Sopenharmony_ci
39e66f31c5Sopenharmony_ci    uv_work_t req;
40e66f31c5Sopenharmony_ci    int size = 10240;
41e66f31c5Sopenharmony_ci    req.data = (void*) &size;
42e66f31c5Sopenharmony_ci
43e66f31c5Sopenharmony_ci    uv_async_init(loop, &async, print_progress);
44e66f31c5Sopenharmony_ci    uv_queue_work(loop, &req, fake_download, after);
45e66f31c5Sopenharmony_ci
46e66f31c5Sopenharmony_ci    return uv_run(loop, UV_RUN_DEFAULT);
47e66f31c5Sopenharmony_ci}
48