aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2019-12-09 16:42:50 -0800
committerDave Barach <openvpp@barachs.net>2019-12-10 12:28:47 +0000
commit684fb6e930a278385993504ba28c497d56bcb05e (patch)
treefd21decd2967baf69d5a3fcf6377599ed1ef0429
parent0fa66d618e7d839782a896f75bc8b0337cc2a2b8 (diff)
api: pass api and client main to rx thread
Type: fix Change-Id: Ib8313e87a89c80045edd897924917a88b98d1937 Signed-off-by: Florin Coras <fcoras@cisco.com>
-rw-r--r--src/vlibapi/api_common.h6
-rw-r--r--src/vlibmemory/memory_client.c23
-rw-r--r--src/vlibmemory/memory_client.h6
3 files changed, 34 insertions, 1 deletions
diff --git a/src/vlibapi/api_common.h b/src/vlibapi/api_common.h
index c3ef57338bc..4d401046174 100644
--- a/src/vlibapi/api_common.h
+++ b/src/vlibapi/api_common.h
@@ -378,6 +378,12 @@ vlibapi_get_main (void)
return my_api_main;
}
+always_inline void
+vlibapi_set_main (api_main_t * am)
+{
+ my_api_main = am;
+}
+
#endif /* included_api_common_h */
/*
diff --git a/src/vlibmemory/memory_client.c b/src/vlibmemory/memory_client.c
index f78288ed84b..b5090636a7f 100644
--- a/src/vlibmemory/memory_client.c
+++ b/src/vlibmemory/memory_client.c
@@ -48,12 +48,24 @@
memory_client_main_t memory_client_main;
__thread memory_client_main_t *my_memory_client_main = &memory_client_main;
+typedef struct rx_thread_fn_arg
+{
+ api_main_t *am;
+ memory_client_main_t *mm;
+} rx_thread_fn_arg_t;
+
static void *
rx_thread_fn (void *arg)
{
+ rx_thread_fn_arg_t *a = (rx_thread_fn_arg_t *) arg;
+ memory_client_main_t *mm;
svm_queue_t *q;
- memory_client_main_t *mm = vlibapi_get_memory_client_main ();
+ vlibapi_set_main (a->am);
+ vlibapi_set_memory_client_main (a->mm);
+ clib_mem_free (a);
+
+ mm = vlibapi_get_memory_client_main ();
q = vlibapi_get_main ()->vl_input_queue;
/* So we can make the rx thread terminate cleanly */
@@ -419,6 +431,15 @@ connect_to_vlib_internal (const char *svm_name,
if (thread_fn)
{
+ if (thread_fn == rx_thread_fn)
+ {
+ rx_thread_fn_arg_t *arg;
+ arg = clib_mem_alloc (sizeof (*arg));
+ arg->am = vlibapi_get_main ();
+ arg->mm = vlibapi_get_memory_client_main ();
+ thread_fn_arg = (void *) arg;
+ }
+
rv = pthread_create (&mm->rx_thread_handle,
NULL /*attr */ , thread_fn, thread_fn_arg);
if (rv)
diff --git a/src/vlibmemory/memory_client.h b/src/vlibmemory/memory_client.h
index 4d79478b80e..a0168693a4b 100644
--- a/src/vlibmemory/memory_client.h
+++ b/src/vlibmemory/memory_client.h
@@ -70,6 +70,12 @@ vlibapi_get_memory_client_main (void)
return my_memory_client_main;
}
+always_inline void
+vlibapi_set_memory_client_main (memory_client_main_t * mm)
+{
+ my_memory_client_main = mm;
+}
+
#endif /* SRC_VLIBMEMORY_MEMORY_CLIENT_H_ */
/*