DOC ONLY: document VLIB_INIT_FUNCTION scheme
Change-Id: I15c4256621da6c8d47b1a7c41755ee6587996757 Signed-off-by: Dave Barach <dave@barachs.net>
This commit is contained in:

committed by
Florin Coras

parent
f8d50682cd
commit
8fa01c17aa
@ -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
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user