bapi: separate init shm reply from fd exchange 41/19441/3
authorFlorin Coras <fcoras@cisco.com>
Thu, 9 May 2019 02:57:24 +0000 (19:57 -0700)
committerDave Wallace <dwallacelf@gmail.com>
Thu, 9 May 2019 16:46:27 +0000 (16:46 +0000)
Wait for init shm reply to be consumed before sending fd over the
socket.

Change-Id: I5cd0246d8debcc3c8a163b7e2dd400ca0050a2fb
Signed-off-by: Florin Coras <fcoras@cisco.com>
src/vlibmemory/socket_api.c

index a8a45a7..f0c7f1f 100644 (file)
@@ -591,7 +591,7 @@ vl_api_sock_init_shm_t_handler (vl_api_sock_init_shm_t * mp)
   clib_file_t *cf;
   vl_api_shm_elem_config_t *config = 0;
   vl_shmem_hdr_t *shmem_hdr;
-  int rv;
+  int rv, tries = 1000;
 
   regp = vl_api_client_index_to_registration (mp->client_index);
   if (regp == 0)
@@ -671,6 +671,22 @@ reply:
 
   /* Send the magic "here's your sign (aka fd)" socket message */
   cf = vl_api_registration_file (regp);
+
+  /* Wait for reply to be consumed before sending the fd */
+  while (tries-- > 0)
+    {
+      int bytes;
+      rv = ioctl (cf->file_descriptor, TIOCOUTQ, &bytes);
+      if (rv < 0)
+       {
+         clib_unix_warning ("ioctl returned");
+         break;
+       }
+      if (bytes == 0)
+       break;
+      usleep (1e3);
+    }
+
   vl_sock_api_send_fd_msg (cf->file_descriptor, &memfd->fd, 1);
 }