Serene Runtime 1.0.0-dev
C runtime for the Serene programming language
Loading...
Searching...
No Matches
configuration.c File Reference
#include "serene/rt/configuration.h"
#include <stdint.h>
#include "serene/rt/mm/interface.h"
#include "serene/utils.h"
Include dependency graph for configuration.c:

Go to the source code of this file.

Functions

void srn_config_validate (const srn_configuration_t *config)
 A configuration with every field set to its default.

Function Documentation

◆ srn_config_validate()

void srn_config_validate ( const srn_configuration_t * config)

A configuration with every field set to its default.

Use as an initializer: srn_configuration_t cfg = SRN_CONFIG_DEFAULTS;. Panic unless every knob in config is usable. Called by srn_mm_init and srn_engine_make on the configuration they are given, so a bad value fails loudly at startup, naming the knob, instead of corrupting whatever is sized or bounded by it later.

Definition at line 26 of file configuration.c.

26 {
27 PANIC_IF_NULL(config);
28
29 // Pages are powers of two on every platform in practice, which makes a
30 // covering power of two a whole number of pages. The modulo still checks
31 // it, in case a platform reports an unusual page size. The upper bound
32 // keeps the shift defined and the block size sane.
34 config->mm.block_size_magnitude > 30 ||
35 ((size_t)1 << config->mm.block_size_magnitude) < srn_mm_get_os_page_size() ||
36 ((size_t)1 << config->mm.block_size_magnitude) % srn_mm_get_os_page_size() != 0,
37 "config: mm.block_size_magnitude must yield a whole number of OS pages, within 30"
38 );
39
41 config->fiber.stack_size < FALLBACK_PAGE_SIZE || config->fiber.stack_size > SIZE_MAX / 2,
42 "config: fiber.stack_size must be within one page..SIZE_MAX/2"
43 );
44
45 // A workers count of zero is valid, it delegates to the CPU count at run
46 // time.
48 config->fiber.max_workers < 1 || config->fiber.max_workers > SRN_MAX_WORKERS,
49 "config: fiber.max_workers must be within 1..SRN_MAX_WORKERS"
50 );
51
53 config->fiber.workers > config->fiber.max_workers,
54 "config: fiber.workers must not exceed fiber.max_workers"
55 );
56
57 // The ring magnitude bounds every ring, the admission cap, and the backend
58 // op pool; the reap batch is a stack buffer size on the workers.
60 config->reactor.ring_magnitude < 1 || config->reactor.ring_magnitude > 16,
61 "config: reactor.ring_magnitude must be within 1..16"
62 );
64 config->reactor.reap_batch < 1 ||
65 config->reactor.reap_batch > ((size_t)1 << config->reactor.ring_magnitude),
66 "config: reactor.reap_batch must be within 1..ring capacity"
67 );
68
69 // A zero limit rejects everything, including the runtime's own interned
70 // names, which is never what a configuration means.
71 PANIC_IF(config->limits.string_max_len < 1, "config: limits.string_max_len must be at least 1");
72 PANIC_IF(config->limits.ns_name_max_len < 1, "config: limits.ns_name_max_len must be at least 1");
73}
#define SRN_MAX_WORKERS
The absolute worker ceiling.
size_t srn_mm_get_os_page_size(void)
Retutrns the OS page size.
Definition default.c:313
#define FALLBACK_PAGE_SIZE
Definition interface.h:45
srn_reactor_config_t reactor
srn_fiber_config_t fiber
srn_limits_config_t limits
srn_mm_config_t mm
size_t workers
Worker count used when a run does not specify one.
size_t max_workers
Hard ceiling a requested worker count is clamped to.
size_t stack_size
Size of every fiber stack, in bytes.
size_t ns_name_max_len
Longest namespace name accepted, in bytes.
size_t string_max_len
Largest string accepted, in bytes.
size_t block_size_magnitude
Magnitude of one block the arena hands out from.
size_t reap_batch
Most completions a worker drains from its channel in a single pass.
size_t ring_magnitude
Magnitude of each channel's SQ/CQ rings, capacity is 1 << magnitude.
#define PANIC_IF_NULL(ptr)
Definition utils.h:66
#define PANIC_IF(cond, msg)
Definition utils.h:59
Here is the call graph for this function:
Here is the caller graph for this function: