diff options
Diffstat (limited to 'main/manager.c')
-rw-r--r-- | main/manager.c | 13 |
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); |