summaryrefslogtreecommitdiff
path: root/channels/chan_misdn.c
diff options
context:
space:
mode:
authorChristian Richter <christian.richter@beronet.com>2006-06-06 09:40:41 +0000
committerChristian Richter <christian.richter@beronet.com>2006-06-06 09:40:41 +0000
commit24818d53b1c7f88bc877526e8765cd8a3991a275 (patch)
tree7ba787ae8b7a0b213c833de5ffc398275a21d132 /channels/chan_misdn.c
parent3d973a06864fa2ecfcc73080c7b9ea605835c4cb (diff)
added select before write to avoid deadlock on full buffer. added some defines for deadlock debugging. added code snippet for generating silence if we don't have data to write.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@32524 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_misdn.c')
-rw-r--r--channels/chan_misdn.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index aa1207ceb..4631fa5e6 100644
--- a/channels/chan_misdn.c
+++ b/channels/chan_misdn.c
@@ -2352,7 +2352,6 @@ static int tone_indicate( struct chan_list *cl, enum tone_e tone)
break;
case TONE_FILE:
break;
-
case TONE_NONE:
chan_misdn_log(3,cl->bc->port," --> None\n");
misdn_lib_tone_generator_stop(cl->bc);
@@ -3285,7 +3284,6 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
ast_queue_frame(ch->ast, &fr);
}
-
}
}
break;
@@ -3694,7 +3692,7 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
int (*generate)(struct ast_channel *chan, void *tmp, int datalen, int samples);
chan_misdn_log(9,bc->port,"TONE_GEN: len:%d\n");
-
+
if (!ast->generator) break;
tmp = ast->generatordata;
@@ -3702,13 +3700,13 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
generate = ast->generator->generate;
res = generate(ast, tmp, tone_len, tone_len);
ast->generatordata = tmp;
+
if (res) {
ast_log(LOG_WARNING, "Auto-deactivating generator\n");
ast_deactivate_generator(ast);
} else {
bc->tone_cnt=0;
}
-
}
break;
@@ -3728,10 +3726,35 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data)
ast_queue_frame(ch->ast,&frame);
} else {
- int ret=write(ch->pipe[1], bc->bframe, bc->bframe_len);
+ fd_set wrfs;
+ struct timeval tv;
+ tv.tv_sec=0;
+ tv.tv_usec=0;
+
+
+ FD_ZERO(&wrfs);
+ FD_SET(ch->pipe[1],&wrfs);
+
+ int t=select(FD_SETSIZE,NULL,&wrfs,NULL,&tv);
- if (ret<=0) {
- chan_misdn_log(1, bc->port, "Write returned <=0 (err=%s)\n",strerror(errno));
+ if (!t) {
+ chan_misdn_log(9, bc->port, "Select Timed out\n");
+ break;
+ }
+
+ if (t<0) {
+ chan_misdn_log(-1, bc->port, "Select Error (err=%s)\n",strerror(errno));
+ break;
+ }
+
+ if (FD_ISSET(ch->pipe[1],&wrfs)) {
+ int ret=write(ch->pipe[1], bc->bframe, bc->bframe_len);
+
+ if (ret<=0) {
+ chan_misdn_log(-1, bc->port, "Write returned <=0 (err=%s)\n",strerror(errno));
+ }
+ } else {
+ chan_misdn_log(1, bc->port, "Wripe Pipe full!\n");
}
}
}