vcl: fix app destroy 56/26556/6
authorFlorin Coras <fcoras@cisco.com>
Thu, 16 Apr 2020 18:47:27 +0000 (18:47 +0000)
committerDave Barach <openvpp@barachs.net>
Fri, 17 Apr 2020 12:05:39 +0000 (12:05 +0000)
Type: fix

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: I21daa87b1a301142270a1bf20680dd9e9395aac9

src/vcl/vcl_cfg.c
src/vcl/vcl_private.h
src/vcl/vppcom.c

index 2e180f4..2ae9401 100644 (file)
@@ -19,7 +19,7 @@
  *       Do not access it directly -- use vcm which will point to
  *       the heap allocated copy after init.
  */
-static vppcom_main_t _vppcom_main = {
+vppcom_main_t _vppcom_main = {
   .debug = VPPCOM_DEBUG_INIT,
   .is_init = 0,
   .app_index = ~0,
index 12af09f..c4ec02e 100644 (file)
@@ -360,6 +360,7 @@ typedef struct vppcom_main_t_
 } vppcom_main_t;
 
 extern vppcom_main_t *vcm;
+extern vppcom_main_t _vppcom_main;
 
 #define VCL_INVALID_SESSION_INDEX ((u32)~0)
 #define VCL_INVALID_SESSION_HANDLE ((u64)~0)
index 1591b08..33e0c19 100644 (file)
@@ -1211,35 +1211,34 @@ vppcom_app_create (char *app_name)
 void
 vppcom_app_destroy (void)
 {
-  int rv;
-  f64 orig_app_timeout;
+  struct dlmallinfo mi;
+  vcl_worker_t *wrk;
+  mspace heap;
 
   if (!pool_elts (vcm->workers))
     return;
 
   vcl_evt (VCL_EVT_DETACH, vcm);
 
-  if (pool_elts (vcm->workers) == 1)
-    {
-      vcl_send_app_detach (vcl_worker_get_current ());
-      orig_app_timeout = vcm->cfg.app_timeout;
-      vcm->cfg.app_timeout = 2.0;
-      rv = vcl_wait_for_app_state_change (STATE_APP_ENABLED);
-      vcm->cfg.app_timeout = orig_app_timeout;
-      if (PREDICT_FALSE (rv))
-       VDBG (0, "application detach timed out! returning %d (%s)", rv,
-             vppcom_retval_str (rv));
-      vec_free (vcm->app_name);
-      vcl_worker_cleanup (vcl_worker_get_current (), 0 /* notify vpp */ );
-    }
-  else
-    {
-      vcl_worker_cleanup (vcl_worker_get_current (), 1 /* notify vpp */ );
-    }
+  vcl_send_app_detach (vcl_worker_get_current ());
+
+  /* *INDENT-OFF* */
+  pool_foreach (wrk, vcm->workers, ({
+    vcl_worker_cleanup (wrk, 0 /* notify vpp */ );
+  }));
+  /* *INDENT-ON* */
 
-  vcl_set_worker_index (~0);
   vcl_elog_stop (vcm);
   vl_client_disconnect_from_vlib ();
+
+  /*
+   * Free the heap and fix vcm
+   */
+  heap = clib_mem_get_heap ();
+  mi = mspace_mallinfo (heap);
+  munmap (mspace_least_addr (heap), mi.arena);
+
+  vcm = &_vppcom_main;
 }
 
 int