diff options
| author | Louis Scalbert <louis.scalbert@6wind.com> | 2024-02-02 10:25:05 +0100 | 
|---|---|---|
| committer | Louis Scalbert <louis.scalbert@6wind.com> | 2024-02-02 10:25:05 +0100 | 
| commit | 73f72c52668cb402913ac694d91c25ee48cb174a (patch) | |
| tree | ce756c2ede8bbaf125a2d14076ca7a6716bbc1bc /lib/frr_pthread.c | |
| parent | a4f222292ba26dd536da6004772341738b1e9be4 (diff) | |
lib: add ability to log from external pthread
External libraries can re-enter the FRR code through a hook function. A
crash occurs when logging from this hook function if the library has
initiated a new pthread, as the FRR RCU context is not initialized for
this thread.
Add frr_pthread_non_controlled_startup() function to initialize a valid
RCU context within a FRR pthread context, originating from an external
pthread.
Signed-off-by: Louis Scalbert <louis.scalbert@6wind.com>
Diffstat (limited to 'lib/frr_pthread.c')
| -rw-r--r-- | lib/frr_pthread.c | 31 | 
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/frr_pthread.c b/lib/frr_pthread.c index 761969266a..f7e57136d6 100644 --- a/lib/frr_pthread.c +++ b/lib/frr_pthread.c @@ -220,6 +220,37 @@ void frr_pthread_stop_all(void)  	}  } +static void *frr_pthread_attr_non_controlled_start(void *arg) +{ +	struct frr_pthread *fpt = arg; + +	fpt->running = true; + +	return NULL; +} + +/* Create a FRR pthread context from a non FRR pthread initialized from an + * external library in order to allow logging */ +int frr_pthread_non_controlled_startup(pthread_t thread, const char *name, +				       const char *os_name) +{ +	struct frr_pthread_attr attr = { +		.start = frr_pthread_attr_non_controlled_start, +		.stop = frr_pthread_attr_default.stop, +	}; +	struct frr_pthread *fpt; + +	fpt = frr_pthread_new(&attr, name, os_name); +	if (!fpt) +		return -1; + +	fpt->thread = thread; +	fpt->rcu_thread = rcu_thread_new(NULL); +	frr_pthread_inner(fpt); + +	return 0; +} +  /*   * ----------------------------------------------------------------------------   * Default Event Loop  | 
