summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2011-12-27 20:55:15 +0000
committerMatthew Jordan <mjordan@digium.com>2011-12-27 20:55:15 +0000
commitd9651f2be9e5f19d5a5408eb818df7202af3bf1d (patch)
tree4a98128d7a9e37fc509a58eb531a0d3217a1e8b4 /res
parent8017be6fa9e1c9e3fa0a98523c6e82d5eb239cdd (diff)
Fix timing source dependency issues with MOH
Prior to this patch, res_musiconhold existed at the same module priority level as the timing sources that it depends on. This would cause a problem when music on hold was reloaded, as the timing source could be changed after res_musiconhold was processed. This patch adds a new module priority level, AST_MODPRI_TIMING, that the various timing modules are now loaded at. This now occurs before loading other resource modules, such that the timing source is guaranteed to be set prior to resolving the timing source dependencies. (closes issue ASTERISK-17474) Reporter: Luke H Tested by: Luke H, Vladimir Mikhelson, zzsurf, Wes Van Tlghem, elguero, Thomas Arimont Patches: asterisk-17474-dahdi_timing-infinite-wait-fix_v3_branch-1.8.diff uploaded by elguero (License #5026) asterisk-17474-dahdi_timing-infinite-wait-fix_v3_branch-10.diff uploaded by elguero (License #5026) asterisk-17474-dahdi_timing-infinite-wait-fix_v3.diff uploaded by elguero (License #5026) Review: https://reviewboard.asterisk.org/r/1578/ ........ Merged revisions 349194 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 349195 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@349196 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res')
-rw-r--r--res/res_musiconhold.c21
-rw-r--r--res/res_timing_dahdi.c2
-rw-r--r--res/res_timing_pthread.c2
-rw-r--r--res/res_timing_timerfd.c2
4 files changed, 17 insertions, 10 deletions
diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c
index ffe051eaa..21a2c97e8 100644
--- a/res/res_musiconhold.c
+++ b/res/res_musiconhold.c
@@ -671,7 +671,7 @@ static void *monmp3thread(void *data)
}
}
if (class->timer) {
- struct pollfd pfd = { .fd = ast_timer_fd(class->timer), .events = POLLIN, };
+ struct pollfd pfd = { .fd = ast_timer_fd(class->timer), .events = POLLIN | POLLPRI, };
#ifdef SOLARIS
thr_yield();
@@ -681,7 +681,7 @@ static void *monmp3thread(void *data)
ast_timer_ack(class->timer, 1);
res = 320;
} else {
- ast_log(LOG_ERROR, "poll() failed: %s\n", strerror(errno));
+ ast_log(LOG_WARNING, "poll() failed: %s\n", strerror(errno));
res = 0;
}
pthread_testcancel();
@@ -1218,6 +1218,7 @@ static int init_app_class(struct mohclass *class)
if (!(class->timer = ast_timer_open())) {
ast_log(LOG_WARNING, "Unable to create timer: %s\n", strerror(errno));
+ return -1;
}
if (class->timer && ast_timer_set_rate(class->timer, 25)) {
ast_log(LOG_WARNING, "Unable to set 40ms frame rate: %s\n", strerror(errno));
@@ -1245,7 +1246,9 @@ static int _moh_register(struct mohclass *moh, int reload, int unref, const char
{
struct mohclass *mohclass = NULL;
- if ((mohclass = _get_mohbyname(moh->name, 0, MOH_NOTDELETED, file, line, funcname)) && !moh_diff(mohclass, moh)) {
+ mohclass = _get_mohbyname(moh->name, 0, MOH_NOTDELETED, file, line, funcname);
+
+ if (mohclass && !moh_diff(mohclass, moh)) {
ast_log(LOG_WARNING, "Music on Hold class '%s' already exists\n", moh->name);
mohclass = mohclass_unref(mohclass, "unreffing mohclass we just found by name");
if (unref) {
@@ -1584,6 +1587,12 @@ static void moh_class_destructor(void *obj)
ast_debug(1, "Destroying MOH class '%s'\n", class->name);
+ ao2_lock(class);
+ while ((member = AST_LIST_REMOVE_HEAD(&class->members, list))) {
+ free(member);
+ }
+ ao2_unlock(class);
+
/* Kill the thread first, so it cannot restart the child process while the
* class is being destroyed */
if (class->thread != AST_PTHREADT_NULL && class->thread != 0) {
@@ -1635,10 +1644,7 @@ static void moh_class_destructor(void *obj)
ast_debug(1, "mpg123 pid %d and child died after %d bytes read\n", pid, tbytes);
close(class->srcfd);
- }
-
- while ((member = AST_LIST_REMOVE_HEAD(&class->members, list))) {
- free(member);
+ class->srcfd = -1;
}
if (class->filearray) {
@@ -1659,6 +1665,7 @@ static void moh_class_destructor(void *obj)
if (tid > 0) {
pthread_join(tid, NULL);
}
+
}
static int moh_class_mark(void *obj, void *arg, int flags)
diff --git a/res/res_timing_dahdi.c b/res/res_timing_dahdi.c
index 61dda6a44..7aafe7966 100644
--- a/res/res_timing_dahdi.c
+++ b/res/res_timing_dahdi.c
@@ -203,5 +203,5 @@ static int unload_module(void)
AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "DAHDI Timing Interface",
.load = load_module,
.unload = unload_module,
- .load_pri = AST_MODPRI_CHANNEL_DEPEND,
+ .load_pri = AST_MODPRI_TIMING,
);
diff --git a/res/res_timing_pthread.c b/res/res_timing_pthread.c
index e89ded2d6..654f1d082 100644
--- a/res/res_timing_pthread.c
+++ b/res/res_timing_pthread.c
@@ -525,5 +525,5 @@ static int unload_module(void)
AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "pthread Timing Interface",
.load = load_module,
.unload = unload_module,
- .load_pri = AST_MODPRI_CHANNEL_DEPEND,
+ .load_pri = AST_MODPRI_TIMING,
);
diff --git a/res/res_timing_timerfd.c b/res/res_timing_timerfd.c
index 81331a99f..944687459 100644
--- a/res/res_timing_timerfd.c
+++ b/res/res_timing_timerfd.c
@@ -337,5 +337,5 @@ static int unload_module(void)
AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Timerfd Timing Interface",
.load = load_module,
.unload = unload_module,
- .load_pri = AST_MODPRI_CHANNEL_DEPEND,
+ .load_pri = AST_MODPRI_TIMING,
);