diff options
author | Nathan Skrzypczak <nathan.skrzypczak@gmail.com> | 2019-08-01 18:14:06 +0200 |
---|---|---|
committer | Florin Coras <florin.coras@gmail.com> | 2019-08-02 16:49:01 +0000 |
commit | d516ca42d3fcbdc5da9877ab07298f8bb891bff3 (patch) | |
tree | e351bfa07a58042552e9424776b022d7fae25aed /src/vppinfra | |
parent | edfe0eea7a938e650074fcb82a971187a7beb12e (diff) |
vppinfra: Expose function setting __os_thread_index
Type: feature
This is needed when creating pthreads in client applications,
they need a way to set __os_thread_index per thread
that does not conflict with the binary API thread index.
If __os_thread_index is left to 0 in two client pthreads and
they call vl_msg_api_alloc and vec_resize at the same time
it can fail due to them sharing (and push/poping) the same
clib_per_cpu_mheaps slot.
Change-Id: I85d4248a39b641a4d3ad5a1c1bd6e0db5875fab6
Signed-off-by: Nathan Skrzypczak <nathan.skrzypczak@gmail.com>
Diffstat (limited to 'src/vppinfra')
-rw-r--r-- | src/vppinfra/mem.h | 21 | ||||
-rw-r--r-- | src/vppinfra/os.h | 6 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/vppinfra/mem.h b/src/vppinfra/mem.h index e31ec82e7c5..f2930a11253 100644 --- a/src/vppinfra/mem.h +++ b/src/vppinfra/mem.h @@ -60,6 +60,27 @@ /* Per CPU heaps. */ extern void *clib_per_cpu_mheaps[CLIB_MAX_MHEAPS]; +always_inline void +clib_mem_set_thread_index (void) +{ + /* + * Find an unused slot in the per-cpu-mheaps array, + * and grab it for this thread. We need to be able to + * push/pop the thread heap without affecting other thread(s). + */ + int i; + if (__os_thread_index != 0) + return; + for (i = 0; i < ARRAY_LEN (clib_per_cpu_mheaps); i++) + if (clib_atomic_bool_cmp_and_swap (&clib_per_cpu_mheaps[i], + 0, clib_per_cpu_mheaps[0])) + { + os_set_thread_index (i); + break; + } + ASSERT (__os_thread_index > 0); +} + always_inline void * clib_mem_get_per_cpu_heap (void) { diff --git a/src/vppinfra/os.h b/src/vppinfra/os.h index 3ec214e29b1..50a4ad97c93 100644 --- a/src/vppinfra/os.h +++ b/src/vppinfra/os.h @@ -64,6 +64,12 @@ os_get_thread_index (void) return __os_thread_index; } +static_always_inline void +os_set_thread_index (uword thread_index) +{ + __os_thread_index = thread_index; +} + static_always_inline uword os_get_cpu_number (void) __attribute__ ((deprecated)); |