diff options
Diffstat (limited to 'lib/qlib_init.c')
-rw-r--r-- | lib/qlib_init.c | 77 |
1 files changed, 72 insertions, 5 deletions
diff --git a/lib/qlib_init.c b/lib/qlib_init.c index 757a9e65..1d641e26 100644 --- a/lib/qlib_init.c +++ b/lib/qlib_init.c @@ -19,6 +19,10 @@ * Boston, MA 02111-1307, USA. */ #include "misc.h" + +#include <errno.h> +#include <stdio.h> + #include "qlib_init.h" #include "zassert.h" #include "memory.h" @@ -30,6 +34,7 @@ #include "mqueue.h" #include "pthread_safe.h" #include "log_local.h" +#include "qiovec.h" /*============================================================================== * Quagga Library Initialise/Closedown @@ -44,6 +49,8 @@ * * this is expected to be called before the program does anything at all. * + * Collects a small number of useful system parameters -- see below. + * * This performs all initialisation required to support asserts, logging, * basic I/O (but not the remote console), trap signals... and so on. * @@ -57,21 +64,82 @@ * This performs all initialisation required to support socket I/O, * thread handling, timers, and so on. * - * In particular, at this stage the system is set into Pthread Mode, if - * required. No pthreads may be started before this. Up to this point - * the system operates in non-Pthread Mode -- all mutexes are implicitly - * free. + * NB: at this stage the system is set into pthread mode, if required. + * + * No pthreads may be started before this. Up to this point + * the system operates in non-pthread mode -- all mutexes are + * implicitly free. * * There is one stage of closedown. This is expected to be called last, and * is passed the exit code. * + *============================================================================== + * System parameters: * + * iov_max -- _SC_IOV_MAX + * + * open_max -- _SC_OPEN_MAX */ +int qlib_iov_max ; +int qlib_open_max ; +int qlib_pagesize ; + +struct +{ + int* p_var ; + int sc ; + const char* name ; + long min ; + long max ; +} qlib_vars[] = +{ + { .p_var = &qlib_iov_max, .sc = _SC_IOV_MAX, .name = "_SC_IOV_MAX", + .min = 16, .max = INT_MAX }, + { .p_var = &qlib_open_max, .sc = _SC_OPEN_MAX, .name = "_SC_OPEN_MAX", + .min = 256, .max = INT_MAX }, + { .p_var = &qlib_pagesize, .sc = _SC_PAGESIZE, .name = "_SC_PAGESIZE", + .min = 256, .max = (INT_MAX >> 1) + 1 }, + { .p_var = NULL } +} ; + extern void qlib_init_first_stage(void) { + int i ; + + for (i = 0 ; qlib_vars[i].p_var != NULL ; ++i) + { + long val ; + + errno = 0 ; + val = sysconf(qlib_vars[i].sc) ; + + if (val == -1) + { + if (errno == 0) + val = INT_MAX ; + else + { + fprintf(stderr, "Failed to sysconf(%s): %s\n", + qlib_vars[i].name, errtoa(errno, 0).str) ; + exit(1) ; + } ; + } ; + + if ((val < qlib_vars[i].min) || (val > qlib_vars[i].max)) + { + fprintf(stderr, "sysconf(%s) = %ld: which is < %ld or > %ld\n", + qlib_vars[i].name, val, qlib_vars[i].min, qlib_vars[i].max) ; + exit(1) ; + } ; + + *(qlib_vars[i].p_var) = (int)val ; + } ; + qps_start_up() ; + memory_start() ; + qiovec_start_up() ; } extern void @@ -87,7 +155,6 @@ qlib_init_second_stage(bool pthreads) safe_init_r(); } - extern void qexit(int exit_code) { |