memset (app, 0, sizeof (*app));
app->index = application_get_index (app);
app->connects_seg_manager = ~0;
+ app->first_segment_manager = ~0;
+ if (CLIB_DEBUG > 1)
+ clib_warning ("[%d] New app (%d)", getpid (), app->index);
return app;
}
* The app event queue allocated in first segment is cleared with
* the segment manager. No need to explicitly free it.
*/
+ if (CLIB_DEBUG > 1)
+ clib_warning ("[%d] Delete app (%d)", getpid (), app->index);
/*
* Cleanup segment managers
/* Actual listener cleanup */
for (i = 0; i < vec_len (handles); i++)
{
- a->app_index = app->api_client_index;
+ a->app_index = app->index;
a->handle = handles[i];
/* seg manager is removed when unbind completes */
vnet_unbind (a);
}
+ if (app->first_segment_manager != ~0)
+ {
+ sm = segment_manager_get (app->first_segment_manager);
+ segment_manager_first_segment_maybe_del (sm);
+ }
+
application_table_del (app);
pool_put (app_pool, app);
}
props->rx_fifo_size = options[SESSION_OPTIONS_RX_FIFO_SIZE];
props->tx_fifo_size = options[SESSION_OPTIONS_TX_FIFO_SIZE];
props->add_segment = props->add_segment_size != 0;
+ props->preallocated_fifo_pairs = options[APP_OPTIONS_PREALLOC_FIFO_PAIRS];
props->use_private_segment = options[APP_OPTIONS_FLAGS]
& APP_OPTIONS_FLAGS_BUILTIN_APP;
+ props->private_segment_count = options[APP_OPTIONS_PRIVATE_SEGMENT_COUNT];
+ props->private_segment_size = options[APP_OPTIONS_PRIVATE_SEGMENT_SIZE];
first_seg_size = options[SESSION_OPTIONS_SEGMENT_SIZE];
if ((rv = segment_manager_init (sm, props, first_seg_size)))
if (app->first_segment_manager != (u32) ~ 0)
{
sm = segment_manager_get (app->first_segment_manager);
- app->first_segment_manager = ~0;
return sm;
}
sm = segment_manager_get (*indexp);
segment_manager_del (sm);
+ srv->first_segment_manager = ~0;
hash_unset (srv->listeners_table, handle);
listen_session_del (listener);
vlib_main_t *vm = vlib_get_main ();
segment_manager_t *sm;
u8 *app_name, *s = 0;
- int i, j;
+ int j;
/* Header */
if (app == 0)
for (j = 0; j < vec_len (sm->segment_indices); j++)
{
svm_fifo_segment_private_t *fifo_segment;
- svm_fifo_t **fifos;
+ svm_fifo_t *fifo;
u8 *str;
fifo_segment = svm_fifo_get_segment (sm->segment_indices[j]);
- fifos = svm_fifo_segment_get_fifos (fifo_segment);
- for (i = 0; i < vec_len (fifos); i++)
+ fifo = svm_fifo_segment_get_fifo_list (fifo_segment);
+ while (fifo)
{
- svm_fifo_t *fifo;
u32 session_index, thread_index;
stream_session_t *session;
- /* There are 2 fifos/session. Avoid printing twice. */
- if (i % 2)
- continue;
-
- fifo = fifos[i];
session_index = fifo->master_session_index;
thread_index = fifo->master_thread_index;
s = format (s, "%-40s%-20s", str, app_name);
vlib_cli_output (vm, "%v", s);
-
vec_reset_length (s);
vec_free (str);
+
+ fifo = fifo->next;
}
vec_free (s);
}