From b8bb60c83bfcfb15c445ba9bfccda104050167ca Mon Sep 17 00:00:00 2001 From: jp9000 Date: Mon, 25 Dec 2017 12:05:54 -0800 Subject: [PATCH] libobs/callback: Add signal_handler_remove_current func Convenience function that allows removing the current signal handler callback within the callback without having to use signal_handler_disconnect with all of its required parameters. --- libobs/callback/signal.c | 15 +++++++++++++-- libobs/callback/signal.h | 2 ++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/libobs/callback/signal.c b/libobs/callback/signal.c index 7cc90740b..025e4430f 100644 --- a/libobs/callback/signal.c +++ b/libobs/callback/signal.c @@ -236,10 +236,18 @@ void signal_handler_disconnect(signal_handler_t *handler, const char *signal, else da_erase(sig->callbacks, idx); } - + pthread_mutex_unlock(&sig->mutex); } +static THREAD_LOCAL struct signal_callback *current_signal_cb = NULL; + +void signal_handler_remove_current(void) +{ + if (current_signal_cb) + current_signal_cb->remove = true; +} + void signal_handler_signal(signal_handler_t *handler, const char *signal, calldata_t *params) { @@ -253,8 +261,11 @@ void signal_handler_signal(signal_handler_t *handler, const char *signal, for (size_t i = 0; i < sig->callbacks.num; i++) { struct signal_callback *cb = sig->callbacks.array+i; - if (!cb->remove) + if (!cb->remove) { + current_signal_cb = cb; cb->callback(cb->data, params); + current_signal_cb = NULL; + } } for (size_t i = sig->callbacks.num; i > 0; i--) { diff --git a/libobs/callback/signal.h b/libobs/callback/signal.h index be9138b6b..f70beff7b 100644 --- a/libobs/callback/signal.h +++ b/libobs/callback/signal.h @@ -60,6 +60,8 @@ EXPORT void signal_handler_connect(signal_handler_t *handler, EXPORT void signal_handler_disconnect(signal_handler_t *handler, const char *signal, signal_callback_t callback, void *data); +EXPORT void signal_handler_remove_current(void); + EXPORT void signal_handler_signal(signal_handler_t *handler, const char *signal, calldata_t *params);