From 684fb6e930a278385993504ba28c497d56bcb05e Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Mon, 9 Dec 2019 16:42:50 -0800 Subject: api: pass api and client main to rx thread Type: fix Change-Id: Ib8313e87a89c80045edd897924917a88b98d1937 Signed-off-by: Florin Coras --- src/vlibapi/api_common.h | 6 ++++++ src/vlibmemory/memory_client.c | 23 ++++++++++++++++++++++- src/vlibmemory/memory_client.h | 6 ++++++ 3 files changed, 34 insertions(+), 1 deletion(-) (limited to 'src') 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_ */ /* -- cgit 1.2.3-korg