summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_main.c')
-rw-r--r--bgpd/bgp_main.c54
1 files changed, 26 insertions, 28 deletions
diff --git a/bgpd/bgp_main.c b/bgpd/bgp_main.c
index 94f8c7e5..3c6d70aa 100644
--- a/bgpd/bgp_main.c
+++ b/bgpd/bgp_main.c
@@ -37,6 +37,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
#include "plist.h"
#include "qpnexus.h"
#include "qlib_init.h"
+#include "thread.h"
#include "bgpd/bgpd.h"
#include "bgpd/bgp_attr.h"
@@ -84,8 +85,8 @@ void sigusr2 (void);
static void bgp_exit (int);
static void init_second_stage(int pthreads);
static void bgp_in_thread_init(void);
-static qtime_mono_t routing_event_hook(enum qpn_priority priority);
-static qtime_mono_t bgp_event_hook(enum qpn_priority priority);
+static int routing_foreground(void);
+static int routing_background(void);
static void sighup_action(mqueue_block mqb, mqb_flag_t flag);
static void sighup_enqueue(void);
static void sigterm_action(mqueue_block mqb, mqb_flag_t flag);
@@ -129,7 +130,6 @@ char *config_file = NULL;
/* Have we done the second stage initialization? */
static int done_2nd_state_init = 0;
-
/* Process ID saved for use by init system */
static const char *pid_file = PATH_BGPD_PID;
@@ -390,26 +390,32 @@ init_second_stage(int pthreads)
/* if using pthreads create additional nexus */
if (qpthreads_enabled)
{
- bgp_nexus = qpn_init_new(bgp_nexus, 0);
+ bgp_nexus = qpn_init_new(bgp_nexus, 0);
routing_nexus = qpn_init_new(routing_nexus, 0);
}
else
{
/* we all share the single nexus and single thread */
- bgp_nexus = cli_nexus;
+ bgp_nexus = cli_nexus;
routing_nexus = cli_nexus;
}
+ /* Tell thread stuff to use this qtimer pile */
+ thread_set_qtimer_pile(routing_nexus->pile) ;
+
/* Nexus hooks.
* Beware if !qpthreads_enabled then there is only 1 nexus object
- * with all nexus pointers being aliases for it. So only one routine
- * per hook for *all* nexus.
+ * with all nexus pointers being aliases for it.
*/
- bgp_nexus->in_thread_init = bgp_in_thread_init;
- bgp_nexus->in_thread_final = bgp_close_listeners;
- routing_nexus->event_hook[0] = routing_event_hook;
- bgp_nexus->event_hook[1] = bgp_event_hook;
- confirm(NUM_EVENT_HOOK >= 2);
+ bgp_nexus->in_thread_init = bgp_in_thread_init ;
+ bgp_nexus->in_thread_final = bgp_close_listeners ;
+
+ qpn_add_hook_function(&routing_nexus->foreground, routing_foreground) ;
+ qpn_add_hook_function(&bgp_nexus->foreground, bgp_connection_queue_process) ;
+
+ qpn_add_hook_function(&routing_nexus->background, routing_background) ;
+
+ confirm(qpn_hooks_max >= 2) ;
/* vty and zclient can use either nexus or threads.
* For bgp client we always want nexus, regardless of pthreads.
@@ -616,26 +622,18 @@ bgp_in_thread_init(void)
bgp_open_listeners(bm->port, bm->address);
}
-/* legacy threads */
-static qtime_mono_t
-routing_event_hook(enum qpn_priority priority)
+/* legacy threads in routing engine */
+static int
+routing_foreground(void)
{
- struct thread thread;
- qtime_mono_t event_wait;
-
- while (thread_fetch_event (priority, master, &thread, &event_wait))
- thread_call (&thread);
-
- return event_wait;
+ return thread_dispatch(master) ;
}
-/* BGP local queued events */
-static qtime_mono_t
-bgp_event_hook(enum qpn_priority priority)
+/* background threads in routing engine */
+static int
+routing_background(void)
{
- if (priority >= qpn_pri_fourth)
- bgp_connection_queue_process();
- return 0;
+ return thread_dispatch_background(master) ;
}
/* SIGINT/TERM SIGHUP need to tell routing engine what to do */