summaryrefslogtreecommitdiffstats
path: root/lib/qlib_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/qlib_init.c')
-rw-r--r--lib/qlib_init.c77
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)
{