Browse Source

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.
jp9000 8 years ago
parent
commit
b8bb60c83b
2 changed files with 15 additions and 2 deletions
  1. 13 2
      libobs/callback/signal.c
  2. 2 0
      libobs/callback/signal.h

+ 13 - 2
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--) {

+ 2 - 0
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);