DOC ONLY: document VLIB_INIT_FUNCTION scheme

Change-Id: I15c4256621da6c8d47b1a7c41755ee6587996757
Signed-off-by: Dave Barach <dave@barachs.net>
This commit is contained in:
Dave Barach
2019-05-16 12:16:29 -04:00
committed by Florin Coras
parent f8d50682cd
commit 8fa01c17aa

View File

@ -15,10 +15,11 @@ Init function discovery
vlib applications register for various \[initialization\] events by vlib applications register for various \[initialization\] events by
placing structures and \_\_attribute\_\_((constructor)) functions into placing structures and \_\_attribute\_\_((constructor)) functions into
the image. At appropriate times, the vlib framework walks the image. At appropriate times, the vlib framework walks
constructor-generated singly-linked structure lists, calling the constructor-generated singly-linked structure lists, performs a
indicated functions. vlib applications create graph nodes, add CLI topological sort based on specified constraints, and calls the
functions, start cooperative multi-tasking threads, etc. etc. using this indicated functions. Vlib applications create graph nodes, add CLI
mechanism. functions, start cooperative multi-tasking threads, etc. etc. using
this mechanism.
vlib applications invariably include a number of VLIB\_INIT\_FUNCTION vlib applications invariably include a number of VLIB\_INIT\_FUNCTION
(my\_init\_function) macros. (my\_init\_function) macros.
@ -32,6 +33,50 @@ other libraries such as VNET. In the latter case, it may be necessary to
explicitly reference symbol(s) otherwise large portions of the library explicitly reference symbol(s) otherwise large portions of the library
may be AWOL at runtime. may be AWOL at runtime.
### Init function construction and constraint specification
It's easy to add an init function:
```
static clib_error_t *my_init_function (vlib_main_t *vm)
{
/* ... initialize things ... */
return 0; // or return clib_error_return (0, "BROKEN!");
}
VLIB_INIT_FUNCTION(my_init_function);
```
As given, my_init_function will be executed "at some point," but with
no ordering guarantees.
Specifying ordering constraints is easy:
```
VLIB_INIT_FUNCTION(my_init_function) =
{
.runs_before = VLIB_INITS("we_run_before_function_1",
"we_run_before_function_2"),
.runs_after = VLIB_INITS("we_run_after_function_1",
"we_run_after_function_2),
};
```
It's also easy to specify bulk ordering constraints of the form "a
then b then c then d":
```
VLIB_INIT_FUNCTION(my_init_function) =
{
.init_order = VLIB_INITS("a", "b", "c", "d"),
};
```
It's OK to specify all three sorts of ordering constraints for a
single init function, although it's hard to imagine why it would be
necessary.
Node Graph Initialization Node Graph Initialization
------------------------- -------------------------