session: avoid double dispatch of new events
[vpp.git] / src / vnet / session / application_worker.c
index 0be1a2e..c456797 100644 (file)
@@ -109,9 +109,9 @@ app_worker_free (app_worker_t * app_wrk)
        segment_manager_free (sm);
     }
 
-  pool_put (app_workers, app_wrk);
   if (CLIB_DEBUG)
     clib_memset (app_wrk, 0xfe, sizeof (*app_wrk));
+  pool_put (app_workers, app_wrk);
 }
 
 application_t *
@@ -372,6 +372,15 @@ app_worker_builtin_tx (app_worker_t * app_wrk, session_t * s)
   return 0;
 }
 
+int
+app_worker_migrate_notify (app_worker_t * app_wrk, session_t * s,
+                          session_handle_t new_sh)
+{
+  application_t *app = application_get (app_wrk->app_index);
+  app->cb_fns.session_migrate_callback (s, new_sh);
+  return 0;
+}
+
 int
 app_worker_own_session (app_worker_t * app_wrk, session_t * s)
 {
@@ -541,13 +550,15 @@ app_send_io_evt_rx (app_worker_t * app_wrk, session_t * s)
   svm_msg_q_msg_t msg;
   svm_msg_q_t *mq;
 
+  if (app_worker_application_is_builtin (app_wrk))
+    return app_worker_builtin_rx (app_wrk, s);
+
+  /* Make sure the session is in established state within external apps.
+   * Should be removed once we confirm closes to apps */
   if (PREDICT_FALSE (s->session_state != SESSION_STATE_READY
                     && s->session_state != SESSION_STATE_LISTENING))
     return 0;
 
-  if (app_worker_application_is_builtin (app_wrk))
-    return app_worker_builtin_rx (app_wrk, s);
-
   if (svm_fifo_has_event (s->rx_fifo))
     return 0;