pthread_mutex_t vls_mt_mq_mlock;
pthread_mutex_t vls_mt_spool_mlock;
volatile u8 select_mp_check;
- volatile u8 epoll_mp_check;
} vls_process_local_t;
static vls_process_local_t vls_local;
return rv;
}
+int
+vls_shutdown (vls_handle_t vlsh, int how)
+{
+ vcl_locked_session_t *vls;
+ int rv;
+
+ vls_mt_detect ();
+ if (!(vls = vls_get_w_dlock (vlsh)))
+ return VPPCOM_EBADFD;
+
+ vls_mt_guard (vls, VLS_MT_OP_SPOOL);
+ rv = vppcom_session_shutdown (vls_to_sh (vls), how);
+ vls_mt_unguard ();
+ vls_get_and_unlock (vlsh);
+
+ return rv;
+}
+
vls_handle_t
vls_epoll_create (void)
{
static void
vls_epoll_ctl_mp_checks (vcl_locked_session_t * vls, int op)
{
- if (vcl_n_workers () <= 1)
- {
- vlsl->epoll_mp_check = 1;
- return;
- }
-
- if (op == EPOLL_CTL_MOD)
+ if (vcl_n_workers () <= 1 || op == EPOLL_CTL_MOD)
return;
- vlsl->epoll_mp_check = 1;
vls_mp_checks (vls, op == EPOLL_CTL_ADD);
}
vls = vls_get_and_lock (vlsh);
sh = vls_to_sh (vls);
- if (PREDICT_FALSE (!vlsl->epoll_mp_check))
- vls_epoll_ctl_mp_checks (vls, op);
-
+ vls_epoll_ctl_mp_checks (vls, op);
vls_mt_table_runlock ();
-
rv = vppcom_epoll_ctl (ep_sh, op, sh, event);
vls_mt_table_rlock ();
vls_incercept_sigchld ()
{
struct sigaction sa;
+ if (old_sa.sa_sigaction)
+ {
+ VDBG (0, "have intercepted sigchld");
+ return;
+ }
clib_memset (&sa, 0, sizeof (sa));
sa.sa_sigaction = vls_intercept_sigchld_handler;
sa.sa_flags = SA_SIGINFO;
vlsl->vls_mt_n_threads = 0;
vlsl->vls_wrk_index = vcl_get_worker_index ();
vlsl->select_mp_check = 0;
- vlsl->epoll_mp_check = 0;
vls_mt_locks_init ();
VDBG (0, "forked child main worker initialized");