The FreeRADIUS server
$Id: 15bac2a4c627c01d1aa2047687b3418955ac7f00 $
|
Private interpreter structures and functions. More...
#include <freeradius-devel/server/cf_util.h>
#include <freeradius-devel/server/map_proc.h>
#include <freeradius-devel/server/modpriv.h>
#include <freeradius-devel/util/debug.h>
#include <freeradius-devel/unlang/base.h>
#include <freeradius-devel/io/listen.h>
Go to the source code of this file.
Data Structures | |
struct | unlang_ext_t |
Describes how to allocate an unlang_group_t with additional memory keyword specific data. More... | |
struct | unlang_group_t |
Generic representation of a grouping. More... | |
struct | unlang_op_t |
An unlang operation. More... | |
struct | unlang_retry_t |
struct | unlang_s |
A node in a graph of unlang_op_t (s) that we execute. More... | |
struct | unlang_stack_frame_s |
Our interpreter stack, as distinct from the C stack. More... | |
struct | unlang_stack_t |
An unlang stack associated with a request. More... | |
struct | unlang_thread_t |
struct | unlang_tmpl_t |
A naked xlat. More... | |
struct | unlang_variable_t |
Macros | |
#define | MOD_NUM_TYPES (UNLANG_TYPE_XLAT + 1) |
#define | UNLANG_DETACHABLE (true) |
#define | unlang_frame_perf_cleanup(_x) |
#define | unlang_frame_perf_init(_x) |
#define | unlang_frame_perf_resume(_x) |
#define | unlang_frame_perf_yield(_x) |
#define | UNLANG_NEXT_SIBLING (true) |
#define | UNLANG_NEXT_STOP (false) |
#define | UNLANG_NORMAL_CHILD (false) |
#define | UNWIND_FLAG_BREAK_POINT 0x04 |
'break' stops here. More... | |
#define | UNWIND_FLAG_NO_CLEAR 0x10 |
Keep unwinding, don't clear the unwind flag. More... | |
#define | UNWIND_FLAG_NONE 0x00 |
No flags. More... | |
#define | UNWIND_FLAG_REPEAT 0x01 |
Repeat the frame on the way up the stack. More... | |
#define | UNWIND_FLAG_RETURN_POINT 0x08 |
'return' stops here. More... | |
#define | UNWIND_FLAG_TOP_FRAME 0x02 |
are we the top frame of the stack? More... | |
#define | UNWIND_FLAG_YIELDED 0x20 |
frame has yielded More... | |
Typedefs | |
typedef void(* | unlang_dump_t) (request_t *request, unlang_stack_frame_t *frame) |
Custom callback for dumping information about frame state. More... | |
typedef unlang_action_t(* | unlang_process_t) (rlm_rcode_t *p_result, request_t *request, unlang_stack_frame_t *frame) |
Function to call when interpreting a frame. More... | |
typedef void(* | unlang_signal_t) (request_t *request, unlang_stack_frame_t *frame, fr_signal_t action) |
Function to call if the request was signalled. More... | |
typedef struct unlang_stack_frame_s | unlang_stack_frame_t |
typedef struct unlang_s | unlang_t |
typedef int(* | unlang_thread_instantiate_t) (unlang_t const *instruction, void *thread_inst) |
Enumerations | |
enum | unlang_frame_action_t { UNLANG_FRAME_ACTION_POP = 1 , UNLANG_FRAME_ACTION_RETRY , UNLANG_FRAME_ACTION_NEXT , UNLANG_FRAME_ACTION_YIELD } |
Allows the frame evaluator to signal the interpreter. More... | |
enum | unlang_type_t { UNLANG_TYPE_NULL = 0 , UNLANG_TYPE_MODULE = 1 , UNLANG_TYPE_FUNCTION , UNLANG_TYPE_GROUP , UNLANG_TYPE_REDUNDANT , UNLANG_TYPE_LOAD_BALANCE , UNLANG_TYPE_REDUNDANT_LOAD_BALANCE , UNLANG_TYPE_PARALLEL , UNLANG_TYPE_IF , UNLANG_TYPE_ELSE , UNLANG_TYPE_ELSIF , UNLANG_TYPE_UPDATE , UNLANG_TYPE_SWITCH , UNLANG_TYPE_CASE , UNLANG_TYPE_FOREACH , UNLANG_TYPE_BREAK , UNLANG_TYPE_RETURN , UNLANG_TYPE_MAP , UNLANG_TYPE_SUBREQUEST , UNLANG_TYPE_DETACH , UNLANG_TYPE_CALL , UNLANG_TYPE_CALLER , UNLANG_TYPE_TIMEOUT , UNLANG_TYPE_LIMIT , UNLANG_TYPE_TRANSACTION , UNLANG_TYPE_TRY , UNLANG_TYPE_CATCH , UNLANG_TYPE_POLICY , UNLANG_TYPE_XLAT , UNLANG_TYPE_TMPL , UNLANG_TYPE_EDIT , UNLANG_TYPE_MAX } |
Types of unlang_t nodes. More... | |
Variables | |
fr_table_num_sorted_t const | mod_rcode_table [] |
size_t | mod_rcode_table_len |
unlang_op_t | unlang_ops [] |
Different operations the interpreter can execute. More... | |
Conversion functions for converting #unlang_t to its specialisations | |
Simple conversions: unlang_module_t and unlang_group_t are subclasses of unlang_t, so we often want to go back and forth between them. | |
static unlang_group_t * | unlang_generic_to_group (unlang_t const *p) |
static unlang_tmpl_t * | unlang_generic_to_tmpl (unlang_t const *p) |
static unlang_t * | unlang_group_to_generic (unlang_group_t const *p) |
static unlang_t * | unlang_tmpl_to_generic (unlang_tmpl_t const *p) |
Internal interpreter functions needed by ops | |
int | unlang_interpret_push (request_t *request, unlang_t const *instruction, rlm_rcode_t default_rcode, bool do_next_sibling, bool top_frame) |
Push a new frame onto the stack. More... | |
unlang_action_t | unlang_interpret_push_children (rlm_rcode_t *p_result, request_t *request, rlm_rcode_t default_rcode, bool do_next_sibling) |
Push the children of the current frame onto a new frame onto the stack. More... | |
void | unlang_op_free (void) |
int | unlang_op_init (void) |
io shims | |
Functions to simulate a 'proto' module when we're running 'fake' requests. i.e. those created by parallel and subrequest. | |
request_t * | unlang_io_subrequest_alloc (request_t *parent, fr_dict_t const *namespace, bool detachable) |
Allocate a child request based on the parent. More... | |
op init functions | |
Functions to trigger registration of the various unlang ops. | |
void | unlang_call_init (void) |
void | unlang_caller_init (void) |
void | unlang_catch_init (void) |
void | unlang_condition_init (void) |
void | unlang_detach_init (void) |
Initialise subrequest ops. More... | |
void | unlang_edit_init (void) |
void | unlang_foreach_init (TALLOC_CTX *ctx) |
void | unlang_function_init (void) |
void | unlang_group_init (void) |
void | unlang_limit_init (void) |
void | unlang_load_balance_init (void) |
void | unlang_map_init (void) |
void | unlang_module_init (void) |
void | unlang_parallel_init (void) |
void | unlang_register (int type, unlang_op_t *op) |
Register an operation with the interpreter. More... | |
void | unlang_return_init (void) |
void | unlang_subrequest_op_free (void) |
int | unlang_subrequest_op_init (void) |
Initialise subrequest ops. More... | |
void | unlang_switch_init (void) |
void | unlang_timeout_init (void) |
void | unlang_tmpl_init (void) |
void | unlang_transaction_init (void) |
void | unlang_try_init (void) |
Private interpreter structures and functions.
Definition in file unlang_priv.h.
struct unlang_ext_t |
Describes how to allocate an unlang_group_t with additional memory keyword specific data.
Definition at line 127 of file unlang_priv.h.
Data Fields | ||
---|---|---|
size_t | len | Total length of the unlang_group_t + specialisation struct. |
unsigned | pool_headers | How much additional space to allocate for chunk headers. |
size_t | pool_len | How much additional space to allocate for extensions. |
unlang_type_t | type | Keyword. |
char const * | type_name | Talloc type name. |
struct unlang_group_t |
Generic representation of a grouping.
Can represent IF statements, maps, update sections etc...
Definition at line 145 of file unlang_priv.h.
Data Fields | ||
---|---|---|
unlang_t * | children |
Children beneath this group. The body of an if section for example. |
CONF_SECTION * | cs | |
int | num_children | |
unlang_t | self | |
unlang_t ** | tail | pointer to the tail which gets updated |
unlang_variable_t * | variables | rarely used, so we don't usually need it |
struct unlang_op_t |
An unlang operation.
These are like the opcodes in other interpreters. Each operation, when executed will return an unlang_action_t, which determines what the interpreter does next.
Definition at line 204 of file unlang_priv.h.
Data Fields | ||
---|---|---|
bool | debug_braces | Whether the operation needs to print braces in debug mode. |
unlang_dump_t | dump | Dump additional information about the frame state. |
size_t | frame_state_pool_objects | How many sub-allocations we expect. |
size_t | frame_state_pool_size | The total size of the pool to alloc. |
size_t | frame_state_size | size of instance data in the stack frame |
char const * | frame_state_type | talloc name of the frame instance data |
unlang_process_t | interpret | Function to interpret the keyword. |
char const * | name | Name of the operation. |
bool | rcode_set | Set request->rcode to the result of this operation. |
unlang_signal_t | signal | Function to signal stop / dup / whatever. |
size_t | thread_inst_size | |
char const * | thread_inst_type | |
unlang_thread_instantiate_t | thread_instantiate | per-thread instantiation function |
struct unlang_retry_t |
Definition at line 259 of file unlang_priv.h.
Data Fields | ||
---|---|---|
uint32_t | count | |
int | depth | of this retry structure |
fr_event_timer_t const * | ev | |
request_t * | request | |
fr_retry_state_t | state | |
fr_time_t | timeout |
struct unlang_s |
A node in a graph of unlang_op_t (s) that we execute.
The interpreter acts like a turing machine, with unlang_t nodes forming the tape and the unlang_action_t the instructions.
This is the parent 'class' for multiple unlang_t node specialisations. The unlang_t struct is listed first in the specialisation so that we can cast between parent/child classes without knowledge of the layout of the structures.
The specialisations of the nodes describe additional details of the operation to be performed.
Definition at line 112 of file unlang_priv.h.
Data Fields | ||
---|---|---|
unlang_mod_actions_t | actions | Priorities, etc. for the various return codes. |
CONF_ITEM * | ci | used to generate this item |
bool | closed | whether or not this section is closed to new statements |
char const * | debug_name | Printed in log messages when the node is executed. |
char const * | name | Unknown... |
unlang_t * | next | Next node (executed on UNLANG_ACTION_EXECUTE_NEXT et al). |
unsigned int | number | unique node number |
unlang_t * | parent | Previous node. |
unlang_type_t | type | The specialisation of this node. |
struct unlang_stack_frame_s |
Our interpreter stack, as distinct from the C stack.
We don't call the modules recursively. Instead we iterate over a list of unlang_t and and manage the call stack ourselves.
After looking at various green thread implementations, it was decided that using the existing unlang interpreter stack was the best way to perform async I/O.
Each request as an unlang interpreter stack associated with it, which represents its progress through the server. Because the interpreter stack is distinct from the C stack, we can have a single system thread with many thousands of pending requests.
Definition at line 280 of file unlang_priv.h.
Data Fields | ||
---|---|---|
unlang_t const * | instruction | The unlang node we're evaluating. |
unlang_t const * | next | The next unlang node we will evaluate. |
int | priority |
Result priority. When we pop this stack frame this priority will be compared with the one of the frame lower in the stack to determine if the result stored in the lower stack frame should |
unlang_process_t | process | function to call for interpreting this stack frame |
rlm_rcode_t | result | The result from executing the instruction. |
unlang_retry_t * | retry | if the frame is being retried. |
unlang_signal_t | signal | function to call when signalling this stack frame |
void * | state |
Stack frame specialisations. These store extra (mutable) state data, for the immutable (unlang_t) instruction. Instructions can't be used to store data because they might be shared between multiple threads. Which stack_entry specialisation to use is determined by the instruction->type. |
uint8_t | uflags | Unwind markers. |
struct unlang_stack_t |
An unlang stack associated with a request.
Definition at line 314 of file unlang_priv.h.
Data Fields | ||
---|---|---|
int | depth | Current depth we're executing at. |
unlang_stack_frame_t | frame[UNLANG_STACK_MAX] | The stack... |
unlang_interpret_t * | intp | Interpreter that the request is currently associated with. |
int | priority | Current priority. |
rlm_rcode_t | result | The current stack rcode. |
uint8_t | unwind |
Unwind to this frame if it exists. This is used for break and return. |
struct unlang_thread_t |
Definition at line 232 of file unlang_priv.h.
Data Fields | ||
---|---|---|
unlang_t const * | instruction | instruction which we're executing |
void * | thread_inst | thread-specific instance data |
struct unlang_tmpl_t |
A naked xlat.
Definition at line 160 of file unlang_priv.h.
Data Fields | ||
---|---|---|
unlang_t | self | |
tmpl_t const * | tmpl |
struct unlang_variable_t |
Definition at line 135 of file unlang_priv.h.
Data Fields | ||
---|---|---|
fr_dict_t * | dict | our dictionary |
int | max_attr | 1..N local attributes have been defined |
fr_dict_attr_t const * | root | the root of our dictionary |
#define MOD_NUM_TYPES (UNLANG_TYPE_XLAT + 1) |
Definition at line 329 of file unlang_priv.h.
Definition at line 95 of file unlang_priv.h.
#define unlang_frame_perf_cleanup | ( | _x | ) |
Definition at line 254 of file unlang_priv.h.
#define unlang_frame_perf_init | ( | _x | ) |
Definition at line 251 of file unlang_priv.h.
#define unlang_frame_perf_resume | ( | _x | ) |
Definition at line 253 of file unlang_priv.h.
#define unlang_frame_perf_yield | ( | _x | ) |
Definition at line 252 of file unlang_priv.h.
Definition at line 93 of file unlang_priv.h.
Definition at line 92 of file unlang_priv.h.
Definition at line 96 of file unlang_priv.h.
#define UNWIND_FLAG_BREAK_POINT 0x04 |
'break' stops here.
Definition at line 340 of file unlang_priv.h.
#define UNWIND_FLAG_NO_CLEAR 0x10 |
Keep unwinding, don't clear the unwind flag.
Definition at line 342 of file unlang_priv.h.
#define UNWIND_FLAG_NONE 0x00 |
No flags.
Definition at line 334 of file unlang_priv.h.
#define UNWIND_FLAG_REPEAT 0x01 |
Repeat the frame on the way up the stack.
Definition at line 335 of file unlang_priv.h.
#define UNWIND_FLAG_RETURN_POINT 0x08 |
'return' stops here.
Definition at line 341 of file unlang_priv.h.
#define UNWIND_FLAG_TOP_FRAME 0x02 |
are we the top frame of the stack?
If true, causes the interpreter to stop interpreting and return, control then passes to whatever called the interpreter.
Definition at line 339 of file unlang_priv.h.
#define UNWIND_FLAG_YIELDED 0x20 |
frame has yielded
Definition at line 343 of file unlang_priv.h.
typedef void(* unlang_dump_t) (request_t *request, unlang_stack_frame_t *frame) |
Custom callback for dumping information about frame state.
[in] | request | The current request. |
[in] | frame | to provide additional information for. |
Definition at line 195 of file unlang_priv.h.
typedef unlang_action_t(* unlang_process_t) (rlm_rcode_t *p_result, request_t *request, unlang_stack_frame_t *frame) |
Function to call when interpreting a frame.
[in,out] | p_result | Pointer to the current rcode, may be modified by the function. |
[in] | request | The current request. |
[in] | frame | being executed. |
Definition at line 173 of file unlang_priv.h.
typedef void(* unlang_signal_t) (request_t *request, unlang_stack_frame_t *frame, fr_signal_t action) |
Function to call if the request was signalled.
This is the instruction specific cancellation function. This function will usually either call a more specialised cancellation function set when something like a module yielded, or just cleanup the state of the original unlang_process_t.
[in] | request | The current request. |
[in] | frame | being signalled. |
[in] | action | We're being signalled with. |
Definition at line 187 of file unlang_priv.h.
typedef struct unlang_stack_frame_s unlang_stack_frame_t |
Definition at line 1 of file unlang_priv.h.
Definition at line 1 of file unlang_priv.h.
typedef int(* unlang_thread_instantiate_t) (unlang_t const *instruction, void *thread_inst) |
Definition at line 197 of file unlang_priv.h.
Allows the frame evaluator to signal the interpreter.
Definition at line 83 of file unlang_priv.h.
enum unlang_type_t |
Types of unlang_t nodes.
Here are our basic types: unlang_t, unlang_group_t, and unlang_module_t. For an explanation of what they are all about, see doc/unlang/configurable_failover.adoc
Enumerator | |
---|---|
UNLANG_TYPE_NULL | unlang type not set. |
UNLANG_TYPE_MODULE | Module method. |
UNLANG_TYPE_FUNCTION | Internal call to a function or submodule. |
UNLANG_TYPE_GROUP | Grouping section. |
UNLANG_TYPE_REDUNDANT | exactly like group, but with different default return codes |
UNLANG_TYPE_LOAD_BALANCE | Load balance section. |
UNLANG_TYPE_REDUNDANT_LOAD_BALANCE | Redundant load balance section. |
UNLANG_TYPE_PARALLEL | execute statements in parallel |
UNLANG_TYPE_IF | Condition. |
UNLANG_TYPE_ELSE | !Condition. |
UNLANG_TYPE_ELSIF | !Condition && Condition. |
UNLANG_TYPE_UPDATE | Update block. |
UNLANG_TYPE_SWITCH | Switch section. |
UNLANG_TYPE_CASE | Case section (within a UNLANG_TYPE_SWITCH). |
UNLANG_TYPE_FOREACH | Foreach section. |
UNLANG_TYPE_BREAK | Break statement (within a UNLANG_TYPE_FOREACH). |
UNLANG_TYPE_RETURN | Return statement. |
UNLANG_TYPE_MAP | Mapping section (like UNLANG_TYPE_UPDATE, but uses values from a map_proc_t call). |
UNLANG_TYPE_SUBREQUEST | create a child subrequest |
UNLANG_TYPE_DETACH | detach a child |
UNLANG_TYPE_CALL | call another virtual server |
UNLANG_TYPE_CALLER | conditionally check parent dictionary type |
UNLANG_TYPE_TIMEOUT | time-based timeouts. |
UNLANG_TYPE_LIMIT | limit number of requests in a section |
UNLANG_TYPE_TRANSACTION | transactions for editing lists |
UNLANG_TYPE_TRY | try / catch blocks |
UNLANG_TYPE_CATCH | catch a previous try |
UNLANG_TYPE_POLICY | Policy section. |
UNLANG_TYPE_XLAT | Represents one level of an xlat expansion. |
UNLANG_TYPE_TMPL | asynchronously expand a tmpl_t |
UNLANG_TYPE_EDIT | edit VPs in place. After 20 years! |
UNLANG_TYPE_MAX |
Definition at line 44 of file unlang_priv.h.
|
inlinestatic |
Definition at line 353 of file unlang_priv.h.
|
inlinestatic |
|
inlinestatic |
Cleanup any lingering frame state.
Definition at line 448 of file unlang_priv.h.
|
inlinestatic |
|
inlinestatic |
Advance to the next sibling instruction.
Definition at line 465 of file unlang_priv.h.
|
inlinestatic |
Pop a stack frame, removing any associated dynamically allocated state.
[in] | request | The current request. |
[in] | stack | frame to pop. |
Definition at line 482 of file unlang_priv.h.
|
inlinestatic |
Mark the current stack frame up for repeat, and set a new process function.
Definition at line 518 of file unlang_priv.h.
|
inlinestatic |
Definition at line 400 of file unlang_priv.h.
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
Definition at line 379 of file unlang_priv.h.
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
Definition at line 354 of file unlang_priv.h.
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
Definition at line 352 of file unlang_priv.h.
|
inlinestatic |
void unlang_call_init | ( | void | ) |
void unlang_caller_init | ( | void | ) |
void unlang_catch_init | ( | void | ) |
void unlang_condition_init | ( | void | ) |
Definition at line 103 of file condition.c.
void unlang_detach_init | ( | void | ) |
void unlang_edit_init | ( | void | ) |
void unlang_foreach_init | ( | TALLOC_CTX * | ctx | ) |
void unlang_frame_signal | ( | request_t * | request, |
fr_signal_t | action, | ||
int | limit | ||
) |
Send a signal (usually stop) to a request.
This is typically called via an "async" action, i.e. an action outside of the normal processing of the request.
If there is no unlang_module_signal_t callback defined, the action is ignored.
The signaling stops at the "limit" frame. This is so that keywords such as "timeout" and "limit" can signal frames lower than theirs to stop, but then continue with their own work.
[in] | request | The current request. |
[in] | action | to signal. |
[in] | limit | the frame at which to stop signaling. |
Definition at line 1142 of file interpret.c.
void unlang_function_init | ( | void | ) |
Definition at line 337 of file function.c.
|
inlinestatic |
Definition at line 531 of file unlang_priv.h.
|
inlinestatic |
Definition at line 543 of file unlang_priv.h.
void unlang_group_init | ( | void | ) |
|
inlinestatic |
int unlang_interpret_push | ( | request_t * | request, |
unlang_t const * | instruction, | ||
rlm_rcode_t | default_rcode, | ||
bool | do_next_sibling, | ||
bool | top_frame | ||
) |
Push a new frame onto the stack.
[in] | request | to push the frame onto. |
[in] | instruction | One or more unlang_t nodes describing the operations to execute. |
[in] | default_rcode | The default result. |
[in] | do_next_sibling | Whether to only execute the first node in the unlang_t program or to execute subsequent nodes. |
[in] | top_frame | Return out of the unlang interpret when popping this frame. Hands execution back to whatever called the interpret. |
Definition at line 161 of file interpret.c.
unlang_action_t unlang_interpret_push_children | ( | rlm_rcode_t * | p_result, |
request_t * | request, | ||
rlm_rcode_t | default_rcode, | ||
bool | do_next_sibling | ||
) |
Push the children of the current frame onto a new frame onto the stack.
[out] | p_result | set to RLM_MOULDE_FAIL if pushing the children fails |
[in] | request | to push the frame onto. |
[in] | default_rcode | The default result. |
[in] | do_next_sibling | Whether to only execute the first node in the unlang_t program or to execute subsequent nodes. |
Definition at line 243 of file interpret.c.
request_t* unlang_io_subrequest_alloc | ( | request_t * | parent, |
fr_dict_t const * | namespace, | ||
bool | detachable | ||
) |
Allocate a child request based on the parent.
[in] | parent | spawning the child request. |
[in] | namespace | the child request operates in. If NULL the parent's namespace is used. |
[in] | detachable | Allow/disallow the child to be detached. |
Definition at line 39 of file io.c.
void unlang_limit_init | ( | void | ) |
void unlang_load_balance_init | ( | void | ) |
Definition at line 248 of file load_balance.c.
void unlang_map_init | ( | void | ) |
void unlang_module_init | ( | void | ) |
void unlang_op_free | ( | void | ) |
int unlang_op_init | ( | void | ) |
void unlang_parallel_init | ( | void | ) |
Definition at line 493 of file parallel.c.
void unlang_register | ( | int | type, |
unlang_op_t * | op | ||
) |
Register an operation with the interpreter.
The main purpose of this registration API is to avoid intermixing the xlat, condition, map APIs with the interpreter, i.e. the callbacks needed for that functionality can be in their own source files, and we don't need to include supporting types and function declarations in the interpreter.
Later, this could potentially be used to register custom operations for modules.
The reason why there's a function instead of accessing the unlang_op array directly, is because 'type' really needs to go away, as needing to add ops to the unlang_type_t enum breaks the pluggable module model. If there's no explicit/consistent type values we need to enumerate the operations ourselves.
[in] | type | Operation identifier. Used to map compiled unlang code to operations. |
[in] | op | unlang_op to register. |
Definition at line 63 of file base.c.
void unlang_return_init | ( | void | ) |
void unlang_subrequest_op_free | ( | void | ) |
Definition at line 313 of file subrequest.c.
int unlang_subrequest_op_init | ( | void | ) |
Initialise subrequest ops.
Definition at line 295 of file subrequest.c.
void unlang_switch_init | ( | void | ) |
void* unlang_thread_instance | ( | unlang_t const * | instruction | ) |
void unlang_timeout_init | ( | void | ) |
void unlang_tmpl_init | ( | void | ) |
|
inlinestatic |
void unlang_transaction_init | ( | void | ) |
Definition at line 123 of file transaction.c.
void unlang_try_init | ( | void | ) |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
extern |
|
extern |