blob: 5f1b9666fee51817c443387394c039c6719166e2 [file] [log] [blame] [view] [edit]
# libasync-loop and libasync-loop-cpp
This library provides a general-purpose thread-safe message loop
implementation declared in [async-loop/loop.h](include/lib/async-loop/loop.h).
It must be statically linked into clients that want to use this particular
message loop implementation. Note that clients can implement their own
asynchronous dispatchers instead if they have more specialized needs.
## Libraries
- `libasync-loop.a` provides the loop implementation itself as declared in
the following headers:
- [async-loop/loop.h](include/lib/async-loop/loop.h)
- `libasync-loop-cpp.a` provides C++ wrappers:
- [async-loop/cpp/loop.h](include/lib/async-loop/cpp/loop.h)
## Using the message loop
`libasync-loop.a` provides a general-purpose thread-safe message loop
implementation of an asynchronous dispatcher which you can use out of box
unless you need something more specialized.
See [async-loop/loop.h](include/lib/async-loop/loop.h) for details.
```c
#include <lib/async-loop/default.h>
#include <lib/async-loop/loop.h>
#include <lib/async/task.h> // for async_post_task()
#include <lib/async/time.h> // for async_now()
#include <lib/async/default.h> // for async_get_default_dispatcher()
static async_loop_t* g_loop;
int main(int argc, char** argv) {
async_loop_create(&kAsyncLoopConfigAttachToCurrentThread, &g_loop);
do_stuff();
async_loop_run(g_loop, ZX_TIME_INFINITE, false);
async_loop_destroy(g_loop);
return 0;
}
void handler(async_dispatcher_t* async, async_task_t* task, zx_status_t status) {
printf("task deadline elapsed: status=%d", status);
free(task);
// This example doesn't have much to do, so just quit here.
async_loop_quit(g_loop);
}
zx_status_t do_stuff() {
async_dispatcher_t* async = async_get_default_dispatcher();
async_task_t* task = calloc(1, sizeof(async_task_t));
task->handler = handler;
task->deadline = async_now(async) + ZX_SEC(2);
return async_post_task(async, task);
}
```
## Setting as the default async dispatcher
If the `make_default_for_current_thread` configuration option is set to true
and `libasync-default.so` is linked into the executable, the message loop
will automatically register itself as the default dispatcher for the thread on
which it is created.
New threads started with `async_loop_start_thread()` will automatically have
their default dispatcher set to the message loop regardless of the value of
`make_default_for_current_thread`.