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.c90
1 files changed, 81 insertions, 9 deletions
diff --git a/lib/qlib_init.c b/lib/qlib_init.c
index c44de575..1d641e26 100644
--- a/lib/qlib_init.c
+++ b/lib/qlib_init.c
@@ -18,16 +18,23 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
+#include "misc.h"
+
+#include <errno.h>
+#include <stdio.h>
#include "qlib_init.h"
#include "zassert.h"
#include "memory.h"
+#include "qpnexus.h"
#include "qpthreads.h"
#include "qpselect.h"
#include "thread.h"
#include "privs.h"
#include "mqueue.h"
#include "pthread_safe.h"
+#include "log_local.h"
+#include "qiovec.h"
/*==============================================================================
* Quagga Library Initialise/Closedown
@@ -42,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.
*
@@ -55,41 +64,104 @@
* 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
*/
-void
+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() ;
}
-void
-qlib_init_second_stage(int pthreads)
+extern void
+qlib_init_second_stage(bool pthreads)
{
qpt_set_qpthreads_enabled(pthreads);
+ qpn_init() ;
memory_init_r();
thread_init_r();
+ log_init_r() ;
zprivs_init_r();
mqueue_initialise();
safe_init_r();
}
-
-void
+extern void
qexit(int exit_code)
{
safe_finish();
mqueue_finish();
zprivs_finish();
+ log_finish();
thread_finish();
memory_finish();
exit (exit_code);