summary |
shortlog |
log |
commit | commitdiff |
review |
tree
raw |
patch |
inline | side by side (from parent 1:
da3eec1)
Change-Id: Ibc74e7f7587f8b17fc0dcec20cc4530b9dd4c3ca
Signed-off-by: Florin Coras <fcoras@cisco.com>
vcl_worker_cleanup (void *arg)
{
vcl_worker_t *wrk = vcl_worker_get_current ();
vcl_worker_cleanup (void *arg)
{
vcl_worker_t *wrk = vcl_worker_get_current ();
VDBG (0, "cleaning up worker %u", wrk->wrk_index);
vcl_send_app_worker_add_del (0 /* is_add */ );
close (wrk->mqs_epfd);
VDBG (0, "cleaning up worker %u", wrk->wrk_index);
vcl_send_app_worker_add_del (0 /* is_add */ );
close (wrk->mqs_epfd);
if (vcl_get_worker_index () != ~0)
return 0;
if (vcl_get_worker_index () != ~0)
return 0;
+ if (pool_elts (vcm->workers) == vcm->cfg.max_workers)
+ {
+ VDBG (0, "max-workers %u limit reached", vcm->cfg.max_workers);
+ return 0;
+ }
+
+ clib_spinlock_lock (&vcm->workers_lock);
wrk = vcl_worker_alloc ();
vcl_set_worker_index (wrk->wrk_index);
wrk = vcl_worker_alloc ();
vcl_set_worker_index (wrk->wrk_index);
vec_reset_length (wrk->mq_msg_vector);
if (wrk->wrk_index == 0)
vec_reset_length (wrk->mq_msg_vector);
if (wrk->wrk_index == 0)
+ {
+ clib_spinlock_unlock (&vcm->workers_lock);
+ return wrk;
+ }
- while (vcm->app_state == STATE_APP_ADDING_WORKER)
- ;
vcm->app_state = STATE_APP_ADDING_WORKER;
vcl_send_app_worker_add_del (1 /* is_add */ );
if (vcl_wait_for_app_state_change (STATE_APP_READY))
vcm->app_state = STATE_APP_ADDING_WORKER;
vcl_send_app_worker_add_del (1 /* is_add */ );
if (vcl_wait_for_app_state_change (STATE_APP_READY))
if (pthread_key_create (&vcl_worker_stop_key, vcl_worker_cleanup))
clib_warning ("failed to add pthread cleanup function");
if (pthread_key_create (&vcl_worker_stop_key, vcl_worker_cleanup))
clib_warning ("failed to add pthread cleanup function");
+ clib_spinlock_unlock (&vcm->workers_lock);
+
VDBG (0, "added worker %u", wrk->wrk_index);
return wrk;
VDBG (0, "added worker %u", wrk->wrk_index);
return wrk;
/** Workers */
vcl_worker_t *workers;
/** Workers */
vcl_worker_t *workers;
+ /** Lock to protect worker registrations */
+ clib_spinlock_t workers_lock;
+
#ifdef VCL_ELOG
/* VPP Event-logger */
elog_main_t elog_main;
#ifdef VCL_ELOG
/* VPP Event-logger */
elog_main_t elog_main;
conn_pool_expand (wrk, SOCK_SERVER_MAX_TEST_CONN + 1);
if (wrk->wrk_index)
conn_pool_expand (wrk, SOCK_SERVER_MAX_TEST_CONN + 1);
if (wrk->wrk_index)
- vppcom_worker_register ();
+ if (vppcom_worker_register ())
+ vtfail ("vppcom_worker_register()", 1);
wrk->listen_fd = vppcom_session_create (ssm->cfg.proto,
0 /* is_nonblocking */ );
wrk->listen_fd = vppcom_session_create (ssm->cfg.proto,
0 /* is_nonblocking */ );
svm_fifo_segment_main_init (vcl_cfg->segment_baseva,
20 /* timeout in secs */ );
pool_init_fixed (vcm->workers, vcl_cfg->max_workers);
svm_fifo_segment_main_init (vcl_cfg->segment_baseva,
20 /* timeout in secs */ );
pool_init_fixed (vcm->workers, vcl_cfg->max_workers);
+ clib_spinlock_init (&vcm->workers_lock);
vcl_worker_alloc_and_init ();
}
vcl_worker_alloc_and_init ();
}