summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Barach <dbarach@cisco.com>2018-12-27 13:57:41 -0500
committerFlorin Coras <florin.coras@gmail.com>2018-12-31 17:39:33 +0000
commit22af447454cf097ac4fc59f9072d805c371ab803 (patch)
tree6e32a5ca5dc37d082e91d2e34eb09dd7fca5a18a
parentc879c149d66d556b9b8183374c601004cecbf982 (diff)
binary api clients: wait for vpp to start
Change-Id: I740a7423327b724e88fdfa35d90cb1285e9f9746 Signed-off-by: Dave Barach <dbarach@cisco.com>
-rw-r--r--src/vlibmemory/memory_shared.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/vlibmemory/memory_shared.c b/src/vlibmemory/memory_shared.c
index d6b2b9887d0..1ccd563639f 100644
--- a/src/vlibmemory/memory_shared.c
+++ b/src/vlibmemory/memory_shared.c
@@ -532,6 +532,35 @@ vl_map_shmem (const char *region_name, int is_vlib)
if (is_vlib == 0)
{
+ int tfd;
+ u8 *api_name;
+ /*
+ * Clients wait for vpp to set up the root / API regioins
+ */
+ if (am->root_path)
+ api_name = format (0, "/dev/shm/%s-%s%c", am->root_path,
+ region_name + 1, 0);
+ else
+ api_name = format (0, "/dev/shm%s%c", region_name, 0);
+
+ /* Wait up to 100 seconds... */
+ for (i = 0; i < 10000; i++)
+ {
+ ts.tv_sec = 0;
+ ts.tv_nsec = 10000 * 1000; /* 10 ms */
+ while (nanosleep (&ts, &tsrem) < 0)
+ ts = tsrem;
+ tfd = open ((char *) api_name, O_RDWR);
+ if (tfd > 0)
+ break;
+ }
+ vec_free (api_name);
+ if (tfd < 0)
+ {
+ clib_warning ("region init fail");
+ return -2;
+ }
+ close (tfd);
rv = svm_region_init_chroot (am->root_path);
if (rv)
return rv;