diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h
index f766ff4ca1e90ce529ecce77c4778b0ba6d129f9..590815320aba7ccf060a410b43a2316ca023f396 100755
--- a/include/asterisk/utils.h
+++ b/include/asterisk/utils.h
@@ -136,6 +136,7 @@ extern int test_for_thread_safety(void);
 
 extern const char *ast_inet_ntoa(char *buf, int bufsiz, struct in_addr ia);
 extern int ast_utils_init(void);
+extern int ast_wait_for_input(int fd, int ms);
 
 /* The realloca lets us ast_restrdupa(), but you can't mix any other ast_strdup calls! */
 
diff --git a/res/res_musiconhold.c b/res/res_musiconhold.c
index f948e206f80bb17571af9841d9fd1d2cae12a4b5..7e386c795565620cb49b310e05e00a487e43f9f7 100755
--- a/res/res_musiconhold.c
+++ b/res/res_musiconhold.c
@@ -945,11 +945,11 @@ static void ast_moh_destroy(void)
 	while (moh) {
 		if (moh->pid) {
 			ast_log(LOG_DEBUG, "killing %d!\n", moh->pid);
-			stime = time(NULL) + 5;
+			stime = time(NULL) + 2;
 			pid = moh->pid;
 			moh->pid = 0;
 			kill(pid, SIGKILL);
-			while ((bytes = read(moh->srcfd, buff, 8192)) && time(NULL) < stime) {
+			while ((ast_wait_for_input(moh->srcfd, 100) > -1) && (bytes = read(moh->srcfd, buff, 8192)) && time(NULL) < stime) {
 				tbytes = tbytes + bytes;
 			}
 			ast_log(LOG_DEBUG, "mpg123 pid %d and child died after %d bytes read\n", pid, tbytes);
diff --git a/utils.c b/utils.c
index 3e9ddf67b3b1681f222242747f4ea4767914a169..ab71677f59891c0c21063b35428f502420b2b062 100755
--- a/utils.c
+++ b/utils.c
@@ -24,6 +24,7 @@
 #include <arpa/inet.h>
 #include <asterisk/lock.h>
 #include <asterisk/utils.h>
+#include <asterisk/io.h>
 #include <asterisk/logger.h>
 #include <asterisk/md5.h>
 
@@ -404,6 +405,15 @@ int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*st
 	return pthread_create(thread, attr, start_routine, data); /* We're in ast_pthread_create, so it's okay */
 }
 
+int ast_wait_for_input(int fd, int ms)
+{
+	struct pollfd pfd[1];
+	memset(pfd, 0, sizeof(pfd));
+	pfd[0].fd = fd;
+	pfd[0].events = POLLIN|POLLPRI;
+	return poll(pfd, 1, ms);
+}
+
 /* Case-insensitive substring matching */
 #ifndef LINUX
 static char *upper(const char *orig, char *buf, int bufsize)