- vnet_unbind_args_t _a, *a = &_a;
- u64 handle, *handles = 0;
- segment_manager_t *sm;
- u32 index;
- int i;
-
- /*
- * 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);
-
- if (application_is_proxy (app))
- application_remove_proxy (app);
-
- /*
- * Listener cleanup
- */
-
- /* *INDENT-OFF* */
- hash_foreach (handle, index, app->listeners_table,
- ({
- vec_add1 (handles, handle);
- sm = segment_manager_get (index);
- sm->app_index = SEGMENT_MANAGER_INVALID_APP_INDEX;
- }));
- /* *INDENT-ON* */
-
- for (i = 0; i < vec_len (handles); i++)
- {
- a->app_index = app->index;
- a->handle = handles[i];
- /* seg manager is removed when unbind completes */
- vnet_unbind (a);
- }
-
- /*
- * Connects segment manager cleanup
- */
-
- if (app->connects_seg_manager != APP_INVALID_SEGMENT_MANAGER_INDEX)
- {
- sm = segment_manager_get (app->connects_seg_manager);
- sm->app_index = SEGMENT_MANAGER_INVALID_APP_INDEX;
- segment_manager_init_del (sm);
- }
-
- /* If first segment manager is used by a listener */
- if (app->first_segment_manager != APP_INVALID_SEGMENT_MANAGER_INDEX
- && app->first_segment_manager != app->connects_seg_manager)
- {
- sm = segment_manager_get (app->first_segment_manager);
- /* .. and has no fifos, e.g. it might be used for redirected sessions,
- * remove it */
- if (!segment_manager_has_fifos (sm))
- {
- sm->app_index = SEGMENT_MANAGER_INVALID_APP_INDEX;
- segment_manager_del (sm);
- }
- }