summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vcl/vppcom.c13
-rw-r--r--src/vlibmemory/memclnt.api3
-rw-r--r--src/vlibmemory/memory_api.c38
-rw-r--r--src/vlibmemory/memory_client.c5
-rw-r--r--src/vlibmemory/memory_client.h2
5 files changed, 36 insertions, 25 deletions
diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c
index dbb0d657b8d..0eaab6cbd6b 100644
--- a/src/vcl/vppcom.c
+++ b/src/vcl/vppcom.c
@@ -737,14 +737,17 @@ vcl_intercept_sigchld_handler (int signum, siginfo_t * si, void *uc)
return;
child_wrk = vcl_worker_get_if_valid (wrk->forked_child);
- if (si->si_pid != child_wrk->current_pid)
+ if (!child_wrk)
+ goto done;
+
+ if (si && si->si_pid != child_wrk->current_pid)
{
VDBG (0, "unexpected child pid %u", si->si_pid);
- return;
+ goto done;
}
- if (child_wrk)
- vcl_cleanup_forked_child (wrk, child_wrk);
+ vcl_cleanup_forked_child (wrk, child_wrk);
+done:
if (old_sa.sa_flags & SA_SIGINFO)
{
void (*fn) (int, siginfo_t *, void *) = old_sa.sa_sigaction;
@@ -848,7 +851,7 @@ vppcom_app_exit (void)
if (vec_len (vcm->workers) == 1)
vl_client_disconnect_from_vlib ();
else
- vl_client_send_disconnect ();
+ vl_client_send_disconnect (1 /* vpp should cleanup */ );
}
/*
diff --git a/src/vlibmemory/memclnt.api b/src/vlibmemory/memclnt.api
index 451bc0e5fae..4802732a07b 100644
--- a/src/vlibmemory/memclnt.api
+++ b/src/vlibmemory/memclnt.api
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-option version = "2.0.0";
+option version = "2.1.0";
/*
* Define services not following the normal conventions here
@@ -53,6 +53,7 @@ manual_print
define memclnt_delete {
u32 index; /* index, used e.g. by API trace replay */
u64 handle; /* handle by which vlib knows this client */
+ u8 do_cleanup; /* vlib to cleanup the registration */
};
define memclnt_delete_reply {
diff --git a/src/vlibmemory/memory_api.c b/src/vlibmemory/memory_api.c
index 544e59ddb69..cb15f0c762d 100644
--- a/src/vlibmemory/memory_api.c
+++ b/src/vlibmemory/memory_api.c
@@ -296,23 +296,27 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp)
svm = am->vlib_rp;
int private_registration = 0;
- /*
- * Note: the API message handling path will set am->vlib_rp
- * as appropriate for pairwise / private memory segments
- */
- rp = vl_msg_api_alloc (sizeof (*rp));
- rp->_vl_msg_id = ntohs (VL_API_MEMCLNT_DELETE_REPLY);
- rp->handle = mp->handle;
- rp->response = 1;
-
- vl_msg_api_send_shmem (regp->vl_input_queue, (u8 *) & rp);
-
- if (client_index != regp->vl_api_registration_pool_index)
+ /* Send reply unless client asked us to do the cleanup */
+ if (!mp->do_cleanup)
{
- clib_warning ("mismatch client_index %d pool_index %d",
- client_index, regp->vl_api_registration_pool_index);
- vl_msg_api_free (rp);
- return;
+ /*
+ * Note: the API message handling path will set am->vlib_rp
+ * as appropriate for pairwise / private memory segments
+ */
+ rp = vl_msg_api_alloc (sizeof (*rp));
+ rp->_vl_msg_id = ntohs (VL_API_MEMCLNT_DELETE_REPLY);
+ rp->handle = mp->handle;
+ rp->response = 1;
+
+ vl_msg_api_send_shmem (regp->vl_input_queue, (u8 *) & rp);
+ if (client_index != regp->vl_api_registration_pool_index)
+ {
+ clib_warning ("mismatch client_index %d pool_index %d",
+ client_index,
+ regp->vl_api_registration_pool_index);
+ vl_msg_api_free (rp);
+ return;
+ }
}
/* For horizontal scaling, add a hash table... */
@@ -352,6 +356,8 @@ vl_api_memclnt_delete_t_handler (vl_api_memclnt_delete_t * mp)
regp->vl_api_registration_pool_index);
pthread_mutex_lock (&svm->mutex);
oldheap = svm_push_data_heap (svm);
+ if (mp->do_cleanup)
+ svm_queue_free (regp->vl_input_queue);
vec_free (regp->name);
/* Poison the old registration */
clib_memset (regp, 0xF1, sizeof (*regp));
diff --git a/src/vlibmemory/memory_client.c b/src/vlibmemory/memory_client.c
index 79344a6af68..3add39a4328 100644
--- a/src/vlibmemory/memory_client.c
+++ b/src/vlibmemory/memory_client.c
@@ -271,7 +271,7 @@ vl_api_memclnt_delete_reply_t_handler (vl_api_memclnt_delete_reply_t * mp)
}
void
-vl_client_send_disconnect (void)
+vl_client_send_disconnect (u8 do_cleanup)
{
vl_api_memclnt_delete_t *mp;
vl_shmem_hdr_t *shmem_hdr;
@@ -286,6 +286,7 @@ vl_client_send_disconnect (void)
mp->_vl_msg_id = ntohs (VL_API_MEMCLNT_DELETE);
mp->index = am->my_client_index;
mp->handle = (uword) am->my_registration;
+ mp->do_cleanup = do_cleanup;
vl_msg_api_send_shmem (shmem_hdr->vl_input_queue, (u8 *) & mp);
}
@@ -299,7 +300,7 @@ vl_client_disconnect (void)
time_t begin;
vl_input_queue = am->vl_input_queue;
- vl_client_send_disconnect ();
+ vl_client_send_disconnect (0 /* wait for reply */ );
/*
* Have to be careful here, in case the client is disconnecting
diff --git a/src/vlibmemory/memory_client.h b/src/vlibmemory/memory_client.h
index eb3431a51e6..6aaf6d7e569 100644
--- a/src/vlibmemory/memory_client.h
+++ b/src/vlibmemory/memory_client.h
@@ -21,7 +21,7 @@
#include <vlibmemory/memory_shared.h>
int vl_client_connect (const char *name, int ctx_quota, int input_queue_size);
-void vl_client_send_disconnect (void);
+void vl_client_send_disconnect (u8 do_cleanup);
int vl_client_disconnect (void);
int vl_client_api_map (const char *region_name);
void vl_client_api_unmap (void);