aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/manager.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/main/manager.c b/main/manager.c
index 4fadb744c..10a00a795 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -175,6 +175,7 @@ struct mansession {
struct eventqent *eventq;
/* Timeout for ast_carefulwrite() */
int writetimeout;
+ int pending_event; /*!< Pending events indicator in case when waiting_thread is NULL */
AST_LIST_ENTRY(mansession) list;
};
@@ -2202,6 +2203,11 @@ static int get_input(struct mansession *s, char *output)
fds[0].events = POLLIN;
do {
ast_mutex_lock(&s->__lock);
+ if (s->pending_event) {
+ s->pending_event = 0;
+ ast_mutex_unlock(&s->__lock);
+ return 0;
+ }
s->waiting_thread = pthread_self();
ast_mutex_unlock(&s->__lock);
@@ -2463,6 +2469,13 @@ int manager_event(int category, const char *event, const char *fmt, ...)
ast_mutex_lock(&s->__lock);
if (s->waiting_thread != AST_PTHREADT_NULL)
pthread_kill(s->waiting_thread, SIGURG);
+ else
+ /* We have an event to process, but the mansession is
+ * not waiting for it. We still need to indicate that there
+ * is an event waiting so that get_input processes the pending
+ * event instead of polling.
+ */
+ s->pending_event = 1;
ast_mutex_unlock(&s->__lock);
}
AST_LIST_UNLOCK(&sessions);