mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-30 18:40:46 +00:00
Merged revisions 292595 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r292595 | dvossel | 2010-10-21 11:14:33 -0500 (Thu, 21 Oct 2010) | 14 lines Fixes recursive lock problem in manager.c It is possible for a AMI session to freeze because of invalid use of recursive locks during the EVENT processing. This patch removes the unnecessary locks. (closes issue #18167) Reported by: sustav Patches: manager_locking_v1.diff uploaded by dvossel (license 671) Tested by: sustav ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@292597 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -2828,7 +2828,6 @@ static int action_waitevent(struct mansession *s, const struct message *m)
|
|||||||
if (s->session->waiting_thread == pthread_self()) {
|
if (s->session->waiting_thread == pthread_self()) {
|
||||||
struct eventqent *eqe = s->session->last_ev;
|
struct eventqent *eqe = s->session->last_ev;
|
||||||
astman_send_response(s, m, "Success", "Waiting for Event completed.");
|
astman_send_response(s, m, "Success", "Waiting for Event completed.");
|
||||||
AST_RWLIST_RDLOCK(&all_events);
|
|
||||||
while ((eqe = advance_event(eqe))) {
|
while ((eqe = advance_event(eqe))) {
|
||||||
if (((s->session->readperm & eqe->category) == eqe->category) &&
|
if (((s->session->readperm & eqe->category) == eqe->category) &&
|
||||||
((s->session->send_events & eqe->category) == eqe->category)) {
|
((s->session->send_events & eqe->category) == eqe->category)) {
|
||||||
@@ -2836,7 +2835,6 @@ static int action_waitevent(struct mansession *s, const struct message *m)
|
|||||||
}
|
}
|
||||||
s->session->last_ev = eqe;
|
s->session->last_ev = eqe;
|
||||||
}
|
}
|
||||||
AST_RWLIST_UNLOCK(&all_events);
|
|
||||||
astman_append(s,
|
astman_append(s,
|
||||||
"Event: WaitEventComplete\r\n"
|
"Event: WaitEventComplete\r\n"
|
||||||
"%s"
|
"%s"
|
||||||
@@ -4101,7 +4099,7 @@ static int process_events(struct mansession *s)
|
|||||||
ao2_lock(s->session);
|
ao2_lock(s->session);
|
||||||
if (s->session->f != NULL) {
|
if (s->session->f != NULL) {
|
||||||
struct eventqent *eqe = s->session->last_ev;
|
struct eventqent *eqe = s->session->last_ev;
|
||||||
AST_RWLIST_RDLOCK(&all_events);
|
|
||||||
while ((eqe = advance_event(eqe))) {
|
while ((eqe = advance_event(eqe))) {
|
||||||
if (!ret && s->session->authenticated &&
|
if (!ret && s->session->authenticated &&
|
||||||
(s->session->readperm & eqe->category) == eqe->category &&
|
(s->session->readperm & eqe->category) == eqe->category &&
|
||||||
@@ -4113,7 +4111,6 @@ static int process_events(struct mansession *s)
|
|||||||
}
|
}
|
||||||
s->session->last_ev = eqe;
|
s->session->last_ev = eqe;
|
||||||
}
|
}
|
||||||
AST_RWLIST_UNLOCK(&all_events);
|
|
||||||
}
|
}
|
||||||
ao2_unlock(s->session);
|
ao2_unlock(s->session);
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user